MapConductor er opinn hugbúnaður sem setur korta-SDK á bak við eitt sameiginlegt API. Það er gefið út fyrir Android (Jetpack Compose), iOS (SwiftUI) og React (TypeScript), nær yfir 15 þjónustuaðila í dag og er gefið út undir Apache-2.0.
Þetta er fyrsta færslan um verkefnið sjálft, svo hér er hvað það gerir og hvenær það borgar sig.
Hvert korta-SDK er gott í einhverju
Google Maps, Mapbox, HERE, ArcGIS, MapLibre, MapTiler, TomTom, Longdo, Mappls — hvert um sig hefur verið fágað árum saman og hvert um sig er sterkt einhvers staðar. Nákvæmni vega og heimilisfanga, leiðsögn, tenging við fyrirliggjandi GIS-gögn, frelsi í hönnun, þekja eftir heimshlutum. Það er ekkert almennt svar við því „hvert sé best“; svarið færist til eftir því hvaða forrit þú ert að smíða og hvert þú ert að senda það.
Og þó: frá hlið útfærslunnar er það val ráðið innan fyrstu línanna. Kóði sem teiknar kort bindst þétt gerðum og hugtökum eins SDK, svo þegar þig langar loksins að bera saman er það einmitt samanburðarleiðin sem vantar.
Þetta er engin kvörtun yfir hönnun neins. Þetta er venjuleg afleiðing þess að hver framleiðandi hannar vandlega í kringum sína styrkleika: hugtökin og heitin stemma ekki. Að láta þau stemma er ekki verk þess sem lætur SDK-ið í té — það kemur í hlut þess sem skrifar ofan á það. MapConductor tekur það lag að sér.
Hvað það gerir
Forritið þitt reiðir sig aðeins á sameinaða API-ið. Reklarnir jafna muninn milli þjónustuaðila, svo skipti um þjónustuaðila þýða að breyta nákvæmlega þrennu: viðfanginu, gerð kortasýnarinnar og gerð stöðuhlutarins. Hvernig þú skrifar merki, form, myndavélarvinnu og atburði breytist ekki.
// Yfirlögunum er lýst utan greinarinnar, svo skiptin snerta þau ekki
val overlays: @Composable MapViewScope.() -> Unit = {
Marker(markerState)
Polyline(routeState)
}
if (useMapLibre) {
MapLibreMapView(state = maplibre, content = overlays)
} else {
GoogleMapView(state = googlemaps, content = overlays)
}Þú getur líka haldið á tveimur í einu og skipt á keyrslutíma. Réttu myndavélina sem þú varst að horfa á yfir á hliðina sem þú skiptir á, og skiptin sjást ekki sem stökk.
Það er ekki bara kóðinn sem stemmir
Algengasta áhyggjuefnið við „eitt sameiginlegt API“ er að ritháttur stemmi en niðurstöðurnar ekki. Aðdráttur 14 þeki ólíkt land í ólíkum umhverfum, fjarlægðin milli tveggja punkta sé ólík á Android og iOS — það gerist raunverulega.
MapConductor heldur því inni í SDK-inu.
| Útfært í SDK-inu | Hvað það færir þér |
|---|---|
| Landmælingar | Fjarlægð, stefna, flatarmál og brúun skrifuð upp úr sömu formúlum í Kotlin, Swift og TypeScript. Ekkert reiðir sig á hjálparfall úr SDK, svo tölurnar sem birtast eru aldrei ósammála milli vettvanga |
| Myndavél | Aðdráttur og hæð myndavélar umreiknast hvort í annað, kvarðað gegn mældum sýnilegum svæðum. Aðdráttur 14 þekur sama land hjá hverjum þjónustuaðila |
| Teiknun merkja | Innbyggð merki þegar þau eru fá; fram yfir 2.000 skiptir vélin sjálf yfir í rasterflísar. Myndavélin helst lipur við tugþúsundir, og ekki ein lína af kóðanum þínum breytist |
| Form | Marghyrningar með götum, stórbaugar og þess háttar eru teiknuð sem rasterflísar þar sem innbyggða SDK-ið ræður ekki við þau, svo útkoman lítur eins út |
| Heimildir | Reglur sem skipta um tilvísun eftir aðdrætti og svæði eru hluti af kortahönnunarhlutnum |
Umbúðir sem gera ekkert nema að framsenda á hvert SDK enda takmarkaðar af því SDK sem getur minnst. Þess vegna teiknar SDK-ið sjálft það sem vantar.
Hvað það er gott fyrir
Eitt API að læra
Hvert korta-SDK nefnir hlutina á sinn hátt, svo hver skipti um þjónustuaðila og hver flutningur á annan vettvang þýðir að læra þá upp á nýtt. Með MapConductor er eitt API sem ber sömu heiti og sömu merkingar á Android, iOS og React. Það sem einhver lærir á Android gildir á iOS, og innvígsla nýliða vex ekki með fjölda þjónustuaðila.
Kóði án nokkurs korta-SDK-heitis
GeoPoint og MarkerState tilheyra engu korta-SDK. Að byggja leið, prófa hvort punktur falli innan svæðis, ákveða hvað skuli sýna — þá rökvísi má skrifa án þess að ein einasta SDK-gerð komi við sögu. Sameiginlegar kortaeiningar má draga út í safn í stað þess að smíða eina á hvern þjónustuaðila.
Umræðan um kröfur fer fram einu sinni
Ólíkt korta-SDK á Android, iOS og vefnum þýðir að merki haga sér ólíkt og tölur myndavélarinnar merkja sitt hvað, svo sami eiginleikinn er skilgreindur þrisvar. Eitt sameiginlegt líkan breytir þeim þremur samtölum í eina.
Það sem við sækjumst raunverulega eftir: að geta valið
Allt hér að ofan er skrifað frá hlið þess sem fellir kort inn í forrit. Það er ekki öll sagan.
Í dag er val á korta-SDK fyrsta skuldbinding hverrar útfærslu. Það breytir valinu úr „prófa, svo ákveða“ í „ákveða, svo smíða“, og samanburðurinn kemst aldrei út úr töflureikninum. Það er ekki heldur gott ástand fyrir þann sem verið er að velja — gott SDK getur dottið út úr myndinni, ekki vegna gæða, heldur af því forritið var þegar skrifað gegn öðru.
Sameiginlegt API breytir röðinni. Þú getur keyrt þau, borið þau saman á sama skjá sama forrits, og ákveðið út frá því. Það sem ræður úrslitum er verð, þekja, hversu fersk gögnin eru, gæði teiknunar — það sem framleiðendur keppa í raun um.
Þess vegna er MapConductor byggt til að fela ekki það sem hver framleiðandi er góður í. Það sem er sameinað er sá hluti sem hver þjónustuaðili hefur þegar. Kall á getMapViewHolder() á stöðuhlutnum réttir þér innbyggðu kortasýnina og kortatilvikið, svo allt sem aðeins eitt SDK býður er skrifað gegn API þess framleiðanda. Umbúðir sem fælu allt myndu má út það sem greinir þjónustuaðila að; þessar gera það ekki. „Sameiginlegu hlutarnir gegnum MapConductor, þeir sem skipta máli gegnum API framleiðandans“ er fullkomlega eðlileg notkun.
Eftir að HTML5 festi hvað vafrar yrðu að útfæra hættu þeir að keppa um samhæfnina sjálfa og fóru að keppa um hraða og getu. Korta-SDK eru engin undantekning: með sameiginlegt viðmót á sínum stað verður spurningin hversu hratt, hversu nákvæmlega og hversu víða þú getur teiknað. Sameiginlegt lag er ekki hemill á einstök SDK — það beinir framförum þeirra í sömu átt.
Eitt enn, og það er stefna fremur en vara. Kortagögn, staðsetningarleit og flísar hafa fylgt SDK-i þess framleiðanda sem lætur þau í té. Aðskildu framsetninguna frá gögnunum og þjónustuaðilar án eigin korta-SDK — bara staðsetningarleit, eða eitt gagnasafn — eiga fleiri staði til að nýtast. Enginn eiginleiki miðar að þessu í dag. Þetta er þangað sem við stefnum, ekki listi yfir það sem er í boði núna.
Það er á ábyrgð þess forritara sem samþættir að fara að skilmálum hvers gagnasafns og hverrar þjónustu. Að samsetning sé tæknilega möguleg segir ekkert um hvort hún sé leyfileg.
Hvenær það passar og hvenær ekki
Passar vel:
- Ein kortaupplifun á fleiri en einum vettvangi
- Að halda möguleikanum á að skipta um þjónustuaðila síðar
- Merki, form og myndavélarvinna sem kjarni eiginleikans
- Þúsundir upp í tugþúsundir merkja
- Fjarlægðir og flatarmál sem verða að stemma alls staðar
Passar illa:
- Sýningargripur bundinn einum þjónustuaðila — sérsmíðaðir skyggjar, lag sem einn framleiðandi á
- Beygju-fyrir-beygju leiðsögn og aðrir eiginleikar sem eru sjálf söluvara SDK-sins
- Einn vettvangur, einn þjónustuaðili, og enginn ásetningur um að breyta því
Þetta er þó ekki allt eða ekkert. Innbyggða kortatilvikið er alltaf innan seilingar, svo óvenjulegu hlutana má skrifa beint gegn þjónustuaðilanum.
Að byrja
MapLibre keyrir án API-lykils, svo fyrsta kortið tekur um fimm mínútur.
- Byrja — fyrsta MapLibre-kortið þitt
- Hvers vegna MapConductor — hugsunin sem þessi færsla er dregin af
- Byggingarlag — hvernig sameinaða API-ið, Core og reklarnir skiptast
- Þjónustuaðilar og uppsetning — uppsetning eftir vettvangi
Við birtum framvindu þróunar og útgáfur á Discord. Athugasemdir um hönnunina og villuskýrslur eru hvort tveggja velkomin. Kóðinn er á GitHub.
