راهنمای API نقشه وکتوری (MVT) سرویس می‌مپس

تایل‌های وکتوری Mapbox Vector Tiles با داده OpenStreetMap و محدودیت جغرافیایی ایران

تایل‌های وکتوری (MVT) از می‌مپس

API نقشه وکتوری می‌مپس تایل‌های Mapbox Vector Tiles را با داده OpenStreetMap و محدودیت به ایران ارائه می‌دهد

چرا API وکتور می‌مپس؟
  • 🇮🇷 محدود به ایران: تایل‌ها فقط برای محدوده ایران از PostGIS/OSM تولید می‌شوند؛ خارج از ایران پاسخ 204 No Content
  • 📐 فرمت MVT: استاندارد Mapbox Vector Tiles سازگار با Leaflet.VectorGrid، MapLibre و OpenLayers
  • کش خودکار: تایل‌های تولیدشده در کش ذخیره و در درخواست‌های بعدی سریع سرو می‌شوند
  • 🗺️ سه لایه: جاده‌ها (roads)، ساختمان‌ها (buildings)، نقاط (points) از داده OSM
مزایای سرویس
  • سرور داخل کشور: سرو تایل از اینترنت داخلی
  • استایل‌پذیری: وکتور در سمت کلاینت قابل استایل است
  • پسوند .mvt و .pbf: هر دو پشتیبانی می‌شوند
  • پشتیبانی CORS: استفاده مستقیم از مرورگر

ویژگی‌های کلیدی

MVT، محدودیت ایران و سازگاری با کتابخانه‌های نقشه

📐 فرمت MVT

تایل‌ها به صورت Mapbox Vector Tiles (پروتوباف) با extent 4096 تولید می‌شوند و با Leaflet.VectorGrid، MapLibre GL JS و OpenLayers سازگار هستند.

🇮🇷 محدودیت ایران

فقط تایل‌هایی که با محدوده جغرافیایی ایران تلاقی دارند از دیتابیس خوانده می‌شوند. برای نواحی خارج از ایران پاسخ 204 No Content برگردانده می‌شود.

🗺️ لایه‌های جدا

سه لایه مستقل: roads (جاده‌ها از planet_osm_line)، buildings (ساختمان‌ها از planet_osm_polygon)، points (نقاط POI از planet_osm_point). زوم ۰ تا ۲۲.

💡 کش

تایل‌های تولیدشده در var/cache/vector-tiles ذخیره می‌شوند. درخواست‌های بعدی همان تایل از کش پاسخ داده می‌شوند.

نقطه پایانی API

آدرس و پارامترهای API تایل‌های وکتوری

نقطه پایانی دریافت تایل وکتوری
URL:
https://memaps.ir/api/vector/{layer}/{z}/{x}/{y}.{ext}

Method:
GET

Content-Type:
application/vnd.mapbox-vector-tile
پارامترهای URL:
پارامتر توضیح مثال
{layer} نام لایه: roads، buildings، points roads
{z} سطح زوم (۰ تا ۲۲) 16
{x} مختصات X تایل (XYZ) 41240
{y} مختصات Y تایل (XYZ) 26154
{ext} پسوند: mvt یا pbf (هر دو یکسان) pbf / mvt
مثال‌های URL:
// جاده‌ها
GET https://memaps.ir/api/vector/roads/16/41240/26154.pbf

// ساختمان‌ها
GET https://memaps.ir/api/vector/buildings/16/41240/26154.mvt

// نقاط (POI)
GET https://memaps.ir/api/vector/points/10/512/512.pbf

لایه‌های وکتوری

سه لایه جدا با نام لایه (source-layer) یکسان با نام مسیر

🛣️ جاده‌ها (roads)

خطوط جاده از planet_osm_line با فیلتر highway IS NOT NULL. ویژگی‌ها: osm_id، name، highway.

.../vector/roads/{z}/{x}/{y}.pbf

source-layer: roads

🏢 ساختمان‌ها (buildings)

پلیگون ساختمان از planet_osm_polygon با فیلتر building IS NOT NULL. ویژگی‌ها: osm_id، name، building.

.../vector/buildings/{z}/{x}/{y}.pbf

source-layer: buildings

📍 نقاط (points)

نقاط POI از planet_osm_point با نام یا amenity/shop/tourism. ویژگی‌ها: osm_id، name، amenity، shop، tourism.

.../vector/points/{z}/{x}/{y}.pbf

source-layer: points

🇮🇷 محدودیت جغرافیایی به ایران

API وکتور می‌مپس فقط برای محدوده ایران تایل تولید می‌کند:

  • اگر تایل با مرزهای ایران (تقریبی) تلاقی داشته باشد: از کش خوانده می‌شود یا از PostGIS تولید، کش و برگردانده می‌شود.
  • اگر تایل خارج از ایران باشد: پاسخ 204 No Content (بدون بدنه) برگردانده می‌شود و به دیتابیس درخواستی ارسال نمی‌شود.
کتابخانه‌های نقشه (Leaflet.VectorGrid، MapLibre) معمولاً 204 را به‌عنوان «تایل خالی» می‌پذیرند و خطا نشان نمی‌دهند.

مثال‌های عملی

استفاده با Leaflet.VectorGrid و MapLibre GL JS

Leaflet + VectorGrid - لایه جاده‌ها
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet.vectorgrid@1.3.0/dist/Leaflet.VectorGrid.bundled.js"></script>
<script>
var map = L.map('map').setView([35.6892, 51.3890], 10);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);

var roads = L.vectorGrid.protobuf('https://memaps.ir/api/vector/roads/{z}/{x}/{y}.pbf', {
  vectorTileLayerStyles: {
    roads: { color: '#555', weight: 1.5 }
  },
  interactive: true
}).addTo(map);
</script>
Leaflet - سه لایه روی هم
var base = 'https://memaps.ir/api/vector/';
var roads = L.vectorGrid.protobuf(base + 'roads/{z}/{x}/{y}.pbf', {
  vectorTileLayerStyles: { roads: { color: '#555', weight: 1.5 } }
});
var buildings = L.vectorGrid.protobuf(base + 'buildings/{z}/{x}/{y}.pbf', {
  vectorTileLayerStyles: { buildings: { fillColor: '#ddd', color: '#888', weight: 0.8 } }
});
var points = L.vectorGrid.protobuf(base + 'points/{z}/{x}/{y}.pbf', {
  vectorTileLayerStyles: { points: { radius: 4, color: '#c00', fillColor: '#f66' } }
});
map.addLayer(roads);
map.addLayer(buildings);
map.addLayer(points);
MapLibre GL JS - جاده‌ها
map.addSource('roads', {
  type: 'vector',
  tiles: ['https://memaps.ir/api/vector/roads/{z}/{x}/{y}.pbf'],
  maxzoom: 22
});
map.addLayer({
  id: 'roads-layer',
  type: 'line',
  source: 'roads',
  'source-layer': 'roads',
  paint: { 'line-color': '#555', 'line-width': 1.5 }
});
دریافت مستقیم (fetch)
async function getVectorTile(layer, z, x, y) {
  const url = `https://memaps.ir/api/vector/${layer}/${z}/${x}/${y}.pbf`;
  const res = await fetch(url);
  if (res.status === 204) return null; // خارج از ایران
  if (!res.ok) throw new Error(res.statusText);
  return await res.arrayBuffer();
}
getVectorTile('roads', 16, 41240, 26154);

کش و اطلاعات

کش تایل‌های وکتوری و endpoint اطلاعات کش

نحوه کار

  1. بررسی محدوده ایران: اگر تایل خارج از ایران باشد، بلافاصله پاسخ 204 No Content برگردانده می‌شود.
  2. بررسی کش: اگر تایل داخل ایران است، وجود آن در var/cache/vector-tiles/{layer}/{z}/{x}/{y}.mvt بررسی می‌شود.
  3. بازگشت از کش: در صورت وجود در کش، همان فایل MVT به کاربر برگردانده می‌شود.
  4. تولید از PostGIS: در صورت نبود در کش، تایل با ST_AsMVT از دیتابیس OSM تولید، در کش ذخیره و برگردانده می‌شود.
اطلاعات کش:
GET https://memaps.ir/api/vector/cache/info
خروجی JSON شامل cache_directory، total_size، total_size_bytes و file_count است.
پشتیبانی از CORS

API وکتور می‌مپس از CORS پشتیبانی می‌کند و می‌توانید مستقیماً از مرورگر و دامنه‌های دیگر استفاده کنید.