Myndavélin — erfiðasti hluti abstraktionarinnar
Myndavélin er bæði það erfiðasta og verðmætasta sem MapConductor sameinar. Eitt líkan — position, zoom, bearing, tilt, visibleRegion — ber sömu merkingu í meira en tíu kortavélum. Réttu sama MapCameraPosition til hvaða þjónustuaðila sem er og þú færð sömu sýn.
01 · Hvers vegna það skiptir máli að sameina hana
Hver vél hefur sitt eigið myndavélarlíkan: sumar tala í aðdrætti, sumar í hæð myndavélar, sumar snúast um skotmark á jörðu, sumar hreyfa augað sjálft. Notaðu innbyggðu SDK-in beint og skipti um þjónustuaðila gefa þér aðra sýn út frá sömu tölum — og endurskrift á rökvísi skjásins.
MapConductor lokar þennan mun inni í millistykkjalaginu og birtir eitt myndavélarlíkan. Staða myndavélar verður gildi sem þú getur borið milli þjónustuaðila. Camera Sync-síðan í sýnisforritunum ýtir einni stöðu í alla þjónustuaðila í einu, svo þú sérð þá stillast upp á sama stað, sama kvarða og sama halla.
Aðdráttur eða hæð
2D-flísavélar tjá kvarða sem aðdráttarstig; 3D-vélar sem hæð myndavélar eða fjarlægð. Ólíkar einingar, ólíkt viðmið.
Skotmark eða auga
Sumar vélar snúast um punkt á jörðu; aðrar eru skilgreindar af stöðu augans og því hvert það horfir.
Hve langt hún hallast
Hámarkshalli er ólíkur eftir vélum — og ekki ein einasta þeirra getur hallað upp á við.
val camera = MapCameraPosition(
position = geoPoint,
zoom = 18.0,
tilt = 70.0,
)
moveCameraTo(camera)02 · Sameinaða myndavélarlíkanið
Myndavél er eitt MapCameraPosition. Það er engin gerð fyrir hvern þjónustuaðila: búðu til gildið og réttu það til moveCameraTo.
copy() skiptir út einstökum sviðum, og samanburður notar vikmörkin 0,01 á aðdrátt og halla svo örlítið rek sem vél tilkynnir sé ekki misskilið sem hreyfing.
03 · Aðdráttarstig og hæð sem eitt hugtak
Innanhúss er aðdrátturinn sami hlutur og hæð myndavélarinnar. Umreiknari í kjarnanum varpar 2D-aðdráttarstigum í 3D-hæð og fjarlægð og til baka, svo hvert gildi þjónustuaðila er staðlað á einn sameiginlegan aðdráttarkvarða — þann sem Google Maps notar — áður en það kemst í kóðann þinn.
Þetta viðmið var ekki leitt út á blaði. Kvörðunartól í sýnisforritunum mælir svæðið sem hver vél sýnir raunverulega við tiltekinn aðdrátt, og viðmiðunarhæðin var stillt þar til svæðin stemmdu. Aðdráttur 14 þekur því sama land alls staðar.
Sami aðdráttur krefst mismunandi hæðar eftir breiddargráðu
Web Mercator stækkar kortið eftir því sem nær dregur pólunum, svo hæð myndavélarinnar fyrir eitt aðdráttarstig er margfalt önnur við miðbaug en á háum breiddargráðum. Umreikningurinn aðdráttur ⇄ hæð tekur tillit til þess.
Einu fastarnir eru tvöföldun á hverju þrepi og hæðin við aðdrátt 0. Breiddargráðan er hluti af umreikningnum, svo kvarðinn rekur ekki milli Tókýó og Honolulu.
04 · Neikvæður halli, eftirlíktur
Halli liggur frá −60 til 60 gráðu. Jákvætt er kunnuglega skásýnin; neikvætt horfir upp fyrir sjóndeildarhringinn. Engin kortavél getur tjáð það beint — hvert SDK tekur aðeins við halla sem er núll eða meira.
Því heldur MapConductor stöðu og stefnu augans og endurskrifar beiðnina sem jákvæðan halla. Frá kóðanum þínum séð virkar neikvæður halli einfaldlega, og þegar myndavélin er lesin til baka færðu neikvæða gildið aftur.
Grunnmynd beint niður: rétthyrningurinn á jörðu er rétthyrningur skjásins.
Hallandi fram: jörðin verður að trapisu, mjó nærri, breið fjær.
Horft upp fyrir sjóndeildarhringinn — sýn sem engin vél býður innbyggt.
Eina undantekningin er Google Maps 2D á React — rasterkortið úr JavaScript-API-inu. Halli þess ræðst af vafra og flísum, svo hvorki hæðin né stefnan sem eftirlíkingin byggir á verða stýrðar. Google Maps 3D (Map3DElement) styður neikvæðan halla.
// Sendu bara −60…60 sleðann beint áfram; neikvætt gildi er sama kallið currentPosition = currentPosition.copy(tilt = tilt) mapViewState.value?.moveCameraTo(currentPosition)
func setTilt(_ angle: Double, state: any MapViewStateProtocol) {
currentPosition = currentPosition.copy(tilt: angle)
state.moveCameraTo(cameraPosition: currentPosition)
}<SliderControl
label="Tilt" value={tilt} min={-60} max={60} step={1}
onChange={value => {
setTilt(value);
const next = cameraPositionRef.current.copy({ tilt: value });
cameraPositionRef.current = next;
mapViewState.moveCameraTo(next, 400);
}}
/>05 · VisibleRegion — það sem er raunverulega á skjánum
Hallaðu myndavélinni og rétthyrningur skjásins verður trapisa á jörðu. Kassi með suðvestri og norðaustri getur ekki tjáð hve miklu mjórri nálæga brúnin er. VisibleRegion ber þann kassa auk hnita fjögurra horna skjásins á jörðu.
Near er neðri brún skjásins, næst myndavélinni; far er efri brúnin. Left og right miðast við skjáinn, svo snúningur með bearing breytir ekki merkingu þeirra. Með alla fjóra punktana geturðu afmarkað gagnafyrirspurnir og heimildatexta rétt, jafnvel á hallandi korti.
mapViewState.cameraPosition.visibleRegion?.let { region ->
val sw = region.bounds.southWest
val ne = region.bounds.northEast
// Fjögur horn hallandi skjás — nothæf sem trapisa
val corners = listOf(region.nearLeft, region.nearRight, region.farLeft, region.farRight)
}if let region = cameraPosition.visibleRegion {
let bounds = region.bounds
let corners = [region.nearLeft, region.nearRight, region.farLeft, region.farRight]
}<MapViewContainer initialCamera={INIT_CAMERA} onCameraMove={setCameraPosition}>
{/* Stilltu upp því sem cameraPosition.visibleRegion inniheldur */}
</MapViewContainer>
const visibleRegion = cameraPosition?.visibleRegion ?? null;
visibleRegion?.nearLeft?.toUrlValue(5);
visibleRegion?.farRight?.toUrlValue(5);