سرویس نقشه اختصاصی نتزو (Netzo Map)

مستندات ادغام و راهنمای API

راهنمای جامع، سریع و خودکفا برای توسعه‌دهندگان و Agentهای هوش مصنوعی جهت پیاده‌سازی و استفاده از نقشه وکتور ایران با استایل فارسی.

سرور: https://map.netzo.ir
استایل: iran-persian.json
پلاگین RTL: پشتیبانی کامل
CORS: Enabled (*)

⚡ ۰. راه‌اندازی فوق‌سریع در ۱۰ ثانیه (AI & Web)

کد زیر کامل و بدون نیاز به هیچ تنظیم اضافه است. برای هر پروژه وب، این قطعه کد نقشه را به صورت ریسپانسیو و با فونت وزیرمتن فارسی بارگذاری می‌کند:

HTML + MapLibre GL JS
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>نقشه نتزو</title>
  <link href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css" rel="stylesheet" />
  <style>html, body, #map { margin: 0; padding: 0; width: 100%; height: 100%; }</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js"></script>
<script>
  // ۱. فعال‌سازی پلاگین اجباری RTL برای اتصال حروف فارسی
  maplibregl.setRTLTextPlugin(
    'https://unpkg.com/@mapbox/mapbox-gl-rtl-text@0.2.3/mapbox-gl-rtl-text.min.js',
    null,
    true
  );

  // ۲. ساخت شیء نقشه با استایل پروداکشن نتزو
  const map = new maplibregl.Map({
    container: 'map',
    style: 'https://map.netzo.ir/styles/iran-persian.json',
    center: [53.6880, 32.4279], // مرکز جغرافیایی ایران [lng, lat]
    zoom: 5.5,
    minZoom: 4,
    maxZoom: 18
  });

  // ۳. افزودن کنترل‌های بزرگ‌نمایی و قطب‌نما
  map.addControl(new maplibregl.NavigationControl(), 'top-left');
</script>
</body>
</html>
HTML + Leaflet (تایل‌های رستر سبک)
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
  <meta charset="UTF-8" />
  <title>نقشه رستر نتزو با Leaflet</title>
  <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
  <style>html, body, #map { margin: 0; padding: 0; width: 100%; height: 100%; }</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
  const map = L.map('map').setView([32.4279, 53.6880], 6);

  // لود تایل‌های رستر PNG نتزو (XYZ Tile Layer)
  L.tileLayer('https://map.netzo.ir/raster/iran/{z}/{x}/{y}.png', {
    maxZoom: 18,
    attribution: '© Netzo Map | OpenStreetMap contributors'
  }).addTo(map);

  L.marker([35.6892, 51.3890]).addTo(map).bindPopup('تهران').openPopup();
</script>
</body>
</html>
⚠️ نکته کلیدی درباره حروف فارسی: قبل از فراخوانی new maplibregl.Map() حتماً متد maplibregl.setRTLTextPlugin(...) را صدا بزنید؛ در غیر این صورت حروف فارسی به صورت جدا از هم و معکوس رندر می‌شوند. (در کتابخانه Leaflet نیازی به این مرحله نیست زیرا متن‌ها از قبل روی سرور رندر شده‌اند).

🗺️ پیش‌نمایش زنده در همین صفحه

نمای زنده از استایل وکتور سرور پروداکشن نتزو با تایپوگرافی فارسی وزیرمتن:

🌐 اندپوینت‌های عمومی سرور

تمامی درخواست‌ها دارای هدر Access-Control-Allow-Origin: * بوده و بدون محدودیت مبدا در مرورگر قابل استفاده هستند.

سرویس متد آدرس (URL) توضیحات
استایل MapLibre GET https://map.netzo.ir/styles/iran-persian.json استایل کامل وکتور با لایه‌های رنگی و فونت فارسی
تایل‌های وکتور GET https://map.netzo.ir/tiles/iran/{z}/{x}/{y} تایل‌های فشرده PBF از آرشیو PMTiles ایران (MapLibre GL)
تایل‌های رستر (XYZ) GET https://map.netzo.ir/raster/iran/{z}/{x}/{y}.png تایل‌های استاندارد تصویری PNG سازگار با Leaflet، OpenLayers و GIS
تصویر ایستا (Static Map) GET https://map.netzo.ir/style/iran-persian/static/{lon},{lat},{zoom}/{w}x{h}.png تولید آنی تصویر ثابت از نقشه با مختصات و ابعاد دلخواه
گلیف فونت‌ها GET https://map.netzo.ir/fonts/{font}/{range}.pbf فونت وزیرمتن تبدیل‌شده به SDF برای رندر وب‌جی‌ال
اسپرایت آیکون‌ها GET https://map.netzo.ir/sprites/sprite.json اطلس آیکون‌های POI و علائم جاده‌ای
جستجو / ژئوکدینگ GET https://map.netzo.ir/search?q={query} جستجوی نام شهرها، خیابان‌ها و مکان‌های ایران
آدرس‌یابی معکوس GET https://map.netzo.ir/api/reverse-geocode?lat={lat}&lng={lng} تبدیل مختصات جغرافیایی به آدرس ساخت‌یافته فارسی
بررسی سلامت GET https://map.netzo.ir/ping پاسخ: pong

🔍 وب‌سرویس جستجو و ژئوکدینگ (/search)

پشتیبانی از جستجوی ترکیبی (نام شهر + خیابان مانند فسا خیابان فیاض بخش) و اولویت‌بندی بر اساس فاصله با ارسال مختصات مرکز نقشه (lat, lon):

تست زنده اندپوینت جستجو:


      
نمونه تابع جاوااسکریپت برای جستجو با اولویت فاصله
async function searchPlace(query, mapCenter = null) {
  const params = new URLSearchParams({ q: query, lang: 'fa', limit: '7' });
  if (mapCenter) {
    params.append('lat', mapCenter.lat.toFixed(5));
    params.append('lon', mapCenter.lng.toFixed(5));
  }

  const res = await fetch(`https://map.netzo.ir/search?${params}`);
  const data = await res.json();
  // data.features شامل نام، display_name، شهر، استان، نوع و فاصله است
  return data.features;
}

📍 وب‌سرویس آدرس‌یابی معکوس (/api/reverse-geocode)

تبدیل مختصات (عرض و طول جغرافیایی) به آدرس ساخت‌یافته استاندارد، شامل نام خیابان، محله، شهر و استان:

تست زنده آدرس‌یابی معکوس:


      
تابع جاوااسکریپت - Reverse Geocode
async function reverseGeocode(latitude, longitude) {
  const url = `https://map.netzo.ir/api/reverse-geocode?lat=${latitude}&lng=${longitude}`;
  const res = await fetch(url);
  if (!res.ok) throw new Error('خطا در دریافت آدرس');
  return await res.json();
}

📌 نشانه‌گذاری و کنترل دوربین نقشه

کنترل مارکرها در سمت کلاینت با متدهای MapLibre GL JS انجام می‌شود:

جاوااسکریپت - پین و جابه‌جایی دوربین
// ۱. افزودن مارکر قرمز روی تهران (فرمت همیشه: [طول_جغرافیایی, عرض_جغرافیایی])
const marker = new maplibregl.Marker({ color: '#e53e3e' })
  .setLngLat([51.3890, 35.6892])
  .setPopup(new maplibregl.Popup({ offset: 25 }).setText('تهران - برج میلاد'))
  .addTo(map);

// ۲. انیمیشن پرواز دوربین به مختصات دلخواه
map.flyTo({
  center: [51.3890, 35.6892],
  zoom: 14,
  speed: 1.4
});

// ۳. برازش نقشه روی محدوده کل ایران
map.fitBounds([[44.03, 25.06], [63.33, 39.78]], { padding: 50 });

⚛️ کامپوننت آماده React / Next.js

NetzoMap.jsx
import React, { useEffect, useRef } from 'react';
import maplibregl from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

export function NetzoMap({ center = [53.6880, 32.4279], zoom = 5.5 }) {
  const mapContainer = useRef(null);

  useEffect(() => {
    maplibregl.setRTLTextPlugin(
      'https://unpkg.com/@mapbox/mapbox-gl-rtl-text@0.2.3/mapbox-gl-rtl-text.min.js',
      null,
      true
    );

    const map = new maplibregl.Map({
      container: mapContainer.current,
      style: 'https://map.netzo.ir/styles/iran-persian.json',
      center,
      zoom
    });

    return () => map.remove();
  }, []);

  return <div ref={mapContainer} style={{ width: '100%', height: '500px' }} />;
}

📐 مرجع مختصات شهرهای اصلی ایران

شهر طول جغرافیایی (Longitude) عرض جغرافیایی (Latitude) آرایه مختصات [lng, lat]
تهران 51.3890 35.6892 [51.3890, 35.6892]
اصفهان 51.6674 32.6546 [51.6674, 32.6546]
مشهد 59.6042 36.3132 [59.6042, 36.3132]
شیراز 52.5311 29.5918 [52.5311, 29.5918]
تبریز 46.2919 38.0800 [46.2919, 38.0800]