दस्तावेज़ / सेटअप / React / Mapbox

Mapbox का सेटअप

ये Mapbox को MapConductor के ज़रिए Web पर इस्तेमाल करने का तरीका है। एक्सेस टोकन की ज़रूरत सिर्फ़ उस समय होती है जब आप Mapbox-होस्ट की स्टाइल (mapbox:// से शुरू होने वाली) इस्तेमाल कर रहे हों।

PACKAGE
react-for-mapbox
API KEY
स्टाइल के ऊपर निर्भर करता है
CSS
ज़रूरी
REACT NATIVE
कोई नहीं
वही प्रोवाइडर, दूसरे प्लेटफ़ॉर्मAndroidiOS

शुरू करने से पहले

Node.js 18 या उससे नया
अगर आप Mapbox-होस्ट स्टाइल इस्तेमाल कर रहे हैं तो पब्लिक एक्सेस टोकन चाहिए
STEP 01

इंस्टॉल करें

mapbox-gl पैकेज में शामिल है, इसलिए आपको अलग से इंस्टॉल करने की ज़रूरत नहीं है। React Native वर्ज़न उपलब्ध नहीं है।

terminalnpm
npm install @mapconductor/js-sdk-core @mapconductor/js-sdk-react \
            @mapconductor/react-for-mapbox
STEP 02

स्टाइलशीट लोड करें

इसे ऐप के एंट्री-पॉइंट पर सिर्फ़ एक बार लोड करें। अगर आप भूल गए तो मैप की पोज़ीशन और कंट्रोल का लुक़ खराब हो सकता है।

main.tsxTypeScript
import '@mapconductor/react-for-mapbox/style.css';
STEP 03

एक्सेस टोकन पास करें (अगर ज़रूरत हो)

टोकन को स्टेट हुक में पास करें। आंतरिक रूप से यह mapboxgl.accessToken में ग्लोबल सेटिंग के रूप में सेट होता है। अगर आप सिर्फ़ OSM-आधारित डिज़ाइन इस्तेमाल कर रहे हैं तो इसे छोड़ा जा सकता है।

HelloMap.tsxTypeScript · React
const mapState = useMapboxViewState({
  id: 'mapbox-map',
  accessToken: import.meta.env.VITE_MAPBOX_ACCESS_TOKEN,
  mapDesignType: MapboxDesign.Streets,
  cameraPosition: createMapCameraPosition({ position: TOKYO, zoom: 12 }),
});
कुंजी को व्यू component के props में नहीं, बल्कि स्टेट हुक में पास करें। इसे props में रखने पर यह टेस्ट लॉग और स्नैपशॉट में घुल जाती है।
सावधानी
कुंजी को बिल्ड-टाइम एनवायरनमेंट वैरिएबल (Vite के लिए import.meta.env.VITE_*) से पास करें, और इसे सोर्स कंट्रोल में न रखें। जब तक यह फ्रंटएंड तक जाता है, सार्वजनिक होने पर नुकसान न हो, इसलिए रेफरर प्रतिबंध या डोमेन प्रतिबंध ज़रूर लगाएं।

जाँच

आपको क्या दिखना चाहिए

OsmBright इस्तेमाल करके आप बिना टोकन के भी काम करने की पुष्टि कर सकते हैं।

HelloMap.tsxTypeScript · React
import { useState } from 'react';
import { createGeoPoint, createMapCameraPosition, createMarkerState } from '@mapconductor/js-sdk-core';
import { Marker } from '@mapconductor/js-sdk-react';
import { MapboxDesign, MapBoxMapView2D, useMapboxViewState } from '@mapconductor/react-for-mapbox';
import '@mapconductor/react-for-mapbox/style.css';

const TOKYO = createGeoPoint({ latitude: 35.6812, longitude: 139.7671 });

export function HelloMap() {
  // No token needed for the OsmBright design
  const mapState = useMapboxViewState({
    id: 'mapbox-map',
    mapDesignType: MapboxDesign.OsmBright,
    cameraPosition: createMapCameraPosition({ position: TOKYO, zoom: 12 }),
  });
  const [markerState] = useState(() => createMarkerState({ id: 'tokyo', position: TOKYO }));

  return (
    <MapBoxMapView2D state={mapState} style={{ height: 480 }}>
      <Marker state={markerState} />
    </MapBoxMapView2D>
  );
}

स्टेट ऑब्जेक्ट

ये useMapboxViewState द्वारा प्राप्त पैरामीटर हैं। ध्यान दें कि व्यू का export नाम MapBoxMapView / MapBoxMapView2D (B बड़ा अक्षर) है।

signatureTypeScript
useMapboxViewState({
  id?: string;
  accessToken?: string;
  mapDesignType?: MapboxMapDesignType; // default MapboxDesign.Streets
  cameraPosition?: MapCameraPosition;  // default MapCameraPosition.Default
})

मैप डिज़ाइन

MapboxDesign दो समूहों में बंटता है: जिनमें टोकन चाहिए और जिनमें नहीं।

MapboxDesign
Notes
Streets / Outdoors / Light / Dark
Mapbox होस्ट। टोकन चाहिए
SatelliteStreets
Mapbox-होस्ट उपग्रह चित्र। टोकन चाहिए
OsmBright / OsmBrightEn / OsmBrightJa
MapLibre के साथ सामान्य OSM स्टाइल। टोकन की ज़रूरत नहीं
MapTilerToner* / MapTilerBasic* / OpenMapTiles
यह भी MapLibre के साथ सामान्य। टोकन की ज़रूरत नहीं

समस्या निवारण

सिर्फ़ Mapbox की स्टाइल दिखाई नहीं दे रही

  • mapbox:// से शुरू होने वाली स्टाइल के लिए टोकन चाहिए। जांचें कि क्या आप accessToken पास कर रहे हैं।
  • जांचें कि टोकन पब्लिक टोकन है और एक्सपायर नहीं हुआ है।

ज़ूम स्तर दूसरे प्रोवाइडर से अलग है

  • MapConductor Google के मानक के अनुसार ज़ूम सेट करता है। Mapbox उसमें वास्तविक ऑफसेट (googleZoom ≒ mapboxZoom + 1.0) लगाकर कन्वर्ज़ करता है।

डेवलपमेंट के दौरान मैप दो बार इनिशियलाइज़ होता है

  • React StrictMode effect को दो बार चलाता है। हर प्रोवाइडर इसे पहचानकर एक को खारिज कर देता है, इसलिए StrictMode हटाने की ज़रूरत नहीं है।

आगे

MapLibre के समान संरचना के कारण, mapDesignType का परिवर्तन मानचित्र का पुनर्निर्माण करेगा।