दस्तावेज़ / मानचित्र दृश्य / प्रदाता बदलें

प्रदाता बदलें

प्रदाता अनुसार अंतर केवल तीन चीज़ों में है: निर्भरता मॉड्यूल, मानचित्र दृश्य का प्रकार, और स्थिति वस्तु का प्रकार। मार्कर, आकृतियाँ, कैमरा संचालन, और इवेंट लिखने का तरीका नहीं बदलता। आप एक ही स्क्रीन पर कई प्रदाताओं को एक साथ रख सकते हैं और रनटाइम में उनके बीच स्विच कर सकते हैं।

ANDROID
8 प्रदाता
iOS
9 प्रदाता
REACT
13 प्रदाता

01 · क्या बदलता है और क्या नहीं बदलता

बदलता है
  • निर्भरता मॉड्यूल (for-maplibre → for-googlemaps आदि)
  • मानचित्र दृश्य का प्रकार (MapLibreMapView → GoogleMapView)
  • स्थिति ऑब्जेक्ट का प्रकार और उसकी जनरेशन फ़ंक्शन
  • mapDesignType में पास करने के लिए डिज़ाइन स्थिरांक
  • API कुंजी प्राप्त करने की विधि और आरंभीकरण की विधि
नहीं बदलता
  • GeoPoint · GeoRectBounds · MapCameraPosition
  • MarkerState · PolylineState · PolygonState · CircleState …
  • moveCameraTo() · fitBounds() · इवेंट हैंडलर
  • भौगोलिक गणना (दूरी · दिशा · क्षेत्रफल)
  • विस्तारित परत (क्लस्टरिंग · हीट मैप · GeoJSON)

स्थिति वस्तु का प्रकार प्रदाता के अनुसार अलग है, लेकिन यह एक सामान्य इंटरफ़ेस को लागू करता है (Android: MapViewStateInterface, iOS: MapViewStateProtocol, React: MapViewStateInterface)। कैमरा संचालन और डिज़ाइन स्विचिंग इस सामान्य इंटरफ़ेस के माध्यम से लिखे जा सकते हैं।

चित्र · प्रत्येक प्रदाता वास्तव में जो मानचित्र बनाता है (सैंपल ऐप से)
GOOGLE MAPS
MAPLIBRE
MAPBOX
HERE
ARCGIS

02 · प्रदाता-विशिष्ट प्रकार

प्रत्येक प्रदाता द्वारा प्रदान किए गए मानचित्र दृश्य और स्थिति वस्तुओं की सूची। ऐतिहासिक कारणों से नाम पूरी तरह से संगत नहीं हैं, इसलिए वास्तव में निर्यात किए गए नामों को यथावत दिखाया गया है।

Provider
Android
iOS
React
Google Maps
GoogleMapView
rememberGoogleMapViewState
GoogleMapViewState
GoogleMapView
GoogleMapViewState
GoogleMapView2D / GoogleMapView
useGoogleMapViewState
MapLibre
MapLibreMapView
rememberMapLibreMapViewState
MapLibreViewState
MapLibreMapView
MapLibreViewState
MapLibreMapView2D
useMapLibreViewState
Mapbox
MapboxMapView
rememberMapboxMapViewState
MapboxViewState
MapboxMapView
MapboxViewState
MapBoxMapView2D / MapBoxMapView
useMapboxViewState
HERE
HereMapView
rememberHereMapViewState
HereViewState
HereMapView
HereMapViewState
HereMapView2D
useHereViewState
ArcGIS
ArcGISMapView / 2D
rememberArcGISMapViewState
ArcGISMapViewState
ArcGISMapView / 2D
ArcGISMapViewState
ArcGISMapView2D / ArcGISMapView
useArcGISViewState
MapTiler
MapTilerMapView
rememberMapTilerMapViewState
MapTilerViewState
MapTilerMapView
MapTilerViewState
MapTilerMapView2D
useMapTilerViewState
TomTom
TomTomMapView
rememberTomTomMapViewState
TomTomMapViewState
TomTomMapView
TomTomMapViewState
TomTomMapView2D
useTomTomViewState
Longdo
LongdoMapView
rememberLongdoMapViewState
LongdoViewState
LongdoMapView
LongdoViewState
LongdoMapView2D
useLongdoViewState
Apple MapKit
MapKitMapView
MapKitViewState
MapKitMapView
useMapKitViewState
Leaflet
LeafletMapView
useLeafletMapViewState
OpenLayers
OpenLayersMapView
useOpenLayersMapViewState
Azure Maps
AzureMapsMapView
useAzureMapsViewState
Cesium
CesiumMapView
useCesiumMapViewState

"/ 2D" का अर्थ है कि 3D और 2D दृश्य दोनों उपलब्ध हैं। दोनों एक ही स्थिति वस्तु साझा करते हैं, और 2D में tilt हमेशा 0 होता है।

प्लेटफ़ॉर्म

03 · स्विच करने का तरीका

रनटाइम में स्विच करने के लिए, प्रत्येक प्रदाता के लिए एक-एक स्थिति वस्तु रखें और केवल प्रदर्शित दृश्य को शाखा दें। ओवरले का विवरण शाखा के बाहर रखा जा सकता है। सैंपल ऐप इसी रूप में है।

MapViewContainer.kt · Jetpack Compose
@Composable
fun MapViewContainer(
    modifier: Modifier = Modifier,
    state: MapViewStateInterface<*>? = null,
    content: (@Composable MapViewScope.() -> Unit)? = null,
) {
    when (state) {
        is GoogleMapViewState -> GoogleMapView(modifier, state, content = content)
        is MapLibreViewState -> MapLibreMapView(modifier, state, content = content)
        is MapboxViewState -> MapboxMapView(modifier, state, content = content)
        is HereViewState -> HereMapView(modifier, state, content = content)
        else -> { /* not selected */ }
    }
}

// बुलाने वाला सिर्फ़ ओवरले लिखता है
MapViewContainer(state = selectedState) {
    Markers(markerStates)
}

React में हुक कॉल क्रम नहीं बदला जा सकता है, इसलिए प्रदाता-विशिष्ट दृश्यों को अलग घटकों में निकालना और उस घटक के अंदर हुक कॉल करना सुरक्षित है। सैंपल ऐप का providers/ डायरेक्टरी यही संरचना है।

वीडियो में दिखाया गया कार्यान्वयन · Android + MapLibreKotlin · Jetpack Compose
// One state per provider
val maplibre = rememberMapLibreMapViewState(
    mapDesign = MapLibreDesign.OsmBrightJa,
    cameraPosition = MapCameraPosition(
        position = GeoPoint.fromLatLong(35.6812, 139.7671),
        zoom = 12.0,
    ),
)
val googlemaps = rememberGoogleMapViewState(
    cameraPosition = MapCameraPosition(
        position = GeoPoint.fromLatLong(35.6812, 139.7671),
        zoom = 12.0,
    ),
)
var useMapLibre by remember { mutableStateOf(true) }

// The overlays are declared outside the branch, so swapping does not touch them
val overlays: @Composable MapViewScope.() -> Unit = {
    Marker(markerState)
    Polyline(routeState)
}

// Hand the camera you were just looking at to the side you are switching to
LaunchedEffect(useMapLibre) {
    if (useMapLibre) {
        maplibre.moveCameraTo(googlemaps.cameraPosition)
    } else {
        googlemaps.moveCameraTo(maplibre.cameraPosition)
    }
}

if (useMapLibre) {
    MapLibreMapView(state = maplibre, content = overlays)
} else {
    GoogleMapView(state = googlemaps, content = overlays)
}
सैंपल वीडियो · चलाते समय प्रदाता बदलना
वीडियो अभी नहीं बनासैंपल ऐप में, ओवरले रखे हुए केवल मानचित्र दृश्य बदलते हुए। मार्कर और पॉलीलाइन बदलने से पहले और बाद में समान स्थिति पर बने रहते हैं, यह देखने से इस खंड का मुख्य बिंदु स्पष्ट होता है।

04 · प्रदाता अंतर का उपचार

सभी मानचित्र SDK में समान कार्यक्षमता नहीं होती। MapConductor जहाँ भी अंतर को पूरा किया जा सकता है वहाँ पूरा करता है, और जहाँ नहीं किया जा सकता वहाँ वैकल्पिक प्रतिनिधित्व प्रदान करता है।

1 · वैकल्पिक रेंडरिंग

यदि देशी रूप से कोई फ़ंक्शन नहीं है, तो SDK द्वारा रास्टर टाइल के रूप में रेंडर किया जाएगा। पॉलीगन के छेद और बड़ी मात्रा में मार्कर रेंडरिंग इसके अंतर्गत आते हैं। कॉलिंग साइड कोड नहीं बदलता है।

2 · प्रकार से संकेत देना

उस प्रदाता द्वारा संभाले न जा सकने वाले तत्वों के लिए, ड्राइवर के पास कोई संगत रेंडरर नहीं होता है। यह उपयोग किया जा सकता है या नहीं, यह कंपाइल समय या स्थिति ऑब्जेक्ट के प्रकार से निर्धारित किया जा सकता है।

3 · बचाव का रास्ता

यदि उस प्रदाता विशिष्ट फ़ंक्शन की आवश्यकता है, तो आप MapViewHolder से देशी मानचित्र इंस्टेंस ले सकते हैं और सीधे कॉल कर सकते हैं।

API KEYS

कुंजी और आरंभीकरण प्रदाता के अनुसार

MapConductor API कुंजी स्वीकार नहीं करता है। यह प्रत्येक मानचित्र SDK द्वारा आवश्यक विधि (Android मेनिफेस्ट, iOS में sdkInitialize, Web कॉन्फ़िगरेशन ऑब्जेक्ट) के अनुसार सीधे पास करता है। MapLibre·Leaflet·OpenLayers जैसे प्रदाताओं को कुंजी की आवश्यकता नहीं होती है, और उस स्थिति में केवल टाइल स्रोत निर्धारित किया जाता है।

संबंधित पेज