Konwertujesz między geometrią Esri i WKT za pomocą ArcObjects?

17

Wygląda na to, że nie ma możliwości przekonwertowania geometrii ArcObjects na dobrze znaną reprezentację tekstu (i odwrotnie) w ArcGIS ArcObjects API. Jedyne, co udało mi się znaleźć, to konwersja do WKB (interfejs IWkb).

Czy istnieje sposób na konwersję między obiektami geometrycznymi a WKT, czy też muszę go zaimplementować? Dążę przede wszystkim do implementacji platformy .NET bez większych zależności zewnętrznych.

Petr Krebs
źródło

Odpowiedzi:

7

W przeszłości korzystałem z konwertera Sharpmap, ale najpierw musiałem dostać się do WKB. Nie wiem, czy jest to teraz najlepsza opcja.

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

SharpMap na Github

Nie wiem też, gdzie znajduje się bieżące repozytorium SharpMap, ale znalazłem tutaj odwołanie do klasy:

Myślę, że wtedy korzystałem z SharpMap firmy Codeplex.

Zapomniałem o ZigGIS. Możesz być w stanie zbudować na tym kodzie - ten link to starsze zygzaki. To metody aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt, które moim zdaniem powinny zadziałać: https://code.google.com/archive/p/ziggis/downloads

Jay Cummins
źródło
Kodepleks AFAIK wciąż ma najbardziej aktualne repozytorium map. sharpmap.codeplex.com
Kirk Kuykendall
Dziękuję Ci. Najprawdopodobniej sami skończę konwersję, ale kod z istniejących projektów systemu operacyjnego może dostarczyć cennych wskazówek.
Petr Krebs,
@JayCummins Link ZigGIS nie działa
Barbarossa
@Barbarossa, wiem - próbuję to znaleźć. Chociaż podejrzewam, że jest na emeryturze.
Jay Cummins
12

Korzystanie z interfejsu IWkb ma niezłą robotę przy konwersji pomiędzy IGeometry i WKB. Z WKB możesz użyć biblioteki Microsoft.SqlServer.Types, aby przekonwertować WKB na SqlGeometry, a następnie z powrotem do 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]);

W tym momencie masz WKB zapisane w wkb_bytes. Jeśli chcesz przejść do następnego kroku do SqlGeometry, a następnie do WKT:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();
SagebrushGIS
źródło
1
Twoje podejście wydaje się dla mnie w porządku, ale zastanawiam się nad moim wyborem sridtutaj. Użyłem tego: int srid = feature.Shape.SpatialReference.FactoryCode;czy zgadzasz się z tym wdrożeniem?
elrobis
2
Tak długo, jak używasz jednego ze wstępnie zdefiniowanych układów współrzędnych Esri, będzie to działać. Dokumentacja zawiera następujące uwagi: „Jeśli utworzysz niestandardowy rzutowany układ współrzędnych, kod fabryczny to zero”.
SagebrushGIS,
5

Możesz spróbować odwołać się do zestawu Microsoft.SqlServer.Types (który moim zdaniem jest dołączony do bezpłatnej wersji Sql Server Express), a następnie użyć metody statycznej STGeomFromWKB , aby utworzyć geometrię Microsoft, którą można następnie przekonwertować na WKT za pomocą STAsText .

Zauważ też, że chociaż Microsoft chwyta się wielu zarzutów dotyczących własności, oferuje kod źródłowy wielu użytecznych funkcji w SqlServer Spatial Tools w codeplex. Więc jeśli SqlServerTypes ma zbyt dużą zależność zewnętrzną, możesz być w stanie znaleźć kod źródłowy, który to robi.

Kirk Kuykendall
źródło
Dzięki, wolałbym nie przeciągać żadnych bitów MsSql do mojej implementacji, ale niektóre źródła mogą być interesujące.
Petr Krebs,
3

NTS może „mówić” w języku WKT i ma czytniki i pisarki dla WKB i WKT. Więc jeśli masz WKB, NTS może to przeczytać i napisać do WKT.

Można jednak również tworzyć obiekty NTS przy użyciu atrybutów geometrii ArcObjects, a następnie generować je jako WKT.

Dla jednego z naszych projektów ArcObjects stworzyliśmy narzędzia do przesuwania geometrii przez NTS (głównie w celu wykorzystania alternatywnych metod projekcji oferowanych przez NTS).

mwalker
źródło
Dziękuję, NTS i GeoTools wyglądają dobrze, mogę ponownie wykorzystać niektóre bity w mojej implementacji.
Petr Krebs,
3

Projekt open source DNRGPS ( tutaj licencjonowanie ) ma metody rozszerzeń do konwersji między IGeometryWKT, ale trzeba je dostosować, aby nie używać, IObjectFactoryjeśli chcesz używać ich poza aplikacją ArcGIS.

Licencja wygląda dość liberalnie, więc umieściłem IObjectFactoryją w GitHub w wersji autonomicznej (nie używa ), jeśli ktoś był zainteresowany:

Aktualizacja: Wprowadziłem kilka ulepszeń do mojej wersji, aby obsługiwać stosowanie odniesień przestrzennych do wyjściowych obiektów geometrii i używanie przyjaznego dla współrzędnych całkowitych domyślnego odniesienia przestrzennego (Plate Carree), jeśli nie jest określony.

blah238
źródło
Dziękuję, wyglądaj przydatnie. Skończyło się na tym, że napisałem własny parser WKT. Nie można go jednak otworzyć.
Petr Krebs
-2

Sprawdź GeometryBridge, może ci pomóc. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000

Patrick
źródło
Nie zapewnia żadnych metod związanych z WKT ... Być może mylisz go z WKS, który jest bezpieczną reprezentacją geometrii (przydatny dla bezpieczeństwa gwintu i tym podobnych).
Petr Krebs,
@Mapperz: też tam zajrzał, ale działa tylko w przypadku reprezentacji układów i jednostek współrzędnych WKT, a nie geometrii
Petr Krebs,