api/docs/SCENARIO_DARK_MATTER_TILES.md
2026-03-17 12:30:28 +00:00

12 KiB
Raw Permalink Blame History

سناریو: رندر تایل‌های حالت تاریک با استایل 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.json Dark 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) با دیتابیس PostgreSQL gis و جداول OSM استاندارد؛ به‌اضافه API وکتور سفارشی با لایه‌های roads, buildings, points از همان دیتابیس.
  • استایل Dark Matter: مخصوص وکتور تایل OpenMapTiles و رندر با Mapbox GL / MapLibre؛ با منبع داده، sprite و glyphs قابل تنظیم در style.json.
  • برای رندر تایل‌های حالت تاریک با این استایل می‌توان یکی از سناریوهای بالا (ترجیحاً ۱ یا ۲ با منبع OMT موجود، یا ۳ برای حفظ وضع فعلی و اضافه کردن سرو جدید) را در مراحل بعدی پیاده کرد؛ در این مرحله تنها بررسی و سناریو انجام شده و تغییری در کد یا پیکربندی اعمال نشده است.

آخرین به‌روزرسانی: بر اساس بررسی مخزن و استایل در تاریخ ۲۰۲۵-۰۲-۲۵.