Skjölun / Grunnatriði / Fjöllína

Fjöllína

Búðu til einn stöðuhlut úr lista af hnitum og útlínustíl og settu hann svo í kortasýnina. Útlit línunnar, hvernig hún sveigist og hvernig snerting er greind vill verða ólíkt milli þjónustuaðila, en MapConductor jafnar það svo niðurstaðan sé sú sama alls staðar.

POINTS
GeoPoint[]
STROKE
color · width
GEODESIC
true / false
EVENT
onClick
Vettvangur

01 · Staða fjöllínu

PolylineState stendur fyrir eina línu: hnit hennar, útlínu og snertistjóra. Að úthluta á eigind uppfærir línuna á staðnum, svo leið sem breytist þarf aldrei að endurbyggja.

PolylinePageViewModel.kt · Jetpack Compose
val polylineState =
    PolylineState(
        points = routePoints,
        strokeColor = Color.Red,
        strokeWidth = 4.dp,
        geodesic = true,
        onClick = { event -> viewModel.onPolylineClick(event) },
    )

// Settu það einfaldlega inn í kortið
Polyline(polylineState)

// Að breyta forminu er ekkert annað en að endurskrifa points
polylineState.points = nextPoints
Eigind
Lýsing
points
Hnitin sem mynda línuna; úthlutaðu til að breyta löguninni.
strokeColor
Litur útlínunnar, gegnsæi meðtalið.
strokeWidth
Breidd útlínu í rökrænum einingum vettvangsins, svo hún lítur eins út við hvaða skjáþéttleika sem er.
geodesic
Hvort punktarnir séu tengdir eftir stórbaugum. Sjálfgefið false.
zIndex
Röð í stafla gagnvart öðrum yfirlögum.
extra
Hvaða gögn sem er, skilað til baka við snertingu.
onClick
Snertistjóri; tekur við stöðu línunnar og hnitinu sem snert var.

02 · Beinar línur og stórbaugar

Sé geodesic sett á true eru punktarnir tengdir eftir stystu leið yfir hnöttinn, svo löng flugleið teiknast sem bogi frekar en bein lína. Með false færðu beina línu í vörpun kortsins. Sömu hnit má teikna á báða vegu hlið við hlið.

geodesic = false
Bein lína í vörpuninni. Munar varla yfir stuttar vegalengdir; víkur merkjanlega frá raunverulegri stystu leið yfir langar.
geodesic = true
Stysta leiðin yfir hnöttinn, dregin sem bogi sem svignar í átt að pólunum.
Tvær línur úr sömu punktum
Polyline(polylineState) // geodesic = true (bogadregið)
Polyline(
    polylineState.copy(
        id = "${polylineState.id}-straight",
        geodesic = false,
        strokeColor = Color.Blue,
    ),
)

03 · Sama niðurstaða hjá hverjum þjónustuaðila

Sumar vélar geta teiknað stórbauga og aðrar ekki; einingar fyrir línubreidd eru ólíkar; línur sem fara yfir daglínuna eru meðhöndlaðar á ólíkan hátt. Á hráum SDK-um gefa sömu hnit þér ólíkar myndir.

MapConductor jafnar þennan mun innanhúss. Þú réttir einn PolylineState og færð sama boga, sömu þykkt og sama snertisvæði hjá hverjum þjónustuaðila.

GEODESIC

Sami boginn jafnvel án stuðnings við sveigjur

Fyrir vélar sem geta ekki teiknað stórbauga er línunni breytt í þéttan lista af hnitum áður en hún er afhent, svo bogatnn sem birtist stemmir alls staðar.

ANTIMERIDIAN

Línur sem fara yfir daglínuna

Gefin óbreytt beina sumar vélar slíkri línu löngu leiðina umhverfis hnöttinn. Að kljúfa hana við mörkin fær hverja vél til að taka styttri hliðina.

STROKE WIDTH

Einn grunnur fyrir þykkt

Breiddin er gefin í rökrænum einingum vettvangsins og umreiknuð innanhúss fyrir skjáþéttleika og einingamun milli véla, svo línan lítur jafn þykk út á raunverulegum tækjum.

HIT TEST

Sameiginleg smellprófun

Snertigreining er ekki eftirlátin vélinni. Vikmörk á stærð við fingurgóm eru umreiknuð í metra fyrir núverandi aðdrátt, svo línur haldast jafn auðhittanlegar í hvaða kvarða sem er; línur eftir stystu leið eru prófaðar eftir boganum.

Mynd · þegar farið er yfir daglínuna
180°
Gefið óbreytt: sumar vélar draga línuna löngu leiðina umhverfis hnöttinn.
180°
Gegnum MapConductor: klofið við mörkin, svo hver vél tekur styttri hliðina.
Sýnidæmi á myndbandi · ein SwiftUI-útfærsla á Google Maps og MapLibre

04 · Snerting

onClick tekur við stöðu línunnar og staðsetningunni sem snert var eftir henni. Sú staðsetning er felld að næsta punkti á línunni, svo þú getur sleppt merki þar eða mælt út frá henni.

event.state

Staða línunnar sem snert var — lestu lit hennar eða extra-gögnin.

event.clicked

Hnit á línunni: næsti punktur, ekki hrá staðsetning fingursins.

Vikmörk

Spássía á stærð við fingurgóm, umreiknuð í metra fyrir núverandi aðdrátt.

PolylineClickPageViewModel.kt
// Slepptu merki þar sem snert var
fun onPolylineClick(event: PolylineEvent) {
    markers = markers + MarkerState(
        position = event.clicked,
        animation = MarkerAnimation.Drop,
        icon = DefaultMarkerIcon(fillColor = event.state.strokeColor),
    )
}

Bútum utan sýnilega svæðisins er sleppt, svo margar langar leiðir haldast lipur. Þar sem línur skarast vinnur sú næsta.

Tengdar síður