Konversi antara Esri Geometri dan WKT menggunakan ArcObjects?

17

Sepertinya tidak ada cara untuk mengkonversi geometri ArcObjects ke representasi Teks Terkenal (dan sebaliknya) di ArcGIS ArcObjects API. Satu-satunya hal yang dapat saya temukan adalah konversi ke WKB (antarmuka IWkb).

Apakah ada cara untuk melakukan konversi antara objek geometri dan WKT atau apakah saya harus mengimplementasikannya sendiri? Saya terutama bertujuan untuk implementasi .NET tanpa banyak ketergantungan eksternal.

Petr Krebs
sumber

Jawaban:

7

Di masa lalu, saya telah menggunakan konverter Sharpmap, tetapi saya harus pergi ke WKB terlebih dahulu. Saya tidak tahu apakah ini pilihan terbaik sekarang.

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

SharpMap di Github

Saya juga tidak tahu di mana repositori SharpMap saat ini, tetapi saya memang menemukan referensi kelas di sini:

Pada saat itu, saya pikir saya menggunakan SharpMap dari Codeplex.

Saya lupa tentang ZigGIS. Anda mungkin dapat membangun kode itu - tautan ini adalah ziggis lama. Ini adalah metode aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt yang saya pikir akan berfungsi: https://code.google.com/archive/p/ziggis/downloads

Jay Cummins
sumber
AFAIK codeplex masih memiliki repositori sharpmap terbaru. sharpmap.codeplex.com
Kirk Kuykendall
Terima kasih. Saya kemungkinan besar akan mengakhiri konversi sendiri, tetapi kode dari proyek OS yang ada mungkin memberikan beberapa petunjuk berharga.
Petr Krebs
@JayCummins Tautan ZigGIS sudah mati
Barbarossa
@ Barbarossa, saya tahu - saya mencoba untuk menemukannya. Meskipun saya curiga sudah pensiun.
Jay Cummins
12

Menggunakan antarmuka IWkb melakukan pekerjaan yang baik dalam mengkonversi antara IGeometry dan WKB. Dari WKB Anda dapat menggunakan perpustakaan Microsoft.SqlServer.Types untuk mengubah WKB ke SqlGeometry kemudian kembali ke 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]);

Pada titik ini Anda memiliki WKB yang tersimpan di wkb_bytes. Jika Anda ingin melanjutkan ke SqlGeometry kemudian ke WKT:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();
SagebrushGIS
sumber
1
Pendekatan Anda tampaknya bekerja dengan baik untuk saya, tetapi saya ingin tahu tentang pilihan saya di sridsini. Saya menggunakan ini: int srid = feature.Shape.SpatialReference.FactoryCode;Apakah Anda setuju dengan implementasi itu?
elrobis
2
Selama Anda menggunakan salah satu sistem koordinat Esri yang telah ditentukan sebelumnya, ini akan berfungsi. Dokumentasi mencatat sebagai berikut "Jika Anda membuat sistem koordinat yang diproyeksikan khusus, kode pabrik adalah nol."
SagebrushGIS
5

Anda dapat mencoba mereferensikan perakitan Microsoft.SqlServer.Types (yang saya yakini disertakan dengan edisi Sql Server Express gratis), kemudian menggunakan metode statis STGeomFromWKB untuk membuat geometri microsoft, yang kemudian dapat dikonversi menjadi WKT menggunakan STAsText .

Juga perhatikan bahwa sementara Microsoft menangkap banyak kritik tentang kepemilikan, mereka menawarkan kode sumber ke banyak fungsi yang berguna di SqlServer Spatial Tools di codeplex. Jadi jika SqlServerTypes terlalu banyak ketergantungan eksternal untuk Anda, Anda mungkin dapat menemukan kode sumber yang melakukan ini.

Kirk Kuykendall
sumber
Terima kasih, saya lebih suka tidak menyeret bit MsSql ke dalam implementasi saya, tetapi beberapa sumber mungkin menarik.
Petr Krebs
3

NTS dapat "berbicara" WKT, dan memiliki pembaca dan penulis untuk WKB dan WKT. Jadi, jika Anda memiliki WKB, NTS dapat membacanya dan menulis ke WKT.

Namun, Anda juga bisa membuat objek NTS dengan menggunakan atribut geometri ArcObjects dan kemudian output sebagai WKT.

Untuk salah satu proyek ArcObjects kami, kami menciptakan metode utilitas untuk NTS untuk memindahkan geometri (sebagian besar untuk mengambil keuntungan dari metode proyeksi alternatif yang ditawarkan NTS).

mwalker
sumber
Terima kasih, NTS dan GeoTools terlihat bagus, saya mungkin menggunakan kembali beberapa bit dalam implementasi saya.
Petr Krebs
3

The DNRGPS proyek open source (lisensi disini ) memiliki metode penyuluhan untuk mengkonversi antara IGeometrydan WKT, meskipun Anda harus beradaptasi mereka untuk tidak menggunakan IObjectFactoryjika Anda ingin menggunakannya di luar aplikasi ArcGIS.

Lisensi terlihat cukup permisif jadi saya menaruh versi mandiri saya (tidak menggunakan IObjectFactory) itu di GitHub jika ada yang tertarik:

Pembaruan: Saya telah membuat beberapa peningkatan pada versi saya untuk mendukung penerapan referensi spasial untuk objek geometri output dan menggunakan integer referensi spasial default ramah koordinat (Plate Carree) jika tidak ada yang ditentukan.

blah238
sumber
Terima kasih, terlihat bermanfaat. Saya akhirnya menulis parser WKT saya sendiri. Tidak dapat membukanya.
Petr Krebs
-2

Lihat GeometryBridge, mungkin bisa membantu Anda. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000

patrick
sumber
Itu tidak menyediakan metode terkait WKT ... Anda mungkin bingung dengan WKS, yang merupakan representasi aman dari geometri (berguna untuk keamanan benang dan semacamnya).
Petr Krebs
@Mapperz: melihat ke sana juga, tetapi hanya berfungsi untuk representasi WKT sistem dan unit koordinat, bukan geometri
Petr Krebs