پرش به محتوا

نقشه روی وب با MapLibre

استایل روشن و تیره، برچسب فارسی درست با پلاگین RTL، نشانگر، و شمارش تایل.

استایل‌ها

استایلآدرس
روشنhttps://tiles.uttamap.ir/styles/light/style.json?key=um_pk_...
تیرهhttps://tiles.uttamap.ir/styles/dark/style.json?key=um_pk_...

برچسب‌ها با فونت IRANSansX و ارقام فارسی از سرورهای خود ما سرو می‌شوند. استایل، فونت و sprite شمرده نمی‌شوند؛ فقط تایل‌ها شمرده می‌شوند و هر ۱۰ تایل یک درخواست از سهمیه کم می‌کند.

نصب با npm

npm install maplibre-gl
import maplibregl from "maplibre-gl";
import "maplibre-gl/dist/maplibre-gl.css";

// Before creating any map: without it Persian labels render as separate, reversed letters.
maplibregl.setRTLTextPlugin("https://tiles.uttamap.ir/js/rtl-text.js", true);

const map = new maplibregl.Map({
  container: "map",
  style: "https://tiles.uttamap.ir/styles/light/style.json?key=um_pk_...",
  center: [46.2919, 38.0800], // [lng, lat] — Tabriz
  zoom: 12,
});

map.addControl(new maplibregl.NavigationControl(), "top-left");
new maplibregl.Marker().setLngLat([46.2919, 38.08]).addTo(map);

نکته‌ها

  • پلاگین RTL فقط یک بار در کل صفحه فراخوانی شود.
  • نوشتهٔ «© OpenStreetMap» روی نقشه الزام لایسنس داده است و نباید حذف یا پنهان شود.
  • MapLibre را فقط در صفحه‌ای بارگذاری کنید که نقشه دارد (مثلاً با import() پویا)، تا بقیهٔ سایت سبک بماند.
  • تایل تا زوم ۱۴ ساخته شده و در زوم‌های بالاتر MapLibre خودش بزرگ‌نمایی می‌کند؛ نقشه تا زوم ۱۸ واضح است.
  • تایل خارج از محدودهٔ ایران پاسخ خالی 204 می‌گیرد و شمرده نمی‌شود.

React

import { useEffect, useRef } from "react";

export function UttamapMap({ apiKey }) {
  const box = useRef(null);
  useEffect(() => {
    let map;
    import("maplibre-gl").then(({ default: maplibregl }) => {
      if (maplibregl.getRTLTextPluginStatus() === "unavailable") {
        maplibregl.setRTLTextPlugin("https://tiles.uttamap.ir/js/rtl-text.js", true);
      }
      map = new maplibregl.Map({
        container: box.current,
        style: `https://tiles.uttamap.ir/styles/light/style.json?key=${apiKey}`,
        center: [51.389, 35.689],
        zoom: 11,
      });
    });
    return () => map?.remove();
  }, [apiKey]);
  return <div ref={box} style={{ height: 420 }} />;
}