118 lines
12 KiB
Markdown
118 lines
12 KiB
Markdown
# سناریو: رندر تایلهای حالت تاریک با استایل 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 موجود، یا ۳ برای حفظ وضع فعلی و اضافه کردن سرو جدید) را در مراحل بعدی پیاده کرد؛ در این مرحله تنها بررسی و سناریو انجام شده و تغییری در کد یا پیکربندی اعمال نشده است.
|
||
|
||
---
|
||
|
||
*آخرین بهروزرسانی: بر اساس بررسی مخزن و استایل در تاریخ ۲۰۲۵-۰۲-۲۵.*
|