Mehr

Erstellen Sie Polylinien aus Punktarrays


Lassen Sie mich das Datensetup beschreiben. Eine Linie wurde als Array von Koordinatenpaaren bereitgestellt, eines für jeden Scheitelpunkt. Dieses Array ist in der Größe variabel, von 2 bis 200 Koordinatenpaaren pro Zeile. Was ich versuche, um meine Gedanken zu wickeln, ist der beste Weg, um diese Linien zu erstellen. Arcpy und ArcObjects sind beides brauchbare Optionen, aber ArcObjects wird aufgrund seiner Geschwindigkeit (im Allgemeinen) bevorzugt.

Ich habe mir ein paar Methoden ausgedacht, aber sie sind aus irgendeinem Grund zu kurz:

1) Ich könnte die Polyline-Klasse mit arcpy verwenden, um Polylinien zu erstellen und dann Features zu kopieren, aber die resultierende Geometrie hätte keine der zum Identifizieren dieser Punkte erforderlichen Attributionen.

2) Ich könnte XY zu Linie verwenden, aber das funktioniert nur mit einem Punktpaar, und ich benötige etwas viel Robusteres.

Das lang und kurz ist, dass ich eine Methode benötige, die eine Polylinie aus Arrays erstellen und ein Schema für Daten verwalten kann, die ich in einer Tabelle erstellt habe. Eine Idee, die ich habe, ist, die Tabelle und das Schema zu erstellen und dann irgendwie die Polylinie zu erstellen und ihre zu kopierengestalten-Eigenschaft in die Ausgabetabelle, Portierung über die ID und jede andere erforderliche Zuordnung. Wie kann ich die Shape-Eigenschaft der Polylinie erstellen, ohne auf ein Zwischen-Shapefile zurückgreifen zu müssen? Oder wenn Ihnen eine bessere Methode einfällt, teilen Sie sie mir bitte mit.

Aktualisieren Dieser Code scheint zu funktionieren!

IFeatureClass fClass = gpUtil.OpenFeatureClassFromString(path); IFeatureCursor-Cursor = fClass.Insert(true); IFeatureBuffer-Puffer = fClass.CreateFeatureBuffer();  string[] nodearray = a.Split(';'); foreach (String i in Nodearray) { query.WhereClause = ""PNT_ID" = '" + i+"'"; Console.WriteLine(query.WhereClause.ToString()); ICursor-Suche = table.Search(query, false); IRow-Reihe = search.NextRow(); float x = float.Parse(row.get_Value(2).ToString()); float y = float.Parse(row.get_Value(3).ToString()); int id = int.Parse(row.get_Value(1).ToString()); Punkt.X = x; Punkt.Y = y; Punkt.ID = ID; point.SpatialReference = sRef; pCollection.AddPoint(Punkt, Ref fehlt, Ref fehlt); } IGeometry5 polygeo = (IGeometry5)pCollection; buffer.set_Value(1, polygeo); buffer.set_Value(2, Wayid); Cursor.InsertFeature(Puffer);

Es sieht so aus, als hätte ich es. Ich habe eine erstelltIch zeigeKlasse und benutzte es, um eineIPointCollectioninstantiiert als aPolylineClass. Dann habe ich die Sammlung anIGeometrie5und benutzte das alsgestaltenFeld für die Zeile in meiner Ausgabe-Feature-Class, wobei die ID mit einem Puffer kopiert wird.

Ich habe meinen Kopf in ein paar Kreisen verdreht, indem ich mit zwei Eingaben gearbeitet habe, aber es scheint gut zu funktionieren.


Ich kämpfe hier mit einem ähnlichen Schema.

Ich muss Linien und ihre Scheitelpunkte identifizieren und eine Linie hat Scheitelpunkt-Beziehung zwischen ihnen beibehalten. Ich glaube, ich habe es mit einer größeren Anforderung zu tun (ich bin mir nicht sicher), aber wir implementieren dies als Views und Feature-Class-Erweiterungen (hauptsächlich um unsere "Segment"-Tabellen zu verwalten).

Grundschema ist

Zeilentabellenname (PK)

Punkttabellenname (PK)

LineSegmentTable LineName (FK) ID-Reihenfolge FromPoint (FK) ToPoint (FK)

LineView-Namensgeometrie

In Ihrem Fall ist eine "Vertex"-Tabelle möglicherweise besser geeignet. Wir laufen auch auf Oracle.


Geo-Python

Dieses Beispiel für grundlegende Python-Skripte zeigt, wie Sie eine Linie zwischen zwei Punkten erstellen. ESRI hat einen guten technischen Artikel darüber, wie man mit Python eine Linie erstellt, aber der ist etwas komplexer. In Übereinstimmung mit meinem Ziel, die Dinge so einfach wie möglich zu machen, ist dieses Skript die einfachste Form, eine Linie zu erstellen. Der Code ist meinem letzten Beitrag zum Erstellen eines Punkts sehr ähnlich, da alle komplexen Formen in ArcGIS eigentlich nur Punkte mit Verbindungslinien sind. Das neue Objekt in diesem Skript ist das Array. Um dies einfach zu halten, können Sie sich ein Array als einen Ort vorstellen, an dem die Punktkoordinaten gespeichert werden, bevor Sie eine Verbindungslinie zeichnen. Wenn Ihr Skript also eine Reihe von Koordinaten für einen Punkt einliest, speichern Sie sie in einem Array. Sobald Sie alle Punkte haben, aus denen die Linie im Array besteht, weist das Skript den Geoprozessor an, die Linie zu erstellen, die die Punkte verbindet. Diesmal habe ich nur sehr einfache Kommentare hinzugefügt, dies entspricht eher dem Aussehen von Skripten, die Sie im Internet finden. Ich habe auch jede Fehlerbehandlung weggelassen, um den Fokus auf die grundlegendsten Teile des Skripts zu legen. Mach dir keine Sorgen, es wird das nächste Mal wiederkommen.

importieren sys, string, os, arcgisscripting
gp = arcgisscripting.create()
gp.OverWriteOutput = True

# Ausgabeordner und Dateinamen festlegen

outFolder = r”C:Temp”
outFile = “SingleLine.shp”

# Arbeitsbereich festlegen
gp.workspace = outFolder

# Weisen Sie den Startvariablen die x- und y-Koordinatenwerte zu

StartXcoord = -63.650997
StartYkoord = 44,679996

# Weisen Sie den Endvariablen die x- und y-Koordinatenwerte zu
EndXkoord = -74.011221
EndYkoord = 40,663962

# Raumbezug zuweisen
sr = gp.CreateSpatialReference (“C:Program FilesArcGISCoordinate SystemsGeographic Coordinate SystemsWorldWGS 1984.prj”, “#”, “#”, &# 8220#”, “#”, “#”)

# Erstellen Sie die Feature-Class, zu der die Linie hinzugefügt wird
gp.CreateFeatureClass (outFolder, outFile, “POLYLINE”, “#”, “#”, “#”, sr)

# Erstellen Sie den Einfügecursor und zeigen Sie ihn auf die gerade erstellte Datei
cur = gp.InsertCursor (outFile)

# Cursor so bewegen, dass er auf die erste leere Zeile in der Datei zeigt

# Erstellen Sie das Array-Objekt, um die Punkte für die Linie zu speichern
LineArray = gp.CreateObject(“Array”)

# Erstellen Sie das Point-Objekt, um die Koordinaten für die Punkte zu speichern

pnt = gp.CreateObject (“Point”)

# Setze die x & y Startkoordinaten
pnt.x = StartXcoord
pnt.y = StartYcoord

# Punkt zum Array hinzufügen

# Legen Sie die x- und y-Endkoordinaten fest
pnt.x = EndXcoord
pnt.y = EndYcoord

# Fügen Sie den Punkt erneut zum Array hinzu

# Setzen Sie die Shape-Eigenschaft der ersten Zeile im Shapefile auf die Werte, die im LineArray enthalten sind. Da wir bei der Verwendung von CreateFeatureClass den Shapefile-Typ (Polyline) definieren mussten, weiß die Shape-Eigenschaft von file, dass Linien zwischen jedem Punkt im Array erstellt werden sollen.


Propiedaden

Gibt eine JSON-Darstellung der Geometrie als String zurück.

Der zurückgegebene String kann mit der eval-Funktion von Python in ein Wörterbuch umgewandelt werden.

Gibt die bekannte Binärdarstellung (WKB) für die OGC-Geometrie zurück. Es bietet eine portable Darstellung eines Geometriewerts als zusammenhängenden Bytestrom.

Gibt die bekannte Textdarstellung (WKT) für die OGC-Geometrie zurück. Es bietet eine portable Darstellung eines Geometriewerts als Textzeichenfolge.

Die Fläche eines Polygon-Features. Leer für alle anderen Feature-Typen.

Der wahre Schwerpunkt, wenn er sich innerhalb oder auf dem Feature befindet, andernfalls wird der Beschriftungspunkt zurückgegeben. Gibt ein Punktobjekt zurück.

Das Ausmaß der Geometrie.

Der erste Koordinatenpunkt der Geometrie.

Eine durch Leerzeichen getrennte Zeichenfolge der Koordinatenpaare des konvexen Hüllenrechtecks.

True, wenn die Anzahl der Teile für diese Geometrie mehr als eins beträgt.

Der Punkt, an dem sich das Etikett befindet. Der labelPoint befindet sich immer innerhalb oder auf einem Feature.

Die letzte Koordinate des Features.

Die Länge des linearen Features. Null für Punkt- und Mehrpunkt-Feature-Typen.

Die 3D-Länge des linearen Features. Null für Punkt- und Mehrpunkt-Feature-Typen.

Die Anzahl der Geometrieteile für das Feature.

Die Gesamtpunktzahl für das Feature.

Der Schwerpunkt für ein Feature.

Der Geometrietyp: Polygon, Polylinie, Punkt, Multipoint, Multipatch, Bemaßung oder Annotation.


Können Sie in Google Drawings Punkte zu einer Polylinie hinzufügen/entfernen?

In Google Drawings können Sie eine Polylinie erstellen, bei der es sich um eine Linie mit Punkten handelt, an denen die Linie "gebogen" werden kann. Nachdem Sie die Polylinie mit einer bestimmten Anzahl von Punkten erstellt haben, können Sie die Polylinie bearbeiten, um die Position und Ausrichtung der Punkte zu ändern.

Gibt es eine Möglichkeit, Punkte hinzuzufügen oder zu entfernen?

Oder müssen Sie eine neue Zeile erstellen?

Diese Seite von 2010 sagte, dass diese Funktion nicht existiert. Ich konnte nichts neueres finden, das so oder so sagte.


In den Eigenschaften finden Sie eine Liste aller Eigenschaften, die an den Konstruktor übergeben werden können.

Der Cache wird verwendet, um Werte zu speichern, die aus Geometrien berechnet wurden, die bei einer Mutation gelöscht oder neu berechnet werden müssen.

Das Ausmaß der Geometrie.

Gibt an, ob die Geometrie M-Werte hat.

Gibt an, ob die Geometrie Z-Werte (Höhe) hat.

Ein Array von Pfaden oder Liniensegmenten, aus denen die Polylinie besteht.

Der Raumbezug der Geometrie.

Details der Immobilie

Der Cache wird verwendet, um Werte zu speichern, die aus Geometrien berechnet wurden, die bei einer Mutation gelöscht oder neu berechnet werden müssen. Ein Beispiel ist die Ausdehnung eines Polygons.

Der Name der Klasse. Der deklarierte Klassenname wird als esri.folder.className formatiert.

Das Ausmaß der Geometrie. Für einen Punkt ist die Ausdehnung null.

Gibt an, ob die Geometrie M-Werte hat.

Gibt an, ob die Geometrie Z-Werte (Höhe) hat.

Z-Werte in einem geografischen oder metrischen Koordinatensystem definiert sind, werden in Metern ausgedrückt. In lokalen Szenen, die ein projiziertes Koordinatensystem verwenden, wird jedoch davon ausgegangen, dass die vertikalen Einheiten den vom Dienst angegebenen horizontalen Einheiten entsprechen.

Ein Array von Pfaden oder Liniensegmenten, aus denen die Polylinie besteht. Jeder Pfad ist ein zweidimensionales Array von Zahlen, die die Koordinaten jedes Scheitelpunkts im Pfad im Raumbezug der Ansicht darstellen. Jeder Scheitelpunkt wird als Array von zwei, drei oder vier Zahlen dargestellt. Die folgende Tabelle zeigt die verschiedenen Strukturen eines Vertex-Arrays.


Die WeightedLocation-Klasse drückt gewichtete Daten sowie geografische Informationen visuell aus. Eine Datengewichtung wird in den Bereich 0-1 normalisiert.

Das Visualisierungs-Submodul verwaltet intern alle Daten mit einer WeightedLocation-Instanz. Wenn den Daten kein Gewicht zugewiesen wird, wird standardmäßig 1 verwendet.

Die normalisierten Gewichtungen für jeden Visualisierungstyp lauten wie folgt:

    : Eine Gewichtung in einer Heatmap repräsentiert die Aufprallintensität jedes Punktes. Der Intensitätsbereich beträgt 0,1-1. Die Intensität ohne Gewicht ist 1. : Eine Gewichtung in einer Punktdichtekarte wird als Radius eines Punktes verwendet. Der Bereich eines Radius ist 1- . Ein Radius ohne Gewicht ist ein benutzerdefinierter Radius.

Es gibt mehrere Möglichkeiten, gewichtete Daten für geografische Informationen zu erstellen. Wie im folgenden Code können Sie mit dem new-Operator eine neue Instanz erstellen.

Oder Sie können Literaldaten wie im folgenden Code verwenden. Das Visualisierungs-Submodul wandelt es dann intern in WeightedLocation um.


Maskieren mit Shapefiles

Bei gerasterten Modelldaten fehlen in der Regel Informationen darüber, zu welchem ​​Land die Gitterboxen gehören. Solche sozialen oder politischen Informationen liegen als Vektordaten vor, also als Liniensegmente, die die jeweiligen Gebiete umschließen. Ein gängiges Format hierfür ist das „ESRI Shapefile“. Wie Sie solche Shape-Informationen in der Datenanalyse und Visualisierung mit NCL und außerhalb von Geographic Information Systems (GIS) verwenden, wird in diesem Artikel beschrieben, genauer gesagt, wie Sie ESRI-Shapefiles in NetCDF konvertieren und richtig damit arbeiten.

Willkommen zum ersten Vis-Blog-Artikel @DKRZ!

Viele von Ihnen sind vielleicht auf das Problem gestoßen, nur einen regionalen Teil eines größeren Datensatzes zu visualisieren, um die Situation für ein bestimmtes Land oder eine bestimmte Region zu veranschaulichen. Dies ist für eine regionale Visualisierung einer rechteckigen Teilmenge des Modellgitters einfach, aber wenn nur Datenwerte innerhalb einer unregelmäßigen Form (z. B. politische Grenzen) angezeigt werden sollen, wird es schwieriger. Hier, Shapefiles kann Ihnen helfen, Daten innerhalb von unregelmäßig geformten Grenzen zu analysieren und/oder zu visualisieren.

In diesem Blogartikel geben wir ein Beispiel für die Erstellung einer gerasterten Maske basierend auf einer geschlossenen Polylinie, die in einem Shapefile definiert ist, um gerasterte Daten nur darin zu analysieren und/oder zu visualisieren.

Shapefiles können geometrische Daten wie Länder- oder Staatsgrenzen, Städte, Verkehrswege, Flüsse, Wasserflächen und verwandte Daten wie Bevölkerung, Vegetation usw. enthalten. Die Geoinformationen werden in Form von Geometrien wie 'Punkte', 'Polylinien' gespeichert. oder "Polygone".

Ein Shapefile ist eigentlich nicht nur eine einzelne Datei, sondern ein Satz von Dateien, die verschiedene Teile der Informationen enthalten. Die wichtigsten sind:

  • eine .shp-Datei, die die Geometrie enthält
  • eine .shx-Datei, die den Positionsindex der Feature-Geometrie enthält
  • eine .dbf-Datei, die die Attribute jeder Form enthält

Beachten Sie, dass die meisten Anwendungen den vollständigen Satz von Dateien benötigen, um ordnungsgemäß zu funktionieren, obwohl Sie nur die '.shp'-Datei laden.

Das für diesen Artikel verwendete Shapefile-Set kann heruntergeladen werden von
https://www.diva-gis.org/gdata
(-> Deutschland -> Verwaltungsgebiete -> DEU_adm.zip)

Hier verwenden wir DEU_adm0.shp und DEU_adm1.shp.

1. Was enthält das Shapefile?

NCL bietet das Befehlszeilentool ncl_filedump Dies gibt eine Zusammenfassung des Inhalts des Shapefiles.

Das Shapefile enthält einige Variablen, aber im Moment brauchen wir nicht mehr über seinen Inhalt zu wissen, abgesehen davon, dass die Variablen x und y die Längen- und Breitenkoordinaten der deutschen Grenze sind.

2. Erstellen Sie eine NetCDF-Maskendatei aus dem Shapefile

Um eine Maskendatei basierend auf dem Shapefile zu erstellen, benötigen wir eine zweite Datei mit der Gitterbeschreibung für die Ausgabedatei.

Nehmen wir an, wir wollen eine Gittermaske für Deutschland erstellen, die eine „0“ für Gitterzellen außerhalb Deutschlands und eine „1“ für diejenigen innerhalb Deutschlands enthält. Die Ausgabemaskendatei sollte eine Rasterauflösung von 0,1x0,1 Grad haben und die Region Deutschland einschließen.

Wenn Sie eine Rasterdatei von 0,1x0,1 Grad haben, ist alles in Ordnung. Wenn nicht, können Sie mit CDO (Climate Data Operators) ganz einfach eine (globale) erstellen. Hier verwenden wir das eingebaute Topographieraster und ordnen es der gewünschten Ausgabeauflösung neu zu:

Da NCL Shapefiles lesen kann und einige Shapefile-Funktionen bereitstellt, ist das folgende Skript in der NCL-Befehlssprache geschrieben. Sie müssen zuerst die Bibliothek von NCAR herunterladen, um diese Shapefile-Funktionen verwenden zu können:

Zur späteren Verwendung speichern wir die Datei in $HOME/NCL/shapefiles/.

Dies ist ein NCL-Skript, das eine Maske für Deutschland in einem 0,1x0,1deg-Raster erstellt und in einer netCDF-Datei speichert:

Um das Ergebnis zu überprüfen, können Sie den Inhalt der Maskendatei mit ncview oder Panoply visualisieren.

3. Maskieren Sie Ihre Daten mit der Maskendatei

Wir möchten nur die Daten innerhalb Deutschlands verwenden, die Werte außerhalb Deutschlands wurden auf fehlender Wert gesetzt. Da uns keine aktuellen Daten vorliegen, verwenden wir die Topografiedaten, die CDO bereits anbietet.

a) Maskieren auf demselben Raster

Wir nehmen die Datei topo_0.1x0.1deg_global.nc von oben und verwenden Sie einfach CDO mit dem Operator 'mul', um die Datendatei mit der Maskendatei zu multiplizieren (beide haben das gleiche Raster).

b) Maskieren auf ein anderes Raster

Wenn sich beispielsweise das Raster Ihrer Eingabedaten auf einem 1x1-Grad-Raster befindet, müssen Sie die Maskendatei auch zuerst auf ein 1x1-Grad-Raster neu zuordnen. Auch hier kann CDO verwendet werden, um die Maskendatei dem Raster Ihrer Datendatei neu zuzuordnen.

Datendatei: topo_1x1deg_global.nc
Maskendatei: DEU_adm0_mask_array_0.1x0.1deg_global.nc

Ordnen Sie die Maske dem Raster der Eingabedatendatei neu zu:

Wählen Sie eine kleinere Unterregion für Deutschland:

4. Visualisieren Sie die maskierten Daten mit NCL

Die verarbeiteten Daten können nun mit NCL geplottet werden, z.B.:

5. Wählen Sie einen Teil des Shapefiles mit NCL . aus

Sie können auch nur NCL verwenden, um ein Shapefile zu lesen und Daten für eine Region auszuwählen. Das nächste Beispiel zeigt, wie die Daten für das Bundesland Schleswig-Holstein von Deutschland mit dem Shapefile ausgewählt und geplottet werden DEU_adm1.shp.

Nun müssen wir uns den Shapefile-Inhalt mit ncl_filedump genauer ansehen

Was Sie sofort im Dimensionsteil sehen können, ist, dass es 16 Features, 125 Segmente und insgesamt 207860 Punkte gibt. Die 16 Merkmale sind die Bundesländer, deren Namen in der Variablen NAME_1 gespeichert sind.

Wenn Sie den entsprechenden Index eines Bundeslandes kennen, können Sie dessen Polygone mit Standard-NCL-Funktionen auslesen. Mit der Funktion gc_inout NCL bietet auch die Möglichkeit zu prüfen, ob Punkte der Daten innerhalb eines Polygons liegen oder nicht. Werden nur diese Punkte in einem neuen Array gespeichert, können die Daten nachträglich sehr einfach gezeichnet werden.
Das folgende Beispielskript erstellt einen Basiskartenplot, auf dem der Höhenlinienplot und die Shapefile-Polylinien für das Bundesland Schleswig-Holstein (Index 14) überlagert werden.


Eigenschaften

Gibt eine Esri JSON-Darstellung der Geometrie als Zeichenfolge zurück.

Die zurückgegebene Zeichenfolge kann mit der Python-Funktion json.loads in ein Wörterbuch konvertiert werden.

Gibt die bekannte Binärdarstellung (WKB) für die OGC-Geometrie zurück. Es bietet eine portable Darstellung eines Geometriewerts als zusammenhängenden Bytestrom.

Gibt die bekannte Textdarstellung (WKT) für die OGC-Geometrie zurück. Es bietet eine portable Darstellung eines Geometriewerts als Textzeichenfolge.

Alle echten Kurven in der Geometrie werden zu ungefähren Kurven in der WKT-Zeichenfolge verdichtet.

Die Fläche eines Polygon-Features. Leer für alle anderen Feature-Typen.

Der wahre Schwerpunkt, wenn er sich innerhalb oder auf dem Feature befindet, andernfalls wird der Beschriftungspunkt zurückgegeben. Gibt ein Punktobjekt zurück.

Das Ausmaß der Geometrie.

Der erste Koordinatenpunkt der Geometrie.

Eine durch Leerzeichen getrennte Zeichenfolge der Koordinatenpaare des konvexen Hüllenrechtecks.

True , wenn die Anzahl der Teile für diese Geometrie mehr als eins beträgt.

Der Punkt, an dem sich das Etikett befindet. Der labelPoint befindet sich immer innerhalb oder auf einem Feature.

Die letzte Koordinate des Features.

Die Länge des linearen Features. Null für Punkt- und Mehrpunkt-Feature-Typen.

Die 3D-Länge des linearen Features. Null für Punkt- und Mehrpunkt-Feature-Typen.

Die Anzahl der Geometrieteile für das Feature.

Die Gesamtpunktzahl für das Feature.

Der Raumbezug der Geometrie.

Der Schwerpunkt für ein Feature.

Der Geometrietyp: Polygon, Polylinie, Punkt, Multipoint, Multipatch, Bemaßung oder Annotation.


Kartenpolygone hinzufügen

Ein MapPolygon ist eine Form, die aus mindestens drei Koordinaten besteht, andernfalls kann sie nicht gerendert werden. Ähnlich wie bei MapPolyline sind die Koordinaten verbunden. Polygone können nützlich sein, um einen Bereich auf der Karte hervorzuheben.

Notiz: Die Reihenfolge der Koordinaten spielt eine Rolle.

Im folgenden Beispiel sehen Sie, wie ein Polygon erstellt werden kann. Die Koordinaten werden basierend auf ihrer Reihenfolge in der Liste verbunden. Die resultierende Form kann mit einer neuen MapPolygonStyle-Instanz mit einer Farbe gefüllt werden:

Ein MapPolygon besteht aus drei Elementen:

  • Eine Liste von drei oder mehr geografischen Koordinaten, die definieren, wo das Polygon auf der Karte platziert werden soll.
  • Ein GeoPolygon, das diese Koordinatenliste enthält.
  • Ein MapPolygonStyle, um zu definieren, wie das Polygon visualisiert wird. Stellen Sie sicher, dass Sie mindestens eine Farbe festlegen, sonst bleibt das MapPolygon unsichtbar.

Da ein Polygon durch drei oder mehr Punkte definiert wird, müssen Sie eine Array-Liste erstellen, die mindestens drei GeoKoordinaten enthalten muss. Andernfalls wird eine Ausnahme ausgelöst. Durch die Verwendung der MapPolygonStyle-Klasse können Attribute wie Zeichenreihenfolge oder Farbe definiert werden. Dies kann eine Füllfarbe sein, wie oben gezeigt, oder eine Strichfarbe (und optional eine Strichstärke), um den Umriss anzugeben - oder beides: Auf diese Weise können Sie gefüllte und ungefüllte Kartenpolygone erstellen. Siehe als Beispiel den Screenshot.

Das Festlegen einer Zeichenreihenfolge kann nützlich sein, um zu definieren, welches Kartenelement am höchsten gerendert werden soll. Höhere Werte werden über niedrigeren Werten gezeichnet. Beachten Sie, dass Kartenmarkierungen immer über allem anderen, was auf der Karte gerendert wird, gezeichnet werden, während Kartenpolylinien immer unter extrudierten Gebäuden, Beschriftungen und anderen Kartenpolygonen und Kartenkreisen gezeichnet werden. Der häufigste Anwendungsfall für Kartenpolylinien ist das Rendern einer Route auf der Karte, während Kartenmarkierungen einen Standort anzeigen sollen und daher nicht ausgeblendet werden sollten.

  • Die Zeichenreihenfolge für Kartenpolylinien ist nur in Bezug auf andere Kartenpolylinien wirksam.
  • Die Zeichenreihenfolge für Kartenpolygone und Kartenkreise ist nur in Bezug auf andere Kartenpolygone und Kartenkreise wirksam.

Bitte beachten Sie, dass die chronologische Reihenfolge, in der die Kartenelemente zur Karte hinzugefügt werden, nicht beeinflussen, welches Element zuerst gerendert wird. Der Standardwert für die Zeichenreihenfolge für Kartenelemente wie MapPolyline , MapPolygon und MapCircle ist 0. Die Zeichenreihenfolge für andere Kartenelemente wie Straßen oder Flüsse hängt vom aktuellen Kartenstil ab, den Sie verwenden - sie kann für benutzerdefinierte Karten angepasst werden In einer YAML-Datei definierte Stile finden Sie im Abschnitt über benutzerdefinierte Kartenstile für weitere Informationen.

Kartenpolygone können verwendet werden, um komplexe gefüllte oder ungefüllte Formen zu erstellen. Ein sich selbst schneidendes Polygon kann jedoch zu unerwünschten Ergebnissen führen, da die Koordinaten in der Reihenfolge der Liste verbunden werden. Alternativ können Sie mehrere Polygone hinzufügen – oder achten Sie darauf, die Koordinaten so hinzuzufügen, wie sie auf dem Umriss der gewünschten Form erscheinen.

Beachten Sie, dass im Gegensatz zu einer Kartenpolylinie der Umriss eines Kartenpolygons automatisch zwischen der letzten Koordinate und der ersten Koordinate der Liste verbunden wird.

Nachdem Sie ein oder mehrere Kartenpolygone erstellt haben, können Sie diese zu einer Kartenszene hinzufügen mit:

Wenn ein Kartenpolygon bereits an eine Kartenszene angehängt ist, wird jeder weitere Versuch, es erneut hinzuzufügen, ignoriert.

Screenshot: Anzeigen eines Polygons.

Beachten Sie, dass eine Kartenansicht nur eine Szene zulässt und alle Kartenelemente direkt darauf platziert werden. Wenn Sie Ihre Kartenelemente gruppieren möchten, können Sie sie mithilfe eines Arrays organisieren und einzeln hinzufügen oder entfernen.

Ein mapPolygon kann sofort aus der Karte entfernt werden durch Aufrufen von:

Notiz: MapPolygon-Elemente sind auswählbar und es ist möglich, Metadaten zu speichern, die bei der Kommissionierung des Artikels abgerufen werden können. Ein Beispiel finden Sie im folgenden Abschnitt zu Kartenmarkierungen.

Polygonstil aktualisieren

Wie Sie oben gesehen haben, können Füllfarbe und andere Eigenschaften wie die Konturstrichbreite mithilfe einer MapPolygonStyle-Instanz angegeben werden. Es ist möglich, bereits angewendete Eigenschaften dynamisch zu ändern. Dazu müssen Sie keine neue MapPolygonStyle-Instanz erstellen.

Stattdessen können Sie Wiederverwendung den aktuellen Stil, nachdem ein Kartenpolygon zu einer Kartenszene hinzugefügt wurde, ändern Sie einige seiner Eigenschaften und rufen Sie die updateStyle()-Methode für die Kartenpolygoninstanz auf - Sie müssen nur die aktualisierte Stilinstanz als Parameter übergeben. Das Aussehen auf der Karte ändert sich sofort. Auf diese Weise können Sie beispielsweise animierte Kartenpolygone erstellen.


Kartenmarkierungen hinzufügen

Sie können Kartenmarkierungen verwenden, um genau auf einen Ort auf der Karte zu verweisen. Kartenmarkierungen werden immer über alles andere auf der Karte gerendert gezeichnet.

Die folgende Methode fügt der Karte eine Kartenmarkierung hinzu:

In diesem Beispiel laden wir ein PNG ("here_car.png") aus den Ressourcen und erstellen daraus ein MapImage. Dieses MapImage kann dann auf eine MapMarker-Instanz gesetzt werden.

Das HERE SDK für Android unterstützt PNG-Ressourcen mit oder ohne Transparenz (Alpha-Kanal) – sowie alle anderen gängigen Bitmap-Ressourcen, die von Android nativ unterstützt werden. Vektorgrafiken werden noch nicht unterstützt - selbst wenn sie in Android Studio von SVG in eine XML-Darstellung konvertiert werden.

Um das Bild zu sehen, müssen wir den MapMarker zu einer Kartenszene hinzufügen. Bitte beachten Sie, dass das MapImage zentriert auf den angegebenen GeoKoordinaten angezeigt wird.

Screenshot: Zufällig platzierte Kartenbilder anzeigen. Der rote Kartenkreis oben markiert die Position der Markierung.

Sie können die geoCoordinates auch aktualisieren, nachdem der Marker zur Karte hinzugefügt wurde: Er wird sofort an der neuen Position angezeigt, nachdem mapMarker.setCoordinates() aufgerufen wurde.

Bitte beachten Sie, dass die chronologische Reihenfolge, in der Kartenmarkierungen zur Karte hinzugefügt werden, bestimmt, welche Markierung zuerst gerendert wird. Dies kann durch Setzen eines expliziten Ziehreihenfolge.

Verankerte POI-Marker

Standardmäßig ist jedes Bild auf die angegebene Position zentriert, und Sie können dies für einige Markierungstypen ändern. Ein Beispiel ist der POI-Marker, der normalerweise mit seiner unteren mittleren Position auf den Standort zeigt.

Daher muss der Ort, an dem das Bild gerendert wird, verschoben werden. Die Standardmitte liegt bei (0.5, 0.5). Wenn die rechte untere Ecke der Ansicht auf die eingestellte GeoKoordinaten-Position zeigen soll, muss der Ankerpunkt auf (1, 1) gesetzt werden.

Ankerpunkte bieten eine bequeme Möglichkeit, die Position anzugeben, an der ein Marker gerendert werden soll: Die obere linke Ecke entspricht einem Ankerpunkt von (0, 0) während die untere rechte Ecke einem Ankerpunkt von (1, 1) entspricht. Unabhängig davon, wie groß die Ansicht ist, beträgt der Punkt mit der halben Breite oder Höhe immer 0,5 - dies ähnelt dem Konzept der normalisierten Textur-UV-Koordinaten.

Abbildung: Normalisierte Ankerpunkte können jeden beliebigen Ort innerhalb oder außerhalb einer Kartenmarkierung angeben.

Wenn Sie den POI so verschieben möchten, dass er auf die Position zeigt, können Sie die standardmäßige mittlere Position (0,5) beibehalten, aber Sie müssen das Bild um 1 nach oben verschieben. 1 ist genauso lang wie die Höhe des Bildes. Beachten Sie, dass Sie auch Werte größer als 1 oder kleiner als 0 angeben können, damit Sie das Bild an jede mögliche Position verschieben können. 2 würde die doppelte Höhe des Bildes darstellen und so weiter.

Um der Karte eine verankerte POI-Markierung hinzuzufügen, sehen Sie sich das folgende Beispiel an:

Für das obige Beispiel wird dem Projekt ein benutzerdefiniertes POI-Bild namens "poi.png" in verschiedenen Auflösungen hinzugefügt. Die Android-Plattform wählt die geeignete Bildauflösung basierend auf der Anzeigedichte des Geräts aus. Sehen Sie sich die beiliegende Beispiel-App an, wie dies möglich ist.

Screenshot: Zufällig platzierte Kartenmarkierungen anzeigen. Der rote Kartenkreis markiert die verankerte Position des Markers.

Im Gegensatz zu Polylinien behält jedes MapImage seine Größe – unabhängig davon, wie stark die Karte vergrößert oder verkleinert wird.

Kartenmarkierungen auswählen

Nachdem Sie die Kartenmarkierungen zur Karte hinzugefügt haben, können Sie mit einem Tippgesten-Listener herausfinden, ob ein Benutzer auf eine Kartenmarkierung getippt hat:

Sobald die Tippgeste erkannt wird, können wir die Ansichtskoordinaten des angetippten Ortes auf dem Bildschirm verwenden, um die Kartenansicht nach Kartenmarkierungen in der Nähe dieses Ortes zu fragen. In den meisten Fällen ist die Angabe eines Radius von zwei Pixeln ausreichend. Dann bietet der PickMapItemsCallback Zugriff auf die gefundenen Kartenelemente, z. B. ein MapPolygon oder ein MapMarker .

Konventionell verwendet das HERE SDK Listener für wiederkehrende Ereignisse wie Gestenereignisse. Einzelne Ereignisse, die nur einmal bearbeitet werden müssen, erfordern einen Rückruf.

Wenn Sie Elemente desselben Typs auswählen, können Sie die Instanzen vergleichen, indem Sie die überschriebene equals() -Methode aufrufen.

Hinzufügen von Metadaten

In vielen Fällen möchten Benutzer möglicherweise mit den angezeigten Markierungen interagieren – zum Beispiel indem sie auf ein Suchergebnis tippen, um mehr Details zu einem Restaurant anzuzeigen. Zu diesem Zweck kann ein MapMarker eine Instanz der Metadata-Klasse enthalten, sodass es möglich ist, verschiedene Datentypen daran anzuhängen - sogar benutzerdefinierte Typen werden unterstützt.

Metadaten können mehrere Schlüssel/Wert-Paare enthalten. Unten erstellen wir einen neuen Schlüssel namens "key_poi" und legen einen String als Wert fest, der die Informationen über den Typ des Markers enthält:

Natürlich können Sie alle Informationen einstellen, die Sie benötigen. In dem Moment, in dem wir den Inhalt einer Metadata-Instanz auslesen möchten, fragen wir einfach nach den für einen Schlüssel gespeicherten Daten, in unserem Beispiel "key_poi":

Eine MapMarker-Instanz enthält standardmäßig keine Metadaten und mapMarker.getMetadata() kann null zurückgeben. Die Daten, auf die durch einen Schlüssel zugegriffen wird, können auch null sein, wenn das Metadata-Objekt solche Informationen nicht enthält.

Wenn dies der Fall ist, suchen wir nach dem für unseren Schlüssel "key_poi" gespeicherten String und rufen eine Hilfsmethode auf, um dem Benutzer den enthaltenen String zu präsentieren. Sie können je nach Vorliebe eine beliebige Zeichenfolge als Schlüssel auswählen, verwenden jedoch einen eindeutigen Schlüssel oder überschreiben ansonsten den für ein anderes Datenelement gespeicherten Inhalt. Um den vollständigen Quellcode des Beispiels zu sehen, überprüfen Sie bitte die MapMarker-Beispiel-App.

Sie können mit der CustomMetadataValue-Schnittstelle auch benutzerdefinierte Objekte in den Metadaten speichern. Ein Beispiel finden Sie im Abschnitt Suche, in dem ein Suchergebnisdatenobjekt als Ganzes gespeichert wird.


Schau das Video: Erstellen Sie ein Objekt aus einzelnen geraden Liniensegmenten AutoCAD 3D Polylinie (Oktober 2021).