نقشه روی وب با 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 }} />;
}