Protomaps Basemap टाइलें
पूरा Protomaps Basemap, ज़ूम 0 से 15 तक, साधारण HTTP पर एक ही PMTiles आर्काइव के रूप में उपलब्ध है। किसी भी PMTiles क्लाइंट को इस URL से जोड़ें और यह काम करेगा।
https://tiles.jasontally.com/basemap.pmtiles
- कोई API कुंजी नहींसाइन अप करने की ज़रूरत नहीं, आपके कोड में कोई टोकन नहीं।
- कोई रेट लिमिट नहींकोई थ्रॉटलिंग नहीं, कोई कोटा नहीं, कोई बर्स्ट कैप नहीं।
- मासिक अपडेटमहीने में एक बार नवीनतम Protomaps रिलीज़ से दोबारा बनाया जाता है।
क्या OpenStreetMap टाइल ब्लॉक हो गई है, या tile.openstreetmap.org से 403 मिल रहा है? यहाँ से शुरू करें।
इसे आज़माएँ
तीन स्टाइलों में वही आर्काइव। स्टाइल बदलने पर पहले से लोड हो चुकी टाइलें वहीं रहती हैं, इसलिए यह तुरंत बदलता है।
अपना खुद का बनाएँ
कोई रंग बदलें या किसी लेयर को बंद करें, नक्शा साथ-साथ अपडेट होता है। फिर स्टाइल JSON कॉपी करें — यह एक सामान्य MapLibre स्टाइल है जिसे आप स्वयं होस्ट कर सकते हैं। यह इन्हीं टाइलों की ओर इंगित करता है, इसलिए आप इसे जहाँ भी रखें यह काम करता रहेगा।
उपयोग करें
यह आर्काइव HTTP रेंज रिक्वेस्ट का समर्थन करता है, इसलिए हर PMTiles क्लाइंट इसे पढ़ सकता है।
एक। पेज पर नक्शा लगाएँ
इस फ़ाइल को कॉपी करें। यही पूरा उदाहरण है: तीन टैग, एक स्टाइल URL, एक नक्शा। दोनों लाइब्रेरियाँ पिन की गई हैं और BSD-3-Clause लाइसेंस के अंतर्गत हैं, और यदि आप CDN का उपयोग नहीं करना चाहते तो यही फ़ाइलें इस होस्ट से भी दी जाती हैं।
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Basemap</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.css">
<script src="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js"></script>
<script src="https://cdn.jsdelivr.net/npm/pmtiles@3.2.1/dist/pmtiles.js"></script>
<style>html, body, #map { margin: 0; height: 100%; }</style>
</head>
<body>
<div id="map"></div>
<script>
// Teach MapLibre how to read a PMTiles archive.
const protocol = new pmtiles.Protocol();
maplibregl.addProtocol("pmtiles", protocol.tile);
new maplibregl.Map({
container: "map",
style: "https://tiles.jasontally.com/styles/light.json",
center: [2.35, 48.85], // Paris
zoom: 4
});
</script>
</body>
</html>
दो। अपनी मौजूदा स्टाइल में टाइलें बदलें
हर MapLibre स्टाइल अपनी टाइलें एक सोर्स से पढ़ती है। इन टाइलों का उपयोग करने के लिए, बस उस एक url को बदलें। स्टाइल में और कुछ नहीं बदलता।
"sources": {
"protomaps": {
"type": "vector",
- "url": "pmtiles://https://demo-bucket.protomaps.com/v4.pmtiles",
+ "url": "pmtiles://https://tiles.jasontally.com/basemap.pmtiles",
"attribution": "<a href=\"https://www.openstreetmap.org/copyright\">© OpenStreetMap contributors</a>"
}
}
या इसे कोड में करें, जो तब उपयोगी है जब स्टाइल किसी ऐसे सर्वर से आती है जिस पर आपका नियंत्रण नहीं है:
// Rewrite every PMTiles source in a style to point at these tiles.
const style = await (await fetch("https://your-server/style.json")).json();
for (const source of Object.values(style.sources)) {
if (source.url?.startsWith("pmtiles://")) {
source.url = "pmtiles://https://tiles.jasontally.com/basemap.pmtiles";
}
}
new maplibregl.Map({ container: "map", style, center: [2.35, 48.85], zoom: 4 });
तीन। अपनी बनाई स्टाइल कहाँ रखें
ऊपर बिल्डर में दिया गया Style JSON बटन उस स्टाइल को खोलता है जिसे यह नक्शा अभी बना रहा है (आपके बदलावों सहित), और उस डायलॉग में कॉपी बटन है। इससे मिलने वाले JSON का उपयोग करने के दो तरीके हैं, और दोनों साधारण वेब पेज हैं।
इसे अपने पेज के पास एक फ़ाइल के रूप में सहेजें और style को इसकी ओर इंगित करें, ठीक वैसे ही जैसे इस होस्ट पर तीनों स्टाइलों का उपयोग किया गया है। यदि स्टाइल आपकी अपनी है और आपकी साइट के साथ बदलती है, तो यह तरीका चुनें:
// Save the copied JSON as my-basemap.json beside this file.
new maplibregl.Map({
container: "map",
style: "my-basemap.json", // relative, same origin
center: [2.35, 48.85],
zoom: 4
});
या इसे सीधे HTML में रखें, जिससे केवल एक फ़ाइल रखनी होती है और अलग से कुछ होस्ट नहीं करना पड़ता। स्टाइल वही है, बस उसके रहने की जगह अलग है:
// The copied JSON, pasted straight into the page.
const myStyle = {
"version": 8,
"name": "Protomaps Basemap — custom",
"glyphs": "https://tiles.jasontally.com/font/{fontstack}/{range}.pbf",
"sprite": "https://tiles.jasontally.com/sprites/v4/light",
"sources": { /* ... as copied ... */ },
"layers": [ /* ... as copied ... */ ]
};
new maplibregl.Map({ container: "map", style: myStyle, zoom: 4 });
glyphs और sprite की पंक्तियों को वैसा ही रहने दें। वे लेबल और आइकन बनाती हैं और इसी होस्ट की ओर इंगित करती हैं, इसलिए अपने पेज में पेस्ट की गई स्टाइल को आप जहाँ से भी सर्व करें, वह काम करती रहेगी। यदि आप इस होस्ट पर बिल्कुल निर्भर नहीं रहना चाहते, तो उन्हें इसके बजाय protomaps.github.io/basemaps-assets की ओर इंगित करें।
बदलने से पहले एक बात जाँच लें। यह आर्काइव Protomaps स्कीमा v3 है। किसी अन्य स्कीमा के लिए लिखी गई स्टाइल लोड तो होगी पर कुछ भी नहीं बनाएगी, क्योंकि सोर्स लेयर के नाम मेल नहीं खाते। नौ लेयर के नाम नीचे दिए गए हैं, और साथ में एक तैयार v3 स्टाइल भी है जिसे आप कॉपी कर सकते हैं।
चार। फ़ॉन्ट, स्प्राइट और लाइब्रेरियाँ
एक नक्शे में टाइलें, टेक्स्ट के लिए एक glyphs URL, आइकन के लिए वैकल्पिक रूप से एक sprite URL, और इन्हें ड्रा करने वाली लाइब्रेरियाँ होती हैं। यह सब यहाँ उन्हीं पाथ पर उपलब्ध है जिनकी अपेक्षा की जाती है, ताकि यदि आप चाहें तो पूरा नक्शा एक ही होस्टनेम से आ सके।
| क्या | यहाँ का URL | लाइसेंस |
|---|
MapLibre और PMTiles फ़ाइलें jsDelivr पर भी हैं और यहाँ भी। दोनों में से कोई भी URL काम करता है।
अंतिम पंक्ति का उपयोग इस पेज द्वारा नहीं किया जाता। यह Leaflet वेक्टर रेंडरर है, जिसे यहाँ प्रकाशित किया गया है ताकि बदलाव केवल एक स्क्रिप्ट टैग का हो। Leaflet स्वयं अपने CDN पर रहता है।
दो फ़ॉन्ट स्टैक, Noto Sans Regular और Noto Sans Medium, उन 256 रेंजों में बँटे हैं जो MapLibre एक बार में 256 कोडपॉइंट के हिसाब से माँगता है। केवल लैटिन ही नहीं, सभी 256 रेंज प्रकाशित की गई हैं: Protomaps स्थानों को उनके स्थानीय नाम से लेबल करता है, इसलिए टोक्यो या काहिरा के लिए हज़ारों की संख्या वाली रेंज चाहिए। यदि केवल अंग्रेज़ी नक्शे के काम आने वाली रेंज प्रकाशित की जाएँ, तो वे लेबल बिना किसी त्रुटि संदेश के गायब हो जाते हैं।
पाँच स्प्राइट शीट, प्रत्येक अपस्ट्रीम फ़्लेवर के लिए एक, 1x और 2x पर। नीचे दी गई स्टाइलें इन्हीं से आइकन बनाती हैं, इसलिए इन्हें फ़ेच किया जाता है। यदि आप अपनी स्टाइल में टाउनस्पॉट, हाईवे शील्ड या स्थानों के आइकन चाहते हैं, तो sprite को अपने फ़्लेवर वाली शीट पर इंगित करें। किसी शीट के आइकन नाम उसके light.json में सूचीबद्ध हैं।
नक्शा क्या बनाता है, और हर चीज़ कहाँ से आती है
हर लेयर इस आर्काइव की नौ सोर्स लेयरों में से एक है, इसलिए यहाँ किसी भी चीज़ के लिए दूसरे आर्काइव की आवश्यकता नहीं है। इनमें से दो का उल्लेख करना ज़रूरी है, क्योंकि दोनों ऐसी लगती हैं मानो कुछ गायब हो, जबकि ऐसा नहीं है:
| लेयर | स्रोत | इस बिल्ड में है? |
|---|---|---|
| आकृतियाँ, सड़कें, इमारतें, जल, भूमि | earth, landcover, landuse, water, roads, buildings | हाँ |
| स्थान, सड़क और जल के नाम | उन्हीं लेयरों पर मौजूद name फ़ील्ड | हाँ |
| स्थानों के आइकन, टाउनस्पॉट | pois.kind, places, और स्प्राइट | हाँ |
| रूट शील्ड | roads.shield_text | नहीं। वर्तमान में सर्व किए जा रहे बिल्ड में यह फ़ील्ड नहीं है |
| मकान नंबर | buildings.kind=address और buildings.addr_housenumber | नहीं, वही कारण |
पतों के लिए कोई अलग आर्काइव नहीं है, और फ़ेच करने के लिए कोई अलग एड्रेस लेयर नहीं है। अपस्ट्रीम प्रोजेक्ट पता बिंदुओं को buildings लेयर के अंदर kind=address और addr_housenumber वाले फ़ीचर के रूप में रखता है। वह फ़ील्ड इस नक्शे द्वारा सर्व किए जा रहे बिल्ड के बाद वाले Protomaps बिल्ड में आया है, इसलिए मकान नंबर की लेयर तैयार है और अगले मासिक रिफ़्रेश में डेटा आने पर अपने आप चालू हो जाएगी। शील्ड टेक्स्ट के साथ भी यही बात है: वर्तमान बिल्ड में shield_text_length है, जो यह बताता है कि रूट नंबर में कितने अक्षर हैं, यह नहीं कि वे अक्षर क्या हैं, इसलिए उससे बनाई गई शील्ड हर राजमार्ग पर एक खाली आकृति जैसी दिखेगी।
खुद एक लेयर लिखना और उसमें रंग भरना
एक लेयर में फ़िल्टर, ज़ूम, आकृति और रंग होता है। फ़िल्टर की दो बातें हर किसी को उलझाती हैं, और दोनों बिना किसी त्रुटि के विफल हो जाती हैं:
kindमोटे स्तर का नाम है। सड़कों के लिए यहhighway,major_road,minor_road,path,railमें से एक है। अपस्ट्रीम दस्तावेज़ में दिए गए नाम —motorway,primary,residential— वास्तव मेंkind_detailके मान हैं, और जो लेयरkindको उनके विरुद्ध फ़िल्टर करती है वह कुछ नहीं बनाती और कहीं कोई त्रुटि भी नहीं दिखाती।- कोई भी लेयर अपने
minzoomसे नीचे नहीं बनाई जाती। आर्काइव z15 पर रुक जाता है, इसलिए जिस लेयर का minzoom 16 है वह कभी बनाई ही नहीं जाती। अधिकांश फ़ीचर में अपनाmin_zoomभी होता है — वह ज़ूम जिस पर डेटा के अनुसार उन्हें दिखाना उचित है — और यहाँ दी गई स्टाइलें उसकी भी जाँच करती हैं।
तो एक सड़क, उसका नाम, और लाइन को बंद करने का टॉगल इस प्रकार है:
{
"id": "road-major",
"type": "line",
"source": "protomaps",
"source-layer": "roads", // one of the nine
"minzoom": 4, // not drawn below this
"filter": ["==", ["get", "kind"], "major_road"],
"layout": {
"line-cap": "round",
"visibility": "visible" // "none" to hide it
},
"paint": {
"line-color": "#f7c44d", // any CSS colour
"line-width": ["interpolate", ["linear"], ["zoom"], 4, 1.7, 12, 6]
}
}
नाम एक सिंबल लेयर है जो name फ़ील्ड को पढ़ती है, जिसके पीछे हेलो (halo) हो सकता है या नहीं भी। गायब ग्लिफ़ कोई त्रुटि नहीं देता, इसलिए आप जिस फ़ॉन्ट स्टैक की माँग करें वह इस होस्ट पर मौजूद दोनों में से एक होना चाहिए:
{
"id": "road-label-major",
"type": "symbol",
"source": "protomaps",
"source-layer": "roads",
"minzoom": 11,
"layout": {
"text-field": ["coalesce", ["get", "name:en"], ["get", "name"]],
"text-font": ["Noto Sans Medium"], // or Noto Sans Regular
"text-size": 10,
"symbol-placement": "line" // follow the road
},
"paint": {
"text-color": "#2b2a26",
"text-halo-color": "#ffffff",
"text-halo-width": 1.1
}
}
कुछ न बनाने वाली लेयर कोई त्रुटि नहीं है, और MapLibre यह नहीं बताएगा कि कौन सी जाँच विफल रही। यदि आपकी लेयर खाली है, तो इस क्रम में जाँचें: फ़ील्ड का नाम, लेयर का minzoom, फ़ॉन्ट स्टैक, और फिर शीट के अपने light.json में आइकन का नाम।
यदि आपके पास ऐसी स्टाइल है जो अपने ग्लिफ़ के लिए demotiles.maplibre.org की ओर इंगित करती है, तो केवल उस होस्टनेम को बदलना ही पूरा बदलाव है। पाथ जानबूझकर समान रखा गया है।
"glyphs": "https://tiles.jasontally.com/font/{fontstack}/{range}.pbf",
"sprite": "https://tiles.jasontally.com/sprites/v4/light"
// before, in a style you already have
- "glyphs": "https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf",
+ "glyphs": "https://tiles.jasontally.com/font/{fontstack}/{range}.pbf",
यदि कोई स्टाइल ऊपर दिए गए दो फ़ॉन्ट स्टैक के अलावा किसी अन्य की माँग करती है, तो उसके लिए कुछ भी ड्रा नहीं होगा। Protomaps की अपनी स्टाइलें बोल्ड टेक्स्ट के लिए Noto Sans Medium का उपयोग करती हैं; इस सेट में Noto Sans Bold नहीं है, इसीलिए उसकी माँग करने वाली स्टाइल के सारे लेबल चुपचाप गायब हो जाते हैं।
कौन सा होस्ट तेज़ है, और इस बारे में क्या निर्णय लिया गया। अनुमान के बजाय मापा गया: बारी-बारी से किए गए अनुरोध, एक समय में एक, एक ही कनेक्शन पर, पहले तीन सैंपल हटाकर, और ट्रांसफ़र से पहले बाइट के समय (TTFB) को अलग रखकर। उस परीक्षण में CDN ने इन सभी फ़ाइलों के लिए 10 से 45 ms पहले उत्तर दिया, जो 15% नियम को पूरी तरह संतुष्ट करता है। इसी कारण लाइब्रेरियाँ jsDelivr से लोड होती हैं।
फ़ॉन्ट और स्प्राइट यहीं से सर्व किए जाते हैं, भले ही उसी माप के अनुसार CDN उन्हें लगभग 10 ms पहले दे देता। यह एक निर्णय है, माप नहीं। एक ही होस्टनेम से आने वाला नक्शा किसी दूसरे होस्ट के बंद होने पर टूटता नहीं है, और ग्लिफ़ सर्वर बंद होने का अर्थ है बिना लेबल वाला नक्शा। यदि आपको वे 10 ms चाहिए, तो glyphs को protomaps.github.io/basemaps-assets/fonts की ओर इंगित करें, यह उसी पाथ के साथ काम करता है। ये एक शहर से एक पाठक के आँकड़े हैं, और तुलना को दोबारा चलाना केवल एक कमांड का काम है।
पाँच। Leaflet के बारे में
Leaflet का L.tileLayer चित्र बनाता है; जबकि ये वेक्टर टाइलें हैं। फिर भी एक Leaflet नक्शा इनका उपयोग कर सकता है, और दोनों ही तरीकों में आपके मार्कर, पॉपअप और कंट्रोल वैसे ही बने रहते हैं। दोनों तरीके OpenStreetMap टाइलों से माइग्रेट करना में दिए गए हैं।
छह। PMTiles लाइब्रेरी से आर्काइव पढ़ें
कोई नक्शा नहीं, केवल डेटा। स्क्रिप्ट, परीक्षण और ऐसी किसी भी चीज़ के लिए उपयोगी जो चित्र नहीं है।
import { PMTiles, FetchSource } from "pmtiles";
const archive = new PMTiles(new FetchSource("https://tiles.jasontally.com/basemap.pmtiles"));
const header = await archive.getHeader();
console.log(header.minZoom, header.maxZoom); // 0 15
console.log(header.numAddressedTiles); // 1431655765
const metadata = await archive.getMetadata();
console.log(metadata.name); // "Protomaps Basemap"
const tile = await archive.getZxy(3, 4, 2); // z, x, y
console.log(tile.data.byteLength);
दोनों क्लासों पर ध्यान दें। FetchSource HTTP पर बाइट रीडर है, और PMTiles वह रीडर है जो उसके ऊपर बैठता है और फ़ॉर्मेट को समझता है। FileSource स्थानीय फ़ाइल के लिए FetchSource के समतुल्य है; उसे URL स्ट्रिंग देने पर वह काम नहीं करेगा।
यह आर्काइव एक स्नैपशॉट है, लाइव फ़ीड नहीं। समय की जानकारी यह डेटा कितना नया है? में दी गई है।
OpenStreetMap टाइलों से माइग्रेट करना
टाइल उपयोग नीति का ब्लॉक, 403 त्रुटि, और उनके समाधान। न कोई कुंजी, न कोई कोटा।
नक्शे पर ब्लॉक क्यों दिखता है
App is not following the tile usage policy of OpenStreetMap’s volunteer-run servers
General block: app is not following the tile usage policy of openstreetmap volunteer-run servers
403 Forbidden — tile.openstreetmap.org
टाइल सर्वरों ने टाइल उपयोग नीति के तहत जानबूझकर नक्शे के स्थान पर वह छवि भेजी है। यह कोई खराबी नहीं है, और URL ठीक करने से यह नहीं हटता।
लोग सबसे पहले क्या आज़माते हैं:
a/b/cको कैननिकल होस्ट में बदलने से ब्लॉक नहीं हटता। कैननिकल URL आवश्यक है, लेकिन ब्लॉक होस्टनेम से नहीं बल्कि उस ऐप या Referer से जुड़ा होता है जिसे देखा गया था।- बार-बार प्रयास करने से स्थिति और बिगड़ती है। अधिक ट्रैफ़िक भी इस ब्लॉक के कारणों में से एक है।
- डिस्क से खोले गए पेज को कोई हेडर ट्रिक नहीं बचा सकती।
file://कोईRefererनहीं भेजता। इसके बजायX-Requested-Withभेजने पर हर टाइल के लिए CORS प्रीफ़्लाइट की आवश्यकता होगी, और टाइल सर्वर उस प्रीफ़्लाइट को भी अस्वीकार कर देते हैं। Firefox और Chromium कौन से हेडर भेजते हैं इसमें अंतर है; पर नियम दोनों के लिए एक ही है। localhostपर काम करता है, पर लाइव साइट पर ब्लॉक है? इसका कारण ओरिजिन है। आपके डोमेन का Referer ब्लॉक किया गया है, औरlocalhostएक अलग Referer भेजता है।
कार्यालय, स्कूल, VPN और मोबाइल नेटवर्क एक ही IP पता साझा करते हैं, और ब्लॉक ऐप के साथ-साथ पतों पर भी लागू होते हैं। अपनी तरफ़ से आप यह नहीं बता सकते कि आप पर कौन सा ब्लॉक लगा है।
इसलिए उन सर्वरों से अनुरोध करना बंद करें। उनसे हटने के तीन तरीके हैं।
Leaflet बनाए रखें
protomaps-leaflet Leaflet में वेक्टर टाइलें बनाता है। यह स्वयं आर्काइव को पढ़ता है और एक सामान्य लेयर के रूप में जुड़ जाता है, जिससे मार्कर, पॉपअप, GeoJSON और कंट्रोल अपनी जगह बने रहते हैं। इस आर्काइव के साथ जाँची गई एक प्रति यहाँ उपलब्ध है: https://tiles.jasontally.com/vendor/protomaps-leaflet.js.
पहले:
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
const map = L.map("map").setView([48.85, 2.35], 12);
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19,
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
</script>
बाद में:
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
+ <script src="https://tiles.jasontally.com/vendor/protomaps-leaflet.js"></script>
<script>
const map = L.map("map").setView([48.85, 2.35], 12);
- L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", { ... }).addTo(map);
+ protomapsL.leafletLayer({
+ url: "https://tiles.jasontally.com/basemap.pmtiles",
+ flavor: "light",
+ lang: "en"
+ }).addTo(map);
</script>
flavorके मानlight,dark,white,grayscaleयाblackहैं। ये लाइब्रेरी की अपनी थीम हैं, ऊपर दी गई स्टाइलें नहीं, इसलिए रंग हूबहू मेल नहीं खाएँगे।- लेबल सिस्टम फ़ॉन्ट में कैनवास टेक्स्ट होते हैं। न कोई ग्लिफ़ URL, न कोई फ़ॉन्ट जिस पर 404 आ सके।
- z15 सबसे गहरी टाइल है। इसके आगे लेयर ओवरज़ूम करती है, और
maxDataZoom: 15पहले से ही डिफ़ॉल्ट है।
protomaps-leaflet अपस्ट्रीम पर मेंटेनेंस मोड में है: केवल सुधार, नए फ़ीचर नहीं। मौजूदा Leaflet ऐप के लिए यह ठीक है। नया काम MapLibre GL पर शुरू किया जाना चाहिए।
Leaflet रखें, MapLibre से रेंडर करें
@maplibre/maplibre-gl-leaflet Leaflet के टाइल पेन में एक MapLibre नक्शा रखता है। जब आप Leaflet ऐप में ही ऊपर दी गई स्टाइलों में से किसी एक का, या टेरेन और हिलशेड का उपयोग करना चाहें, तब इसे चुनें।
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<link rel="stylesheet" href="https://tiles.jasontally.com/vendor/maplibre-gl.css">
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://tiles.jasontally.com/vendor/maplibre-gl.js"></script>
<script src="https://tiles.jasontally.com/vendor/pmtiles.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@maplibre/maplibre-gl-leaflet@0.1.4/dist/leaflet-maplibre-gl.js"></script>
<script>
// The style's source is pmtiles://, so MapLibre needs the protocol first.
maplibregl.addProtocol("pmtiles", new pmtiles.Protocol().tile);
const map = L.map("map", { minZoom: 1 }).setView([48.85, 2.35], 12);
const gl = L.maplibreGL({
style: "https://tiles.jasontally.com/styles/light.json"
}).addTo(map);
// gl.getMaplibreMap() is the MapLibre map, for sources and layers.
</script>
- पहले प्रोटोकॉल रजिस्टर करें।
addProtocolपंक्ति के बिना कंसोलURL scheme "pmtiles" is not supportedदिखाता है और नक्शा खाली रहता है। - MapLibre, Leaflet से एक ज़ूम नीचे ड्रा करता है। इसकी टाइलें Leaflet के 256 px के मुकाबले 512 px की होती हैं, इसलिए
minzoom12 वाली लेयर तब दिखती है जब Leaflet z13 पर पहुँचता है। - Leaflet अभी भी ऊपर ड्रा करता है। कैनवास टाइल पेन में रहता है, इसलिए मार्कर और ओवरले रास्टर लेयर की तरह ही काम करते हैं।
MapLibre GL पर जाएँ
एक लाइब्रेरी, कोई एडेप्टर नहीं, और ऊपर दी गई स्टाइलें जैसी हैं वैसी ही काम करती हैं। पूरा पेज एक। पेज पर नक्शा लगाएँ में है। इस बदलाव में मुख्य रूप से निर्देशांकों का क्रम पलटता है:
| Leaflet | MapLibre GL |
|---|---|
L.map("map").setView([lat, lng], z) | new maplibregl.Map({ container: "map", center: [lng, lat], zoom: z }) |
L.tileLayer(url).addTo(map) | वेक्टर सोर्स वाली एक स्टाइल; ऊपर देखें |
L.marker([lat, lng]).bindPopup(html) | new maplibregl.Marker().setLngLat([lng, lat]).setPopup(new maplibregl.Popup().setHTML(html)) |
L.geoJSON(data) | addSource(id, { type: "geojson", data }), फिर addLayer |
L.control.scale() | new maplibregl.ScaleControl() |
map.invalidateSize() | map.resize() |
setView([lat, lng]) पहले अक्षांश (latitude) लेता है; जबकि हर MapLibre कॉल [lng, lat] लेता है। यदि नक्शा गलत गोलार्ध में दिख रहा है, तो कारण यही है, टाइलें नहीं। स्टाइल लोड होने से पहले जोड़े गए सोर्स और लेयर बिना किसी त्रुटि के छोड़ दिए जाते हैं, इसलिए उन्हें map.on("load", …) के अंदर जोड़ें।
“archive contains MVT vector tiles, but leafletRasterLayer is for displaying raster tiles”
यह pmtiles.leafletRasterLayer है, जो रास्टर PMTiles को छवियों के रूप में दिखाता है। ये वेक्टर टाइलें हैं, इसलिए वह इन्हें अस्वीकार कर देता है। कोई भी विकल्प इसे नहीं बदल सकता, और यहाँ कोई रास्टर प्रति नहीं है। ऊपर दिए गए विकल्पों में से किसी एक का उपयोग करें।
“download.openstreetmap.fr returned 403”
वह एक एक्सट्रैक्ट और रेप्लिकेशन मिरर है, टाइल सर्वर नहीं। अक्टूबर 2026 में अत्यधिक डाउनलोड के बाद उसने कई पतों को ब्लॉक कर दिया था, और ऑपरेटरों ने कहा कि वे मामले के आधार पर पहुँच बहाल करेंगे। यहाँ किसी भी चीज़ को उसकी आवश्यकता नहीं है: यह आर्काइव Protomaps रिलीज़ से आता है, इसलिए आपको स्वयं .osm.pbf असेंबल नहीं करना पड़ता। यदि आप OSM डेटा लेते हैं, तो मिनट स्ट्रीम के बजाय आवधिक एक्सट्रैक्ट लें।
स्टाइलें
वही टाइलें, अलग रंग। एक चुनें, कॉपी करें, बदलें — यह आपकी है।
| स्टाइल | दिखावट | फ़ाइल |
|---|
टाइलों में क्या है
पेज लोड होते समय आर्काइव के अपने मेटाडेटा से पढ़ा गया। किसी भी स्टाइल को इन्हीं लेयर नामों का उपयोग करना चाहिए।
| सोर्स लेयर | ज़ूम | फ़ील्ड |
|---|---|---|
| लोड हो रहा है… | ||
यह सेवा क्या नहीं है
स्पष्ट उत्तर, ताकि बाद में आपको कोई आश्चर्य न हो।
- सेवा स्तर की कोई गारंटी (SLA) नहीं है। यह बिना किसी अनुबंध के एक निःशुल्क सेवा है। यह धीमी हो सकती है, बंद हो सकती है, और URL तथा डेटा बिना सूचना के बदल या हट सकते हैं। यदि आपका उत्पाद इस पर निर्भर है, तो टाइलों की अपनी प्रति स्वयं होस्ट करें या किसी प्रदाता से समर्थित प्लान खरीदें।
- यह हर घंटे अपडेट नहीं होता। यह प्रति नवीनतम Protomaps रिलीज़ का एक स्नैपशॉट है, लाइव फ़ीड नहीं। आज किए गए संपादन इसमें नहीं हैं। समय की जानकारी यह डेटा कितना नया है? में है।
- पूरी फ़ाइल एक साथ डाउनलोड नहीं होती। अनुरोधों का उत्तर अधिकतम 512 KiB की रेंज में दिया जाता है, और एक PMTiles क्लाइंट को केवल इतने की ही आवश्यकता होती है। एक ही अनुरोध में पूरा आर्काइव माँगने पर
416मिलता है, जो सही व्यवहार है। - एट्रिब्यूशन (श्रेय) देना आवश्यक है। ये टाइलें OpenStreetMap से प्राप्त डेटा पर आधारित हैं। अपनी स्टाइल में या अपने नक्शे पर एट्रिब्यूशन पंक्ति बनाए रखें।
यह डेटा कितना नया है?
ये टाइलें Protomaps Basemap की एक प्रति हैं, जिसे महीने में एक बार दोबारा बनाया जाता है।
- महीने में एक बार पुनर्निर्माण। यह बिल्ड महीने के पहले रविवार को 00:30 और 07:00 UTC के बीच चलता है — तीन वर्षों के रिलीज़ इतिहास में यही एकमात्र समय-सीमा है जिसमें अपस्ट्रीम ने कभी प्रकाशन नहीं किया है। इसे साप्ताहिक के बजाय मासिक रखा गया है, क्योंकि नया आर्काइव CDN और हर उस ब्राउज़र के कैश किए गए हिस्सों को अमान्य कर देता है जहाँ वे पहले से मौजूद हैं, और हर पुनर्निर्माण में बिल्ड समय लगता है।
- अधिकांश महीनों में कुछ नहीं करना पड़ता। पुनर्निर्माण केवल तभी होता है जब अपस्ट्रीम ने कोई नया रिलीज़ प्रकाशित किया हो।
- अभी कौन सा अपस्ट्रीम बिल्ड उपयोग में है? इस पेज के शीर्ष पर दिए गए आर्काइव मेटाडेटा बटन का उपयोग करें। यह सीधे आर्काइव का अपना हेडर पढ़ता है, इसलिए उत्तर हमेशा वर्तमान होता है, न कि इस पेज पर लिखी कोई पुरानी जानकारी।
- पुनर्निर्माण तुरंत पूरा नहीं होता। यह एक-एक करके लगभग साढ़े छह घंटों में फैले तेरह अलग-अलग पुनर्निर्माणों में पूरा होता है। उस समय के अधिकांश भाग में यह प्रति दो अपस्ट्रीम बिल्ड का मिश्रण होती है। इस दौरान माँगी गई कोई टाइल हेडर द्वारा बताए गए बिल्ड के बजाय नए बिल्ड से आ सकती है, जो टूटे हुए नक्शे के रूप में नहीं बल्कि गलत जगह की टाइल के रूप में दिखती है।
- पुनर्निर्माण छूट भी सकता है। यह सर्वोत्तम प्रयास (best-effort) पर आधारित कार्य है, कोई गारंटी नहीं। यदि एक चरण विफल हो जाता है, तो बाकी प्रति पिछले अपस्ट्रीम बिल्ड पर ही बनी रहती है। नक्शा फिर भी काम करता रहता है।