Konvertieren zwischen Esri Geometry und WKT mit ArcObjects?

17

Es scheint, als gäbe es in der ArcGIS ArcObjects-API keine Möglichkeit, eine ArcObjects-Geometrie in die bekannte Textdarstellung (und umgekehrt) zu konvertieren. Das einzige, was ich finden konnte, ist die Konvertierung in WKB (die IWkb-Schnittstelle).

Gibt es eine Möglichkeit, eine Konvertierung zwischen Geometrieobjekten und WKT durchzuführen, oder muss ich diese selbst implementieren? Ich strebe hauptsächlich eine .NET-Implementierung ohne große externe Abhängigkeiten an.

Petr Krebs
quelle

Antworten:

7

In der Vergangenheit habe ich den Sharpmap-Konverter verwendet, musste aber zuerst zu WKB. Ich weiß nicht, ob es jetzt die beste Option ist.

SharpMap.Geometries.IGeometry sharpGeom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse(geombytes);
wkt = SharpMap.Converters.WellKnownText.GeometryToWKT.Write(sharpGeom);

SharpMap auf Github

Ich weiß auch nicht, wo sich das aktuelle SharpMap-Repository befindet, aber ich habe hier eine Referenz der Klasse gefunden:

Ich glaube, ich habe damals SharpMap von Codeplex verwendet.

Ich habe ZigGIS vergessen. Möglicherweise können Sie auf diesem Code aufbauen - dieser Link ist der ältere Ziggis. Es sind die Methoden aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt, von denen ich denke, dass sie funktionieren: https://code.google.com/archive/p/ziggis/downloads

Jay Cummins
quelle
AFAIK-Codeplex verfügt immer noch über das aktuellste sharpmap-Repository. sharpmap.codeplex.com
Kirk Kuykendall
Vielen Dank. Ich werde die Konvertierung höchstwahrscheinlich selbst durchführen, aber Code aus vorhandenen OS-Projekten kann einige wertvolle Hinweise liefern.
Petr Krebs
@ JayCummins Der ZigGIS-Link ist tot
Barbarossa
@Barbarossa, ich weiß - ich versuche es zu finden. Obwohl ich vermute, dass es im Ruhestand ist.
Jay Cummins
12

Die Verwendung der IWkb-Schnittstelle macht einen guten Job beim Konvertieren zwischen einer IGeometrie und einer WKB. Von einer WKB können Sie die Microsoft.SqlServer.Types-Bibliothek verwenden, um eine WKB in SqlGeometry und dann wieder in WKT zu konvertieren.

IWkb wkb = geometry as (IWkb); //(Where geometry is an instance of IGeometry)
byte[] wkb_bytes = new byte[wkb.WkbSize];
int byte_count = wkb.WkbSize;
wkb.ExportToWkb(ref byte_count, out wkb_bytes[0]);

Zu diesem Zeitpunkt haben Sie die WKB in wkb_bytes gespeichert. Wenn Sie den nächsten Schritt zu SqlGeometry ausführen möchten, gehen Sie zu WKT:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();
SagebrushGIS
quelle
1
Ihr Ansatz scheint für mich in Ordnung zu sein, aber ich frage mich, welche Wahl ich sridhier getroffen habe. Ich habe dies verwendet: int srid = feature.Shape.SpatialReference.FactoryCode;Stimmen Sie dieser Implementierung zu?
Elrobis
2
Solange Sie eines der vordefinierten Koordinatensysteme von Esri verwenden, funktioniert dies. In der Dokumentation wird Folgendes vermerkt: "Wenn Sie ein benutzerdefiniertes projiziertes Koordinatensystem erstellen, ist der Werkscode Null."
SagebrushGIS
5

Sie könnten versuchen, auf die Microsoft.SqlServer.Types- Assembly zu verweisen (die meiner Meinung nach in der kostenlosen Sql Server Express-Edition enthalten ist), und dann mit der statischen STGeomFromWKB- Methode eine Microsoft-Geometrie erstellen, die dann mit STAsText in WKT konvertiert werden kann .

Beachten Sie auch, dass Microsoft eine Menge Bedenken hat , wenn es darum geht, proprietär zu sein, dass es in seinen SqlServer Spatial Tools bei codeplex Quellcode für viele nützliche Funktionen anbietet. Wenn Ihnen die Abhängigkeit von SqlServerTypes zu groß ist, können Sie möglicherweise den Quellcode finden, der dies tut.

Kirk Kuykendall
quelle
Danke, ich würde lieber keine MsSql-Bits in meine Implementierung ziehen, aber einige der Quellen könnten interessant sein.
Petr Krebs
3

NTS kann WKT "sprechen" und hat Leser und Schreiber für WKB und WKT. Wenn Sie also WKB haben, kann NTS das lesen und an WKT schreiben.

Sie können jedoch auch NTS-Objekte mithilfe der Attribute einer ArcObjects-Geometrie erstellen und dann als WKT ausgeben.

Für eines unserer ArcObjects-Projekte haben wir Dienstprogrammmethoden für NTS zum Verschieben von Geometrie erstellt (hauptsächlich, um die alternativen Projektionsmethoden von NTS zu nutzen).

Wanderer
quelle
Vielen Dank, NTS und GeoTools sehen gut aus. Ich könnte einige Teile in meiner Implementierung wiederverwenden.
Petr Krebs
3

Das Open Source-Projekt DNRGPS (Lizenzierung hier ) verfügt über Erweiterungsmethoden für die Konvertierung zwischen IGeometryund WKT, obwohl Sie diese anpassen müssen, um sie nicht zu verwenden, IObjectFactorywenn Sie sie außerhalb einer ArcGIS-Anwendung verwenden möchten.

Die Lizenz sieht ziemlich freizügig aus, also habe ich meine eigenständige Version (die nicht verwendet wird IObjectFactory) auf GitHub veröffentlicht, wenn sich jemand dafür interessierte:

Update: Ich habe einige Verbesserungen an meiner Version vorgenommen, um das Anwenden von Raumbezügen für die Ausgabegeometrieobjekte und die Verwendung eines für Ganzzahlkoordinaten geeigneten Standardraumbezugs (Plate Carree) zu unterstützen, wenn keiner angegeben ist.

blah238
quelle
Danke, sieh nützlich aus. Am Ende habe ich meinen eigenen WKT-Parser geschrieben. Kann den Quellcode jedoch nicht öffnen.
Petr Krebs
-2

Schauen Sie sich GeometryBridge an, es könnte Ihnen helfen. http://help.arcgis.com/de/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000

Patrick
quelle
Es werden keine WKT-bezogenen Methoden bereitgestellt. Sie könnten es mit WKS verwechseln, einer sicheren Darstellung einer Geometrie (nützlich für die Gewindesicherheit und dergleichen).
Petr Krebs
@Mapperz: auch dort gesucht, funktioniert aber nur für WKT-Darstellungen von Koordinatensystemen und Einheiten, nicht Geometrien
Petr Krebs