Skipt um þjónustuaðila
Nákvæmlega þrennt er ólíkt milli þjónustuaðila: viðfangið, gerð kortasýnarinnar og gerð stöðuhlutarins. Merki og form, myndavélaraðgerðir og atburðir eru skrifuð eins. Þú getur meira að segja haft fleiri en einn þjónustuaðila á sama skjá og skipt á keyrslutíma.
01 · Hvað breytist, hvað ekki
- Viðfangið (for-maplibre → for-googlemaps)
- Gerð kortasýnarinnar (MapLibreMapView → GoogleMapView)
- Gerð stöðuhlutarins og verksmiðja hans
- Hönnunarfastinn sem mapDesignType fær
- Hvernig API-lykillinn fæst og SDK-ið er frumstillt
- GeoPoint · GeoRectBounds · MapCameraPosition
- MarkerState · PolylineState · PolygonState · CircleState …
- moveCameraTo() · fitBounds() · atburðastjórar
- Landmælingar (fjarlægð, stefna, flatarmál)
- Viðbótarlög (þyrping, hitakort, GeoJSON)
Stöðugerðirnar eru bundnar hverjum þjónustuaðila, en þær útfæra allar eitt sameiginlegt viðmót — MapViewStateInterface á Android og React, MapViewStateProtocol á iOS. Myndavélarvinnu og hönnunarskipti má skrifa gegnum það viðmót.





02 · Gerðir eftir þjónustuaðilum
Það sem hver pakki þjónustuaðila flytur raunverulega út. Af sögulegum ástæðum eru heitin ekki fullkomlega samhverf, svo þessi tafla telur upp útfluttu táknin orðrétt.
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“ merkir að pakkinn býður bæði 3D- og 2D-sýn. Þær deila einum stöðuhlut; í 2D er halli alltaf 0.
03 · Að skrifa skiptin
Til að skipta á keyrslutíma skaltu halda einum stöðuhlut á hvern þjónustuaðila og greina aðeins um hvaða sýn er teiknuð. Yfirlagslýsingarnar standa utan greinarinnar. Þetta er nákvæmlega formið sem sýnisforritin nota.
@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 */ }
}
}
// Kallandinn skrifar aðeins yfirlögin
MapViewContainer(state = selectedState) {
Markers(markerStates)
}@StateObject private var googleState = GoogleMapViewState(cameraPosition: initial)
@StateObject private var mapLibreState = MapLibreViewState(cameraPosition: initial)
// Gegnum sameiginlega viðmótið þarf myndavélarvinnan engar greinar
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) }
}
}// Kallaðu á hookana á fastan hátt í hverri einingu og skiptu aðeins um sýnina
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 leyfir ekki að röð hook-kalla breytist, svo örugga formið er ein lítil eining á hvern þjónustuaðila sem kallar á sinn eigin hook. Mappan providers/ í sýnisforritinu er byggð þannig.
// 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 · Að fást við mun milli þjónustuaðila
Ekki geta öll korta-SDK allt. MapConductor brúar bilið þar sem það getur og setur annað í staðinn þar sem það getur ekki.
Þar sem innbyggða SDK-ið vantar eiginleika teiknar SDK-ið hann sem rasterflísar í staðinn — göt í marghyrningum og mjög stór merkjasöfn fara þessa leið. Kallstaðirnir þínir breytast ekki.
Eining sem þjónustuaðili ræður ekki við á einfaldlega engan teiknara í þeim rekli. Hvort hún sé í boði sést við þýðingu, eða af gerð stöðuhlutarins.
Ef þú þarft í alvöru eitthvað sem er bundið þjónustuaðilanum, dragðu innbyggða kortatilvikið út úr MapViewHolder og kallaðu beint á það.
Lyklar og frumstilling haldast eftir þjónustuaðilum
MapConductor geymir aldrei API-lykilinn þinn. Hverju korta-SDK er matað eins og það ætlast til — Android-lýsingin, sdkInitialize-lokunin á iOS, stillingahlutur á vefnum. MapLibre, Leaflet og OpenLayers þurfa engan lykil; þar velurðu aðeins hvaðan flísarnar koma.