Dokumentation / Grundlagen / Polygon

Polygon

Eine Fläche mit einer Koordinatenfolge des Umfangs und einer beliebigen Anzahl von Löchern (holes). Wenn Sie sie mit Füll- und Linienstilen in die Kartenansicht einfügen, können Sie Bereiche anzeigen oder Masken darstellen. Die Behandlung von Löchern variiert je nach Karten-SDK, aber MapConductor sorgt dafür, dass sie bei allen Anbietern gleich aussieht.

POINTS
GeoPoint[]
HOLES
GeoPoint[][]
FILL / STROKE
color · width
GEODESIC
true / false
Plattform

01 · Status des Polygons

PolygonState stellt eine einzelne Fläche dar. Es verfügt über einen Umfang, Löcher, eine Füllung, eine Linie und einen Tap-Handler. Wenn Sie die Eigenschaften ändern, wird die Form sofort aktualisiert. Eine Benutzeroberfläche, mit der die Form durch Ziehen von Eckpunktmarkern bearbeitet werden kann, kann einfach durch Ersetzen der Koordinatenfolge erstellt werden.

PolygonPageViewModel.kt · Jetpack Compose
val polygonState =
    PolygonState(
        points = outerRing,
        holes = listOf(holeA, holeB),
        strokeColor = Color.Red,
        strokeWidth = 3.dp,
        fillColor = Color(0x4D0064E6),
        onClick = { event -> viewModel.onPolygonClick(event) },
    )

Polygon(polygonState)

// Eckpunkte und Löcher aktualisieren sich, indem man sie einfach neu schreibt
polygonState.holes = nextHoles
Eigenschaften
Beschreibung
points
Koordinatenfolge des Umfangs. Der Schließvorgang erfolgt intern, sodass Sie den Startpunkt am Ende nicht wiederholen müssen.
holes
Array der Koordinatenfolgen der Löcher. Sie können mehrere angeben, auch wenn sie sich überlappen.
fillColor
Füllfarbe. Die Transparenz wird mit Alpha angegeben.
strokeColor / strokeWidth
Farbe und Dicke der Konturlinien von Umfang und Löchern. Die Dicke ist in logischen Einheiten angegeben und sieht auf allen Geräten gleich aus, unabhängig von der Auflösung.
geodesic
Ob Kanten als Orthodrome (Geodätische Linie) verbunden werden. Wirkt sich bei großen Bereichen aus.
zIndex · extra
Überlappungsreihenfolge und beliebige begleitende Daten.
onClick
Tap-Handler. Empfängt den Status der Fläche und die getippten Koordinaten.

02 · Kombination von Löchern (holes) und Überlappungen

Ein Loch ist ein Bereich, der vom äußeren Umfang ausgeschnitten wird. Bei Maskendarstellungen ist es üblich, mehrere „zu zeigende Bereiche“ als Löcher zu platzieren, wobei sich die Löcher dabei natürlich überschneiden.

Viele Karten-SDKs zeichnen eine Konturlinie im überlappenden Bereich, wenn überlappende Löcher direkt übergeben werden, wodurch die Grenze zwischen den Löchern sichtbar wird. Da MapConductor die übergebenen Löcher vor dem Zeichnen zusammenfügt, wird die Überlappung als ein einziges Loch behandelt und es werden keine überflüssigen Linien angezeigt.

Abbildung · zwei überlappende dreieckige Löcher übergeben
RAW SDK
Die Überlappung wird durchgereicht, und quer darüber erscheinen Umrisse — man sieht, dass es zwei Löcher sind.
MAPCONDUCTOR
Die Löcher werden zuerst vereinigt: Die Überlappung wird zu einem Loch, und nur dessen Außenform bekommt eine Kontur.
Der Anwendungscode und die Koordinaten der Löcher sind in beiden Fällen identisch. Die Vereinigung geschieht beim Aufbau des Zustands und hält daher mit, während Eckpunkte in die Überlappung hinein und wieder heraus gezogen werden.
Überlappende Löcher direkt übergeben
// Überlappende Löcher können unverändert übergeben werden; intern werden sie zu einem zusammengeführt
PolygonState(
    points = outerRing,
    holes =
        listOf(
            triangleA, // ← überlappen einander
            triangleB,
        ),
    fillColor = Color(0xCC787880),
)

03 · Sieht bei jedem Anbieter gleich aus

Neben der Überlappung von Löchern gibt es beim Zeichnen von Flächen weitere Bereiche, in denen leicht Unterschiede zwischen den Engines auftreten. MapConductor gleicht diese intern ab und stellt sicher, dass aus demselben PolygonState dasselbe Bild entsteht.

HOLE UNION

Überlappende Löcher zusammenführen

Überlappungen zwischen Löchern werden im Stadium der Erstellung des Zustands zu einem Bereich zusammengeführt. Weder erscheinen Konturlinien in den überlappenden Bereichen noch gibt es Doppelfüllungen.

GEODESIC

Die gleiche Form auch für Engines, die keine Kurven zeichnen können

Für Engines, die keine Großkreisrouten direkt zeichnen können, werden die Kanten in eine Reihe fein unterteilter Koordinaten umgewandelt und dann übergeben. Die Formen stimmen auch in großräumigen Gebieten überein.

ANTIMERIDIAN

Flächen, die die Datumsgrenze überschreiten

Flächen, die den 180. Längengrad überschreiten, werden an der Grenze geteilt und übergeben. Auch bei Engines, die zu einer Füllung führen, die die Erde in umgekehrter Richtung durchquert, wird die korrekte Seite gefüllt.

HIT TEST

Auch Tapperkennung gemeinsam

Die Tapperkennung erfolgt mit einer gemeinsamen Logik; das Innere von Löchern reagiert nicht auf Taps. Unabhängig davon, ob die Engine Löcher berücksichtigt oder nicht, erfolgt die Erkennung genau so, wie es sichtbar ist.

04 · Tippen

onClick empfängt den Zustand der Fläche und die angetippten Koordinaten. Ein typischer Anwendungsfall ist das Abrufen von Daten aus Füllung und extra, um Details anzuzeigen.

event.state

Der Zustand der getippten Fläche. Daten können aus der Füllfarbe und `extra` abgerufen werden.

event.clicked

Die getippten geografischen Koordinaten.

Löcher reagieren nicht

Auch wenn innerhalb eines Lochs getippt wird, wird das Ereignis dieser Fläche nicht ausgelöst. Nur der sichtbare gefüllte Teil ist betroffen.

PolygonClickPageViewModel.kt
fun onPolygonClicked(event: PolygonEvent) {
    markerState = MarkerState(
        position = event.clicked,
        icon = DefaultMarkerIcon(fillColor = event.state.fillColor),
    )
}

Wenn sich Flächen überlappen, hat die obere (die mit dem größeren zIndex) Vorrang. Auch wenn viele Flächen für einen großen Bereich platziert werden, werden Flächen außerhalb des Anzeigebereichs aus der Erkennung ausgeschlossen.

Verwandte Seiten