راهنمای 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 تایلهای وکتوری
نقطه پایانی دریافت تایل وکتوری
https://memaps.ir/api/vector/{layer}/{z}/{x}/{y}.{ext}Method:
GETContent-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 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 اطلاعات کش
نحوه کار
- بررسی محدوده ایران: اگر تایل خارج از ایران باشد، بلافاصله پاسخ 204 No Content برگردانده میشود.
- بررسی کش: اگر تایل داخل ایران است، وجود آن در
var/cache/vector-tiles/{layer}/{z}/{x}/{y}.mvtبررسی میشود. - بازگشت از کش: در صورت وجود در کش، همان فایل MVT به کاربر برگردانده میشود.
- تولید از 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 پشتیبانی میکند و میتوانید مستقیماً از مرورگر و دامنههای دیگر استفاده کنید.