Conversione tra Esri Geometry e WKT utilizzando ArcObjects?


17

Sembra che non vi sia alcun modo di convertire una geometria ArcObjects nella rappresentazione di testo noto (e viceversa) nell'API ArcOIS di ArcGIS. L'unica cosa che sono riuscito a trovare è la conversione in WKB (l'interfaccia IWkb).

Esiste un modo per eseguire la conversione tra oggetti geometrici e WKT o devo implementarlo da solo? Miro principalmente all'implementazione di .NET senza molte dipendenze esterne.

Risposte:


7

In passato ho usato il convertitore di Sharpmap, ma prima dovevo raggiungere WKB. Non so se sia l'opzione migliore ora.

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

SharpMap su Github

Inoltre non so dove sia il repository SharpMap corrente, ma ho trovato un riferimento alla classe qui:

All'epoca, penso di usare SharpMap di Codeplex.

Mi sono dimenticato di ZigGIS. Potresti essere in grado di basarti su quel codice: questo link è il vecchio ziggis. Sono i metodi aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt che sto pensando funzionerebbe: https://code.google.com/archive/p/ziggis/downloads


Il codeplex AFAIK ha ancora il repository sharpmap più attuale. sharpmap.codeplex.com
Kirk Kuykendall il

Grazie. Molto probabilmente finirò per implementare la conversione da solo, ma il codice proveniente da progetti di sistemi operativi esistenti potrebbe fornire alcuni preziosi suggerimenti.
Petr Krebs,

@JayCummins Il collegamento ZigGIS è morto
Barbarossa,

@ Barbarossa, lo so - sto cercando di trovarlo. Anche se sospetto che sia andato in pensione.
Jay Cummins,

12

L'uso dell'interfaccia IWkb fa un buon lavoro nel convertire tra IGeometry e WKB. Da un WKB è possibile utilizzare la libreria Microsoft.SqlServer.Types per convertire un WKB in SqlGeometry, quindi di nuovo in WKT.

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]);

A questo punto il WKB è archiviato in wkb_bytes. Se vuoi andare al passo successivo a SqlGeometry, poi a WKT:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();

1
Il tuo approccio sembra funzionare bene per me, ma mi chiedo quale sia la mia scelta di sridqui. Ho usato questo: int srid = feature.Shape.SpatialReference.FactoryCode;sei d'accordo con questa implementazione?
elrobis,

2
Finché stai usando uno dei sistemi di coordinate predefiniti di Esri, questo funzionerà. La documentazione riporta quanto segue "Se si crea un sistema di coordinate proiettato personalizzato, il codice di fabbrica è zero".
SagebrushGIS,

5

Potresti provare a fare riferimento all'assembly Microsoft.SqlServer.Types (che credo sia incluso con l'edizione gratuita Sql Server Express), quindi utilizzare il metodo statico STGeomFromWKB per creare una geometria microsoft, che potrebbe quindi essere convertita in WKT utilizzando STAsText .

Si noti inoltre che mentre Microsoft rileva un sacco di difetti nell'essere proprietario, offre codice sorgente a molte funzioni utili nei loro strumenti spaziali SqlServer su codeplex. Quindi, se SqlServerTypes è troppa dipendenza esterna per te, potresti essere in grado di trovare il codice sorgente che lo fa.


Grazie, preferirei non trascinare alcun bit MsSql nella mia implementazione, ma alcuni dei sorgenti potrebbero essere interessanti.
Petr Krebs,

3

NTS può "parlare" WKT e ha lettori e scrittori sia per WKB che per WKT. Quindi, se hai WKB, NTS può leggerlo e scriverlo su WKT.

Tuttavia, è anche possibile creare oggetti NTS utilizzando gli attributi di una geometria ArcObjects e quindi l'output come WKT.

Per uno dei nostri progetti ArcObjects abbiamo creato metodi di utilità per NTS per spostare la geometria (principalmente per sfruttare i metodi di proiezione alternativi offerti da NTS).


Grazie, NTS e GeoTools sembrano a posto, potrei riutilizzare alcuni bit nella mia implementazione.
Petr Krebs,

3

Il progetto open source DNRGPS ( qui le licenze ) ha metodi di estensione per la conversione tra IGeometrye WKT, anche se dovresti adattarli per non usarli IObjectFactoryse vuoi usarli al di fuori di un'applicazione ArcGIS.

La licenza sembra piuttosto permissiva, quindi ho messo la mia versione standalone (non la usa IObjectFactory) su GitHub se qualcuno fosse interessato:

Aggiornamento: ho apportato alcuni miglioramenti alla mia versione per supportare l'applicazione di riferimenti spaziali per gli oggetti della geometria di output e l'utilizzo di un riferimento spaziale predefinito compatibile con le coordinate intere (Plate Carree) se non ne viene specificato nessuno.


Grazie, sembri utile. Ho finito per scrivere il mio parser WKT. Non è possibile open source, però.
Petr Krebs,

-2

Non fornisce alcun metodo relativo a WKT ... Potresti confonderlo con WKS, che è una rappresentazione sicura di una geometria (utile per la sicurezza della filettatura e simili).
Petr Krebs,


@Mapperz: guardato anche lì, ma funziona solo per le rappresentazioni WKT di sistemi e unità di coordinate, non di geometrie
Petr Krebs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.