Skjölun / Kortasýn / Að lesa myndavélina

Að lesa stöðu myndavélarinnar

Stýringar MapConductor hafa ekkert getCameraPosition() — á engum vettvanganna þriggja. Þetta er fyrsta aðferðin sem fólk leitar að, svo þessi síða segir hvað skal nota í staðinn og hvers vegna sækjarinn er ekki til.

Í einni línu: myndavélinni er ýtt til þín, þú sækir hana ekki. Korta-SDK-ið veit þegar hvenær hún breyttist — þú þarft aðeins að taka við.

01 · Þrjár leiðir

Veldu eftir því hvað þú ert að gera. Allar þrjár rétta þér sama MapCameraPosition, með sýnilega svæðið á visibleRegion.

þarf það núna
mapViewState.cameraPosition — læsilegt hvenær sem er. Sýnilega svæðið er cameraPosition.visibleRegion.bounds.
fylgja breytingum
onCameraMove / onCameraMoveEnd — ræsast líka meðan á hreyfingunni stendur. Notaðu þau til að halda viðmótinu í takt.
viðbótareining
skráðu þig sem yfirlagsstýringu og taktu við onCameraChanged. Engin barátta um einnar-raufar hlustendur kortastýringarinnar.
Vettvangur
lesa úr stöðunni
val camera = mapViewState.cameraPosition
val bounds = camera.visibleRegion?.bounds

// Fylgstu með breytingunum
MapView(
    state = mapViewState,
    onCameraMoveEnd = { camera -> reload(camera.visibleRegion?.bounds) },
)

02 · Hvers vegna enginn sækjari er til

MapConductor situr á lýsandi viðmóti á öllum þremur vettvöngunum (Compose, SwiftUI, React). Í því líkani er einn staður sem geymir það sem er satt núna, og viðmótið er vörpun af honum. Myndavélin er staða, svo hún býr á stöðuhlutnum.

Að bæta sækjara við stýringuna býr til aðra uppsprettu fyrir sama gildið: aðra úr stöðunni, hina lesna beint af SDK-inu. Þær eiga að vera sammála, svo það eina sem þú hefur bætt við er svigrúm til að vera ósammála. Það var einmitt það sem gerðist — fyrir brottnámið var myndavélin byggð tvisvar í sama ramma: einu sinni fyrir SDK-atburðinn, aftur við hverja endurteiknun.

ýtiflæðið
Camera event from the map SDK
        ↓  the provider reads the SDK's raw values, converts to unified zoom, attaches visibleRegion
   state.updateCameraPosition(camera)
        ↓
   ├─ mapViewState.cameraPosition               (readable at any time)
   ├─ onCameraMove / onCameraMoveEnd            (the app's callbacks)
   └─ onCameraChanged on registered overlays    (extension modules)
Öll þrjú SDK-in vinna svona. Innbyggðu tvö höfðu aldrei sækjara á stýringunni; react-sdk hafði hann og hann var fjarlægður 2026-08-06.

03 · Hvað sókn kostar

Hönnunarrök ein og sér bjóða upp á "einn sækjari getur varla skaðað", svo hér eru mælingarnar. Það er ekki ódýrt að byggja myndavélina einu sinni.

Hvað eitt kall gerir

Lesa center / zoom / bearing / tilt úr SDK-inu, umreikna í sameinaða aðdráttinn gegnum ZoomAltitudeConverter þjónustuaðilans, og svo afvarpa fjögur horn skjásins til að byggja visibleRegion. Síðasta skrefið er það dýra — þetta er enginn venjulegur sækjari.

Mælt á MapLibre-merkjasýnidæminu í Chromium, þar sem talin voru getCameraPosition()-köll í einum drætti (hliðrun sem spannar um 20 ramma).

fyrsta hleðsla
einn dráttur
með sækjaranum
5
86
eftir brottnám
3
30

Um 65% færri köll, og hvert brottfallið kall var endurbygging. Myndavélin var sett saman einu sinni fyrir SDK-atburðinn og ýtt í stöðuna, svo setti hver endurteiknun sama gildið saman aftur. Kallið sat í öllum 13 sýnum þjónustuaðilanna, hver og ein að henda gildi sem var nýbúið að ýta.

Í kyrrstöðu voru köllin 0. Ekkert var á fleygiferð — þetta er sú tegund kostnaðar sem lendir aðeins meðan notandinn er að vinna með kortið, það er að segja bætist ofan á einmitt þegar kortið er þegar sem annasamast.

Það sem myndbandið sýnir · Android + MapLibreKotlin · Jetpack Compose
var camera by remember { mutableStateOf<MapCameraPosition?>(null) }

MapLibreMapView(
    state = mapViewState,
    modifier = Modifier.weight(1f),
    // Fires throughout the gesture — keep this handler cheap
    onCameraMove = { position -> camera = position },
    // Once, when the map settles. Fetching and redrawing belong here
    onCameraMoveEnd = { position -> viewModel.onCameraSettled(position) },
)

camera?.let { position ->
    Text("lat  %.5f".format(position.position.latitude))
    Text("lng  %.5f".format(position.position.longitude))
    Text("zoom %.2f".format(position.zoom))
    // Read the visible region off the value you were handed; do not rebuild it
    position.visibleRegion?.bounds?.let { bounds ->
        Text("SW ${bounds.southWest}  NE ${bounds.northEast}")
    }
}
Sýnidæmi á myndbandi · gildi lesin meðan kortið hreyfist
Myndband ekki tekið upp ennBreidd, lengd og aðdráttur uppfærast á skjánum úr afturkallinu meðan kortið er dregið. Munurinn á sókn og ýtingu kemur fram í því hvernig sú eftirfylgd hagar sér.

04 · Rammans töf

mapViewState.cameraPosition er síðasta gildið sem var ýtt, svo í grunninn getur það verið einum ramma á eftir SDK-inu. Það er eina raunverulega ástæðan til að vilja sækjara, svo hér er hún sögð berum orðum.

í reynd

onCameraMove ræsist í hverjum ramma meðan á hreyfingunni stendur, svo staðan er aldrei meira en einum ramma á eftir. Teiknun, gagnasókn og svæðaprófanir líta öll eins út — allar 41 vafraprófanirnar stóðust óbreyttar eftir brottnámið.

hvar það gæti skipt máli

Teiknun sem verður að vera læst við sama ramma í miðjum drætti. Það heyrir undir teiknilykkju korta-SDK-sins sjálfs, sem er neyðarútgangurinn hér að neðan fremur en sameinaða API-ið.

05 · Þegar þú þarft hráa gildið í alvöru

Ef staðan dugar ekki — segjum að þú þurfir að samstilla við teiknilykkju korta-SDK-sins — farðu þá ekki fram hjá sameinaða API-inu: taktu innbyggða kortatilvikið út úr MapViewHolder. Það er kóði bundinn þjónustuaðila, en um leið fljótasta og nákvæmasta leiðin.

niður í innbyggða lagið
const holder = mapViewState.getMapViewHolder();
const map = holder?.map as maplibregl.Map | undefined;
const liveZoom = map?.getZoom();
Hver þjónustuaðili býr vissulega yfir kóða sem umreiknar hrá gildi SDK-sins í sameinaða aðdráttinn — það er hann sem framleiðir gildið sem myndavélaratburðirnir bera. Hann helst innan útfærslunnar og er ekki á opinbera viðmótinu, á öllum þremur vettvöngunum (android-sdk geymir private getMapCameraPosition(), ios-sdk private currentCameraPosition(from:)).

Tengdar síður