12 KiB
سناریو: رندر تایلهای حالت تاریک با استایل Dark Matter (OpenMapTiles)
این سند فقط بررسی وضعیت فعلی تایلسرور و سناریوهای ممکن برای سرو تایلهای تاریک با استایل openmaptiles/dark-matter-gl-style است. در این مرحله تغییری در کد یا پیکربندی اعمال نشده است.
۱. وضعیت فعلی تایلسرور در این سرور
۱.۱ تایلهای رستری (renderd / mod_tile)
-
مسیرهای سرو تایل در فرانتاند:
/hot/{z}/{x}/{y}.png— لایه روشن (احتمالاً استایل HOT/OSM)/ret/{z}/{x}/{y}.png— همان با وضوح بالاتر (احتمالاً ۵۱۲px / رتینا)/dark/{z}/{x}/{y}.png— لایه تاریک/dark-retina/{z}/{x}/{y}.png— لایه تاریک رتینا
-
نحوه سرو در پروژه:
- در
.htaccessفقط قانونhot/...@2x.pngبهtile_handler.phpیا بهretریدایرکت میشود؛ مسیرهایhot/,ret/,dark/خودشان در این فایل ریدایرکت به Symfony نمیشوند، پس احتمالاً توسط Apache (مثلاً با mod_tile/renderd) در سطح سرور سرو میشوند و در این ریپو پیکربندی مستقیمی برای آنها نیست. public/tile_handler.phpفقط درخواستهایhot/...@2x.pngرا هندل میکند و برای رتینا به مسیرhttp://localhost/ret/...و به کش/var/cache/renderd/tiles/retina/وابسته است.
- در
-
دیتابیس و کاربر رندر:
- در چند نقطه (مثلاً
VectorTileController،MatrixRoutingRepository،OsmSearchRepository) به دیتابیس PostgreSQL با نامgisو کاربر_renderdوصل میشود؛ یعنی روی همین سرور renderd (و احتمالاً استایل کارتو مبتنی بر OSM) برای رندر تایل استفاده میشود. - جداول مورد استفاده در API وکتور:
planet_osm_point،planet_osm_line،planet_osm_polygon— یعنی اسکیما استاندارد OSM (اسکیما کارتو) نه اسکیمای OpenMapTiles.
- در چند نقطه (مثلاً
خلاصه: تایلهای رستری فعلی (از جمله /dark/) بهاحتمال زیاد با renderd + mod_tile + یک استایل کارتو (مثلاً تم تاریک osm-carto یا مشابه) رندر میشوند و از همان دیتابیس gis و جداول OSM استفاده میکنند.
۱.۲ API وکتور تایل (Symfony)
- مسیر:
GET /api/vector/{layer}/{z}/{x}/{y}.mvt(یا.pbf) باlayerیکی از:roads,buildings,points. - منبع داده: همان دیتابیس
gisو جداولplanet_osm_*؛ خروجی MVT با لایههایroads,buildings,pointsو فیلدهایی مثلname,highway,building,amenity, ... - محدودیت: فقط تایلهایی که با محدوده ایران تلاقی دارند سرو میشوند (با
IranTileFilter). - این API اسکیمای OpenMapTiles را پیادهسازی نمیکند؛ یعنی لایهها و فیلدهای مورد انتظار استایل Dark Matter (مثل
water,landcover,landuse,transportation,boundary,place, …) در این وکتور تایلها وجود ندارد.
۱.۳ سایر سروهای تایل
- Google Earth: پروکسی/کش از طریق
GoogleEarthTileControllerبا مسیر/api/google-earth/{layer}/{z}/{x}/{y}.{ext}. - Bing: پروکسی/کش از طریق
BingTileControllerبا مسیر/api/bing/{layer}/{z}/{x}/{y}.{ext}.
۲. استایل Dark Matter (openmaptiles/dark-matter-gl-style)
-
نوع: یک Mapbox GL Style (نسخه ۸) برای نقشه پایه با تم تاریک، مناسب ویژوالیزیشن داده.
-
مخزن:
https://github.com/openmaptiles/dark-matter-gl-style
فایل اصلی:style.json؛ پوشهiconsبرای اسپرایت. -
منبع داده در استایل پیشفرض:
- در
sourcesاز وکتور تایل OpenMapTiles استفاده میکند؛ در نسخه نمونه از MapTiler:
https://api.maptiler.com/tiles/v3-openmaptiles/tiles.json?key={key} - Sprite:
https://openmaptiles.github.io/dark-matter-gl-style/sprite - Glyphs:
https://api.maptiler.com/fonts/{fontstack}/{range}.pbf?key={key}
- در
-
لایههای استایل (خلاصه):
پسزمینه تیره، آب، landcover (یخ، جنگل، پارک)، landuse (مسکونی)، ساختمان، aeroway، جادهها و راهآهن، boundary، place (شهر، روستا، کشور و …). همه به source-layerهای اسکیمای OpenMapTiles وابستهاند (مثلاًwater,landcover,landuse,building,transportation,boundary,place).
نکته مهم: این استایل برای وکتور تایل با اسکیمای OpenMapTiles طراحی شده، نه برای جداول خام OSM (planet_osm_*) یا لایههای ساده roads/buildings/points.
۳. فاصله بین وضع فعلی و استایل Dark Matter
| موضوع | وضع فعلی سرور | مورد نیاز Dark Matter |
|---|---|---|
| نوع تایل | رستری (PNG) از renderd برای /dark/؛ وکتور MVT سفارشی (roads, buildings, points) از Symfony |
وکتور تایل با اسکیمای OpenMapTiles (لایهها و فیلدهای مشخص) |
| رندر | سرور (mapnik/renderd) با استایل کارتو | رندر با MapLibre/Mapbox GL با یک فایل استایل GL (مثلاً همان style.json) |
| داده | PostGIS با planet_osm_* |
یا وکتور تایل OMT از سرویس خارجی (مثلاً MapTiler) یا وکتور تایل OMT تولیدشده از همین سرور |
یعنی برای «رندر تایلهای حالت تاریک با همین استایل Dark Matter» یکی از این دو جهت کلی لازم است:
- الف) سرو وکتور تایل OpenMapTiles (خود سرور یا جای دیگر) + استفاده از همان استایل در سمت کلاینت (MapLibre GL) یا در یک تایلسرور GL.
- ب) تولید تایل رستری با ظاهر Dark Matter (مثلاً با Tileserver GL یا مشابه) و سرو آن از همین دامنه؛ در این حالت هم به وکتور OMT و هم به استایل و فونت/اسپرایت نیاز است.
۴. سناریوهای ممکن (بدون اعمال تغییر در این مرحله)
سناریو ۱: تایل رستری با Tileserver GL و استایل Dark Matter
- ایده: نصب Tileserver GL (یا معادل) روی همین سرور؛ یک منبع وکتور تایل OpenMapTiles (محلی یا ریموت) + فایل
style.jsonDark Matter (با اصلاح آدرسهای sprite و glyphs در صورت نیاز). Tileserver GL با MapLibre تایلها را به صورت رستری رندر و سرو میکند. - پیشنیازها:
- در دسترس بودن وکتور تایل OpenMapTiles برای محدوده موردنظر (ایران/جهان). یا از سرویس خارجی (مثلاً MapTiler با API key) یا ساخت از OSM با OpenMapTiles و سرو از همین سرور.
- کپی و در صورت نیاز اصلاح
style.json(جایگزینی منبع تایل، sprite و glyphs با آدرسهای محلی یا بدون کلید اگر همه محلی باشد).
- خروجی: یک endpoint رستری (مثلاً
https://memaps.ir/dark-gl/{z}/{x}/{y}.png) که ظاهر آن مطابق Dark Matter است. در فرانتاند میتوان همان لایه را مثل لایههای فعلیdark/dark_retinaاضافه کرد (بدون تغییر در کد در این مرحله، فقط سناریو). - ملاحظات: مصرف CPU/حافظه برای رندر رستری؛ ترجیحاً کش و محدوده زوم/ناحیه محدود برای بار اولیه کمتر.
سناریو ۲: وکتور تایل OpenMapTiles + استایل Dark Matter در کلاینت (MapLibre GL)
- ایده: سرو وکتور تایل با اسکیمای OpenMapTiles از همین سرور (یا از جای دیگر)، و بارگذاری استایل Dark Matter در MapLibre GL JS در مرورگر؛ نقشه پایه تاریک کاملاً در سمت کلاینت رندر میشود.
- پیشنیازها:
- در دسترس بودن وکتور OMT (خود سرور یا سرویس دیگر).
- میزبانی یا در دسترس بودن
style.jsonو آدرسهای sprite و glyphs (محلی یا CDN). - در فرانتاند استفاده از MapLibre GL بهجای فقط Leaflet برای این لایه پایه؛ یا ترکیب Leaflet با یک لایه که از MapLibre برای یک لایه پایه استفاده میکند.
- مزیت: بدون رندر رستری روی سرور؛ انعطاف برای تعویض استایل یا تم.
- تغییر در معماری: نیاز به MapLibre و احتمالاً یک صفحه/حالت نمایش جدا برای نقشه GL یا ادغام با نقشه فعلی.
سناریو ۳: حفظ لایه /dark/ فعلی (renderd) و استفاده از Dark Matter فقط برای یک سرو جدید
- ایده: لایه فعلی
/dark/همانطور که هست (renderd + استایل کارتو تاریک) باقی بماند؛ در صورت تمایل، سرو جداگانهای برای «نقشه تاریک با استایل Dark Matter» اضافه شود (مثلاً با سناریو ۱ یا ۲). - نتیجه: دو نوع نقشه تاریک: یکی با ظاهر فعلی، یکی با ظاهر دقیق Dark Matter؛ بدون جایگزینی اجباری زیرساخت فعلی.
سناریو ۴: تولید وکتور تایل OpenMapTiles از دیتابیس فعلی (بلندمدت)
- ایده: با استفاده از OpenMapTiles یا ابزارهای مشابه، از همان دیتابیس
gis(و در صورت نیاز import مجدد OSM) وکتور تایل با اسکیمای OpenMapTiles تولید و روی همین سرور سرو شود؛ سپس با همان استایل Dark Matter (سناریو ۱ یا ۲) استفاده شود. - چالش: اسکیمای OMT با اسکیمای خام OSM متفاوت است؛ معمولاً به یک پایتون/اسکریپت و مراحل ETL و ساخت تایلها نیاز است؛ زمان و منابع بیشتر.
۵. جمعبندی بررسی
- تایلسرور فعلی: تایلهای رستری از renderd/mod_tile (مسیرهای
hot,ret,dark, و در فرانتdark_retina) با دیتابیس PostgreSQLgisو جداول OSM استاندارد؛ بهاضافه API وکتور سفارشی با لایههای roads, buildings, points از همان دیتابیس. - استایل Dark Matter: مخصوص وکتور تایل OpenMapTiles و رندر با Mapbox GL / MapLibre؛ با منبع داده، sprite و glyphs قابل تنظیم در
style.json. - برای رندر تایلهای حالت تاریک با این استایل میتوان یکی از سناریوهای بالا (ترجیحاً ۱ یا ۲ با منبع OMT موجود، یا ۳ برای حفظ وضع فعلی و اضافه کردن سرو جدید) را در مراحل بعدی پیاده کرد؛ در این مرحله تنها بررسی و سناریو انجام شده و تغییری در کد یا پیکربندی اعمال نشده است.
آخرین بهروزرسانی: بر اساس بررسی مخزن و استایل در تاریخ ۲۰۲۵-۰۲-۲۵.