Dokumentation / Kartenansicht / Provider wechseln

Provider wechseln

Der einzige Unterschied zwischen den Providern sind die drei folgenden Punkte: abhängige Module, Typ der Kartenansicht und Typ des Zustandsobjekts. Die Handhabung von Markern, Formen, Kameraoperationen und Ereignissen ändert sich nicht. Sie können auch mehrere Provider auf demselben Bildschirm nebeneinander anzeigen und zur Laufzeit wechseln.

ANDROID
8 Anbieter
iOS
9 Anbieter
REACT
13 Anbieter

01 · Was sich ändert und was gleich bleibt

Ändert sich
  • Abhängigkeitsmodule (for-maplibre → for-googlemaps usw.)
  • Typ der Kartenansicht (MapLibreMapView → GoogleMapView)
  • Typ des Zustandsobjekts und dessen Erzeugungsfunktion
  • Designkonstanten, die an mapDesignType übergeben werden
  • So erhalten Sie einen API-Schlüssel und die Initialisierungsverfahren
Ändert sich nicht
  • GeoPoint · GeoRectBounds · MapCameraPosition
  • MarkerState · PolylineState · PolygonState · CircleState …
  • moveCameraTo() · fitBounds() · Ereignishandler
  • Geoberechnungen (Entfernung, Peilung, Fläche)
  • Erweiterungsebenen (Clustering, Heatmap, GeoJSON)

Der Typ des Zustandsobjekts ist zwar für jeden Provider getrennt, implementiert aber eine gemeinsame Schnittstelle (Android: MapViewStateInterface, iOS: MapViewStateProtocol, React: MapViewStateInterface). Kameraoperationen und Designwechsel können über diese gemeinsame Schnittstelle geschrieben werden.

Abb. · Die tatsächliche Karte, die jeder Provider rendert (aus der Beispiel-App)
GOOGLE MAPS
MAPLIBRE
MAPBOX
HERE
ARCGIS

02 · Provider-spezifische Typen

Eine Übersicht der Kartenansichten und Zustandsobjekte, die von jedem Anbieter bereitgestellt werden. Aufgrund historischer Gründe sind die Namen nicht vollständig einheitlich, daher werden die tatsächlich exportierten Namen unverändert aufgeführt.

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" bedeutet, dass es zwei Ansichten gibt: eine 3D-Ansicht und eine 2D-Ansicht. Beide teilen sich dasselbe Zustandsobjekt, und in der 2D-Ansicht ist tilt immer 0.

Plattform

03 · Wie man den Wechsel schreibt

Wenn Sie zur Laufzeit wechseln möchten, behalten Sie ein Zustandsobjekt für jeden Provider vor und verzweigen nur die angezeigte Ansicht. Die Beschreibung von Overlays kann außerhalb der Verzweigung platziert werden. Die Beispiel-App verwendet diese Form.

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 */ }
    }
}

// Der Aufrufer schreibt nur die Overlays
MapViewContainer(state = selectedState) {
    Markers(markerStates)
}

In React kann die Reihenfolge der Hook-Aufrufe nicht geändert werden, daher ist es sicher, die providerspezifischen Ansichten in separate Komponenten auszulagern und die Hooks innerhalb dieser Komponenten aufzurufen. Das Verzeichnis providers/ der Beispiel-App hat diesen Aufbau.

Implementierung im Video · 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)
}
Beispielvideo · Provider während der Ausführung wechseln
Video noch nicht aufgenommenIn der Beispiel-App: Wechseln nur der Kartenansicht, während die Overlays bestehen bleiben. Dass Marker und Polylines vor und nach dem Austausch an derselben Position bleiben, veranschaulicht die Aussage dieses Abschnitts.

04 · Umgang mit Provider-Unterschieden

Nicht alle Karten-SDKs bieten denselben Funktionsumfang. MapConductor gleicht Unterschiede aus, wo dies möglich ist, und bietetalternative Darstellungen, wo dies nicht möglich ist.

1 · Ersatzdarstellung

Wenn die Funktion nicht nativ vorhanden ist, rendert die Seite des SDK sie als Rasterkacheln. Dazu gehören Löcher in Polygonen und das massenhafte Zeichnen von Markern. Der Code des Aufrufers ändert sich nicht.

2 · Durch Typ angeben

Für Elemente, die dieser Anbieter nicht verarbeiten kann, verfügt der Treiber über keinen entsprechenden Renderer. Ob es verwendet werden kann, lässt sich zur Kompilierungszeit oder anhand des Typs des Zustandsobjekts entscheiden.

3 · Ausweg

Wenn Sie die für diesen Anbieter spezifische Funktion unbedingt benötigen, können Sie die native Karteninstanz aus `MapViewHolder` abrufen und direkt aufrufen.

API-SCHLÜSSEL

Schlüssel und Initialisierung sind anbieterspezifisch

`MapConductor` übernimmt keine API-Schlüssel. Es übergibt sie direkt in der von jedem Karten-SDK geforderten Form (Android-Manifest, `sdkInitialize` unter iOS, Konfigurationsobjekt im Web). Es gibt auch Anbieter wie `MapLibre`, `Leaflet` und `OpenLayers`, die keine Schlüssel benötigen; in diesem Fall wird nur die Quelle der Kacheln festgelegt.

Verwandte Seiten