प्रदाता बदलें
प्रदाता अनुसार अंतर केवल तीन चीज़ों में है: निर्भरता मॉड्यूल, मानचित्र दृश्य का प्रकार, और स्थिति वस्तु का प्रकार। मार्कर, आकृतियाँ, कैमरा संचालन, और इवेंट लिखने का तरीका नहीं बदलता। आप एक ही स्क्रीन पर कई प्रदाताओं को एक साथ रख सकते हैं और रनटाइम में उनके बीच स्विच कर सकते हैं।
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)। कैमरा संचालन और डिज़ाइन स्विचिंग इस सामान्य इंटरफ़ेस के माध्यम से लिखे जा सकते हैं।





02 · प्रदाता-विशिष्ट प्रकार
प्रत्येक प्रदाता द्वारा प्रदान किए गए मानचित्र दृश्य और स्थिति वस्तुओं की सूची। ऐतिहासिक कारणों से नाम पूरी तरह से संगत नहीं हैं, इसलिए वास्तव में निर्यात किए गए नामों को यथावत दिखाया गया है।
rememberGoogleMapViewState
GoogleMapViewState
GoogleMapViewState
useGoogleMapViewState
rememberMapLibreMapViewState
MapLibreViewState
MapLibreViewState
useMapLibreViewState
rememberMapboxMapViewState
MapboxViewState
MapboxViewState
useMapboxViewState
rememberHereMapViewState
HereViewState
HereMapViewState
useHereViewState
rememberArcGISMapViewState
ArcGISMapViewState
ArcGISMapViewState
useArcGISViewState
rememberMapTilerMapViewState
MapTilerViewState
MapTilerViewState
useMapTilerViewState
rememberTomTomMapViewState
TomTomMapViewState
TomTomMapViewState
useTomTomViewState
rememberLongdoMapViewState
LongdoViewState
LongdoViewState
useLongdoViewState
MapKitViewState
useMapKitViewState
useLeafletMapViewState
useOpenLayersMapViewState
useAzureMapsViewState
useCesiumMapViewState
"/ 2D" का अर्थ है कि 3D और 2D दृश्य दोनों उपलब्ध हैं। दोनों एक ही स्थिति वस्तु साझा करते हैं, और 2D में tilt हमेशा 0 होता है।
03 · स्विच करने का तरीका
रनटाइम में स्विच करने के लिए, प्रत्येक प्रदाता के लिए एक-एक स्थिति वस्तु रखें और केवल प्रदर्शित दृश्य को शाखा दें। ओवरले का विवरण शाखा के बाहर रखा जा सकता है। सैंपल ऐप इसी रूप में है।
@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)
}@StateObject private var googleState = GoogleMapViewState(cameraPosition: initial)
@StateObject private var mapLibreState = MapLibreViewState(cameraPosition: initial)
// साझा इंटरफ़ेस से कैमरे का काम बिना शाखाओं के लिखा जा सकता है
private var activeState: any MapViewStateProtocol {
provider == .googleMaps ? googleState : mapLibreState
}
@ViewBuilder
private var mapView: some View {
switch provider {
case .googleMaps:
GoogleMapView(state: googleState, sdkInitialize: {
GMSServices.provideAPIKey(apiKey)
}) { Marker(state: markerState) }
case .mapLibre:
MapLibreMapView(state: mapLibreState) { Marker(state: markerState) }
}
}// हुक हर कंपोनेंट में तय तरीके से बुलाएँ, और सिर्फ़ व्यू बदलें
const maplibre = useMapLibreViewState({ id: 'maplibre', cameraPosition: INIT });
const google = useGoogleMapViewState({ id: 'google', cameraPosition: INIT });
switch (provider) {
case 'maplibre':
return <MapLibreMapView2D state={maplibre}>{children}</MapLibreMapView2D>;
case 'google-maps':
return <GoogleMapView2D state={google}>{children}</GoogleMapView2D>;
}React में हुक कॉल क्रम नहीं बदला जा सकता है, इसलिए प्रदाता-विशिष्ट दृश्यों को अलग घटकों में निकालना और उस घटक के अंदर हुक कॉल करना सुरक्षित है। सैंपल ऐप का providers/ डायरेक्टरी यही संरचना है।
// 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 जहाँ भी अंतर को पूरा किया जा सकता है वहाँ पूरा करता है, और जहाँ नहीं किया जा सकता वहाँ वैकल्पिक प्रतिनिधित्व प्रदान करता है।
यदि देशी रूप से कोई फ़ंक्शन नहीं है, तो SDK द्वारा रास्टर टाइल के रूप में रेंडर किया जाएगा। पॉलीगन के छेद और बड़ी मात्रा में मार्कर रेंडरिंग इसके अंतर्गत आते हैं। कॉलिंग साइड कोड नहीं बदलता है।
उस प्रदाता द्वारा संभाले न जा सकने वाले तत्वों के लिए, ड्राइवर के पास कोई संगत रेंडरर नहीं होता है। यह उपयोग किया जा सकता है या नहीं, यह कंपाइल समय या स्थिति ऑब्जेक्ट के प्रकार से निर्धारित किया जा सकता है।
यदि उस प्रदाता विशिष्ट फ़ंक्शन की आवश्यकता है, तो आप MapViewHolder से देशी मानचित्र इंस्टेंस ले सकते हैं और सीधे कॉल कर सकते हैं।
कुंजी और आरंभीकरण प्रदाता के अनुसार
MapConductor API कुंजी स्वीकार नहीं करता है। यह प्रत्येक मानचित्र SDK द्वारा आवश्यक विधि (Android मेनिफेस्ट, iOS में sdkInitialize, Web कॉन्फ़िगरेशन ऑब्जेक्ट) के अनुसार सीधे पास करता है। MapLibre·Leaflet·OpenLayers जैसे प्रदाताओं को कुंजी की आवश्यकता नहीं होती है, और उस स्थिति में केवल टाइल स्रोत निर्धारित किया जाता है।