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

118 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# سناریو: رندر تایل‌های حالت تاریک با استایل Dark Matter (OpenMapTiles)
این سند فقط **بررسی وضعیت فعلی** تایل‌سرور و **سناریوهای ممکن** برای سرو تایل‌های تاریک با استایل [openmaptiles/dark-matter-gl-style](https://github.com/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](https://github.com/maptiler/tileserver-gl) (یا معادل) روی همین سرور؛ یک منبع وکتور تایل OpenMapTiles (محلی یا ریموت) + فایل `style.json` Dark Matter (با اصلاح آدرس‌های sprite و glyphs در صورت نیاز). Tileserver GL با MapLibre تایل‌ها را به صورت رستری رندر و سرو می‌کند.
- **پیش‌نیازها:**
- در دسترس بودن **وکتور تایل OpenMapTiles** برای محدوده موردنظر (ایران/جهان). یا از سرویس خارجی (مثلاً MapTiler با API key) یا ساخت از OSM با [OpenMapTiles](https://github.com/openmaptiles/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](https://github.com/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 موجود، یا ۳ برای حفظ وضع فعلی و اضافه کردن سرو جدید) را در مراحل بعدی پیاده کرد؛ در این مرحله تنها بررسی و سناریو انجام شده و تغییری در کد یا پیکربندی اعمال نشده است.
---
*آخرین به‌روزرسانی: بر اساس بررسی مخزن و استایل در تاریخ ۲۰۲۵-۰۲-۲۵.*