Skjölun / Hugtök / Byggingarlag

Yfirlit yfir byggingarlagið

MapConductor situr milli forritsins þíns og korta-SDK-anna. Forritið talar aðeins við sameinað korta-API og MapConductor framsendir verkið til þess þjónustuaðila sem þú valdir. Android (Kotlin + Compose), iOS (Swift + SwiftUI) og React (vefur) deila sömu pakkaskiptingu og sömu innri hlutverkum.

ANDROID
android-sdk-core
iOS
ios-sdk-core
REACT
js-sdk-core / js-sdk-react

01 · Heildarmyndin

Flæðið er eins á hverjum vettvangi: forrit → sameinað korta-API → Core → rekill þjónustuaðila → korta-SDK. Aðeins efstu tvö lögin eru þinn kóði; neðstu tvö má skipta út.

APP

Viðmót og viðskiptalógík

React · Compose · SwiftUI
UNIFIED API

Sameinað korta-API

MapViewState · Marker · Camera
CORE

Kjarnavirkni (kort, merki, form, atburðir)

Manager · Controller · Overlay
DRIVER

Reklar þjónustuaðila

*-for-googlemaps / -maplibre / …
MAP SDK

Korta-SDK (innbyggt / JavaScript)

Google Maps · MapLibre · Mapbox · MapKit · ArcGIS · HERE …

Skipti um þjónustuaðila skipta aðeins út neðstu tveimur lögunum. Skjákóðinn er skrifaður gegn sameinaða API-inu og heldur því áfram að virka ósnertur.

Vettvangur

02 · Pakkar eftir vettvangi

Core og reklarnir eru gefnir út sem aðskildir pakkar. Forrit reiðir sig á Core auk rekilsins fyrir þá þjónustuaðila sem það raunverulega notar.

android-sdk-core geymir sameiginlega líkanið og mismunareikninginn; android-sdk-compose útvegar stöðuhaldara fyrir Compose. GeoJSON, þyrping og hitakort eru aðskildar einingar (android-geojson-layer / android-marker-clustering / android-heatmap).

03 · Lög

Ábyrgð er skipt í sex lög svo hana megi endurnýta milli vettvanga. Hvert lag veit ekkert um útfærsluna fyrir neðan sig.

#
Lag
Hlutverk
1
Viðmótsumgjörð
Lýsandi viðmótið sem forritið þitt notar — React, Vue, Jetpack Compose, SwiftUI.
2
Sameinað korta-API
API MapConductor, sem meðhöndlar merki, form, myndavél og atburði sem sameiginleg hugtök. Þetta er lagið sem þú skrifar kóða gegn.
3
Brú
Sendir aðgerðir sameinaða API-sins niður eftir keyrsluumhverfinu. Óþörf þegar viðmótið og teiknunin deila einu umhverfi; hún kemur aðeins til sögunnar þegar þeim er skipt milli tveggja.
4
Þverpallalag
Hvernig innbyggð korta-SDK eru sett upp og lýst er aðeins ólíkt eftir vettvangi hér.
5
Innbyggt SDK / reklar
Lagið sem raunverulega teiknar myndavél, stíl og yfirlög — innbyggt á Android og iOS, eða JS-rekillinn á vefnum.
6
Korta-SDK
Hluturinn sjálfur: Google Maps, MapKit, MapLibre, Mapbox, ArcGIS, HERE og fleiri.

Skiptingin gerir kóða sem einbeitir sér að því hvað þú vilt á kortinu — ekki hvaða vettvangi þú ert á — kleift að færast milli umhverfa óbreyttur. Það sem er sértækt fyrir vettvang helst bundið við það hvernig þverpallalagið setur upp og lýsir hlutum.

React Native

React á vefnum og React Native deila því sem forritið skrifar — sömu stöðuhlutir, sömu einingar, aðeins MapView-inu skipt út. Þau greinir að fyrir neðan það. Á vefnum kallar rekillinn á JavaScript-kortasafn í sama keyrsluumhverfi; á React Native afhendir hann yfir brú til innbyggða MapConductor-SDK-sins, og innbyggt korta-SDK sér um teiknunina.

Hvar sami kóðinn skilur leiðir
SHARED

Það sem forritið skrifar

js-sdk-core · js-sdk-react
WEB

React

DRIVER
JavaScript-rekill
react-for-*
Engin brú — eitt keyrsluumhverfi
MAP SDK
JavaScript-korta-SDK
Google Maps · MapLibre · Leaflet · Cesium …
REACT NATIVE

React Native

DRIVER
Rekill sem afhendir innbyggða laginu
reactnative-for-*
BRIDGE
Innbyggð RN-eining
Lag 3
NATIVE SDK
Innbyggt MapConductor-SDK → korta-SDK
Google Maps · MapLibre · ArcGIS · HERE

Brúin er lag 3 í töflunni að ofan. Á vefnum birtist hún alls ekki: viðmótið og teiknunin eru í einu keyrsluumhverfi. Á React Native eru þau í tveimur, svo eitthvað verður að bera á milli. Það lag er hið eina sem er ólíkt; allt fyrir ofan það er eins.

Fjórir þjónustuaðilar eru í boði á React Native — Google Maps, MapLibre, ArcGIS og HERE. Þeir eru færri en þrettán á vefnum af því hver þeirra þarf samsvarandi einingu innbyggða megin.

04 · Inni í Core

Core endurtekur sömu sjö hlutverkin fyrir hverja gerð einingar — merki, fjöllínu, marghyrning, hring, jarðmynd, rasterlag. Lærðu eitt og þú lest hin á sama hátt.

Hlutverk
Ábyrgð
Býr í
State
Óbreytanlegu gildin sem forritið þitt réttir: hnit, litir, zIndex. fingerPrint() skilar hakki af innihaldinu.
core
Entity
Ein færsla sem bindur saman State-ið, hlutinn sem þjónustuaðilinn bjó raunverulega til, og fingrafarið á þeirri stundu.
core
Manager
Skráin yfir entity eftir auðkenni. Smellprófun út frá hniti (find) býr líka hér.
core
Controller
Aðgerðaflöturinn: add / update / clear / find / onCameraChanged / destroy. Ákveður hvað breyttist.
core
Overlay
Teikningareiningin sem hópar saman einingar af einni gerð, og zIndex-ið sem raðar þeim.
core
OverlayRenderer
Þýðir onAdd / onChange / onRemove / onPostProcess yfir í köll á korta-SDK-ið. Erfðu óhlutbundna klasann fyrir þá einingu — AbstractPolygonOverlayRenderer og systkini hans — og fylltu út þrjár aðferðir.
driver
Capable
Lýsir sem gerð hvaða einingar þjónustuaðili ræður við (compositionPolygons / updatePolygon / hasPolygon). Ein er til fyrir hverja einingu — PolygonCapableInterface í Kotlin, PolygonCapable í TypeScript. Swift tjáir það sama með því hvort þjónustuaðilinn smíði PolygonController yfirhöfuð.
driver

Það sem skiptir máli er hvar mörkin liggja. Core-hliðin (State / Entity / Manager / Controller / Overlay) er nánast sami kóði á öllum þremur málunum; fyrir hvern þjónustuaðila skrifar þú aðeins teiknarann og yfirlýsinguna um að einingin sé yfirleitt studd.

ANDROID · Kotlin
iOS · Swift
REACT · TypeScript
core/polygon/PolygonManager.kt
PolygonCapableInterface.kt
AbstractPolygonOverlayRenderer.kt
polygon/PolygonManager.swift
polygon/PolygonOverlayRenderer.swift
polygon/PolygonHoleSplit.swift
polygon/PolygonManager.ts
polygon/PolygonCapable.ts
AbstractPolygonOverlayRenderer.ts

05 · Hvernig mismunareikningurinn virkar

Forritið þitt réttir aðeins fylkið af því sem á að vera til núna. Core reiknar mismuninn frá síðasta skipti og sendir reklinum það sem bættist við, breyttist og hvarf. Kortahlutir eru aldrei endurbyggðir, svo teiknunin helst stöðug í miklu magni.

controller/OverlayRendererInterface.ts · samningurinn sem allir þrír vettvangarnir deila
export interface OverlayRendererInterface<ActualType, StateType, EntityType> {
    onAdd(data: StateType[]): Promise<Array<ActualType | null>> | Array<ActualType | null>;
    onChange(data: Array<ChangeParamsInterface<EntityType>>): Promise<Array<ActualType | null>> | Array<ActualType | null>;
    onRemove(data: EntityType[]): Promise<void> | void;
    onPostProcess(): Promise<void> | void;
}

onChange tekur við bæði fyrri entity (prev) og núverandi stöðu (current), svo rekill getur uppfært aðeins þær eigindir sem hreyfðust. Undirskriftin er sú sama í Kotlin og Swift.

06 · Hvað rekill útfærir

Að styðja nýtt korta-SDK takmarkast við að erfa óhlutbundna teiknarann fyrir hverja einingu og fylla út þrjár aðgerðir. Líkan Core og mismunarökvísin eru ósnert.

android-for-googlemaps · útfærsla teiknara
// Rekillinn erfir frá óhlutbundna teiknaranum og fyllir aðeins út þrjár aðgerðir
internal class GoogleMapPolygonOverlayRenderer(
    override val holder: GoogleMapViewHolder,
    override val coroutine: CoroutineScope,
) : AbstractPolygonOverlayRenderer<GoogleMapActualPolygon>() {

    override suspend fun createPolygon(state: PolygonState) = /* map.addPolygon(...) */
    override suspend fun updatePolygonProperties(polygon, current, prev) = /* Beita aðeins mismuninum */
    override suspend fun removePolygon(entity: PolygonEntityInterface<GoogleMapActualPolygon>) =
        entity.polygon.remove()
}

Aðeins að búa til, uppfæra og fjarlægja er bundið þjónustuaðilanum. Mismunareikningur, skráin og smellprófun eru þegar frágengin af Core áður en kallað er.

07 · Þar sem abstraktionin endar

MapConductor reynir ekki að vefja hvern einasta eiginleika hvers korta-SDK. Það einbeitir sér að þeim aðgerðum sem eru almennt notaðar og býður tvær leiðir út fyrir allt umfram þær.

getMapViewHolder() · að kalla beint á innbyggðan eiginleika
// map í sameiginlega viðmótinu er unknown — þrengdu það að gerð þjónustuaðilans áður en það er notað
const holder = mapViewState.getMapViewHolder();
const map = holder?.map as maplibregl.Map | undefined;

map?.addLayer({ id: 'buildings', type: 'fill-extrusion', source: 'composite' });

Sameiginlega API-ið helst einfalt án þess að fórna því sem hver þjónustuaðili er góður í — sjá Innbyggðar viðbætur fyrir nánari umfjöllun.

Tengdar síður