ArcObjects kullanarak Esri Geometri ve WKT arasında dönüştürme?


17

Bir ArcObjects geometrisini ArcGIS ArcObjects API'sında Bilinen Metin temsiline (veya tam tersi) dönüştürmenin bir yolu yok gibi görünüyor. Bulabildiğim tek şey WKB'ye (IWkb arayüzü) dönüşmektir.

Geometri nesneleri ile WKT arasında dönüştürme yapmanın bir yolu var mı yoksa bunu kendim mi uygulamak zorundayım? Öncelikle dışsal bağımlılıklar olmadan .NET uygulamasını hedefliyorum.

Yanıtlar:


7

Geçmişte Sharpmap'in dönüştürücüsünü kullandım, ama önce WKB'ye gitmem gerekiyordu. Şimdi en iyi seçenek olup olmadığını bilmiyorum.

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

Github'da SharpMap

Ayrıca şu anki SharpMap deposunun nerede olduğunu bilmiyorum, ama burada sınıfın bir referansını buldum:

O zaman, sanırım Codeplex'ten SharpMap kullanıyordum.

ZigGIS'i unuttum. Bu kodu üzerine inşa edebilirsiniz - bu bağlantı eski ziggilerdir. Çalışacağını düşündüğüm aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt yöntemleri: https://code.google.com/archive/p/ziggis/downloads


AFAIK kodplex hala en güncel sharpmap deposuna sahiptir. sharpmap.codeplex.com
Kirk

Teşekkür ederim. Büyük olasılıkla dönüşümü kendi başıma uygulayacağım, ancak mevcut işletim sistemi projelerinden gelen kod bazı değerli işaretçiler sağlayabilir.
Petr Krebs

@JayCummins ZigGIS bağlantısı öldü
Barbarossa

@Barbarossa, biliyorum - bulmaya çalışıyorum. Emekli olduğundan şüphelenmeme rağmen.
Jay Cummins

12

IWkb arabirimini kullanmak, IGeometri ve WKB arasında dönüştürme konusunda iyi bir iş çıkarır. Bir WKB'den, bir WKB'yi SqlGeometry'ye ve sonra tekrar WKT'ye dönüştürmek için Microsoft.SqlServer.Types kitaplığını kullanabilirsiniz.

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

Bu noktada wkb_bytes içinde WKB depolanmış. SqlGeometry'ye bir sonraki adıma geçmek istiyorsanız WKT'ye gidin:

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

1
Yaklaşımın benim için iyi çalışıyor gibi görünüyor, ama sridburada seçimimi merak ediyorum . Bunu kullandım: int srid = feature.Shape.SpatialReference.FactoryCode;Bu uygulamaya katılıyor musunuz?
elrobis

2
Esri'nin önceden tanımlanmış koordinat sistemlerinden birini kullandığınız sürece bu işe yarayacaktır. Belgeler aşağıdaki "Özel bir öngörülen koordinat sistemi oluşturursanız, fabrika kodu sıfırdır."
SagebrushGIS

5

Sen referans deneyebilirsiniz Microsoft.SqlServer.Types sonra kullanın (ben özgür SQL Server Express sürümü ile birlikte inandığınız) montaj STGeomFromWKB sonra kullanarak WKT dönüştürülebilir olabilecek bir microsoft geometri oluşturmak için statik yöntemini STAsText .

Microsoft'un tescilli olma konusunda çok fazla bilgi yakalamasına rağmen , codeplex'teki SqlServer Uzamsal Araçlarında birçok yararlı işleve kaynak kodu sunduğunu unutmayın . Eğer SqlServerTypes sizin için çok fazla dış bağımlılık ise, bunu yapan kaynak kodunu bulabilirsiniz.


Teşekkürler, benim uygulama içine herhangi bir MsSql bit sürüklemek istemem, ancak bazı kaynak ilginç olabilir.
Petr Krebs

3

NTS WKT'yi "konuşabilir" ve hem WKB hem de WKT için okuyucular ve yazarlar vardır. Yani WKB'niz varsa, NTS bunu okuyabilir ve WKT'ye yazabilir.

Ancak, bir ArcObjects geometrisinin niteliklerini kullanarak NTS nesneleri oluşturabilir ve ardından WKT olarak çıktı alabilirsiniz.

ArcObjects projelerimizden biri için NTS için geometriyi hareket ettirmek için (çoğunlukla NTS'nin sunduğu alternatif projeksiyon yöntemlerinden yararlanmak için) faydalı yöntemler oluşturduk.


Teşekkür ederim, NTS ve GeoTools iyi görünüyor, bazı bitleri uygulamamda tekrar kullanabilirim.
Petr Krebs

3

DNRGPS açık kaynak (lisans projeyi burada ) arasında dönüştürmek için uzatma yöntemleri vardır IGeometrybunları kullanmayın uyum olurdu rağmen, WKT ve IObjectFactorybir ArcGIS uygulamanın dışında kullanmak istiyorum.

Lisans oldukça hoş görünüyor bu yüzden IObjectFactoryGitHub benim bağımsız sürümü (kullanmıyor ) koymak ilgilenen varsa:

Güncelleme: Çıktı geometrisi nesneleri için uzamsal referanslar uygulanmasını ve hiçbiri belirtilmezse tamsayı koordinat dostu varsayılan uzamsal referansı (Plate Carree) kullanmayı desteklemek için sürümümde birkaç iyileştirme yaptım.


Teşekkür ederim, faydalı görünüyorsun. Aslında kendi WKT ayrıştırıcımı yazdım. Yine de kaynak açılamıyor.
Petr Krebs

-2

WKT ile ilgili herhangi bir yöntem sağlamaz ... Bir geometrinin güvenli bir temsili olan WKS ile karıştırıyor olabilirsiniz (iplik güvenliği ve benzeri için yararlıdır).
Petr Krebs


@Mapperz: oraya da baktı, ancak geometri için değil, yalnızca koordinat sistemlerinin ve birimlerinin WKT gösterimleri için çalışıyor
Petr Krebs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.