Conversion entre la géométrie Esri et WKT à l'aide d'ArcObjects?

17

Il semble qu'il n'y ait aucun moyen de convertir une géométrie ArcObjects en représentation de texte bien connu (et vice versa) dans ArcGIS ArcObjects API. La seule chose que j'ai pu trouver est la conversion en WKB (l'interface IWkb).

Existe-t-il un moyen d'effectuer une conversion entre des objets géométriques et WKT ou dois-je l'implémenter moi-même? Je vise principalement l'implémentation .NET sans trop de dépendances externes.

Petr Krebs
la source

Réponses:

7

Dans le passé, j'ai utilisé le convertisseur de Sharpmap, mais je devais d'abord accéder à WKB. Je ne sais pas si c'est la meilleure option maintenant.

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

SharpMap sur Github

Je ne sais pas non plus où se trouve le référentiel SharpMap actuel, mais j'ai trouvé une référence de la classe ici:

À l'époque, je pense que j'utilisais SharpMap de Codeplex.

J'ai oublié ZigGIS. Vous pourriez être en mesure de construire sur ce code - ce lien est le plus ancien ziggis. Ce sont les méthodes aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt qui, je pense, fonctionneraient: https://code.google.com/archive/p/ziggis/downloads

Jay Cummins
la source
AFAIK codeplex possède toujours le référentiel sharpmap le plus récent. sharpmap.codeplex.com
Kirk Kuykendall
Je vous remercie. Je finirai très probablement par implémenter la conversion par moi-même, mais le code des projets de système d'exploitation existants pourrait fournir de précieux conseils.
Petr Krebs
@JayCummins Le lien ZigGIS est mort
Barbarossa
@Barbarossa, je sais - j'essaye de le trouver. Bien que je soupçonne qu'il est retiré.
Jay Cummins
12

L'utilisation de l'interface IWkb fait un bon travail lors de la conversion entre une IGeometry et WKB. À partir d'un WKB, vous pouvez utiliser la bibliothèque Microsoft.SqlServer.Types pour convertir un WKB en SqlGeometry puis revenir en 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]);

À ce stade, le WKB est stocké dans wkb_bytes. Si vous souhaitez passer à l'étape suivante vers SqlGeometry puis vers WKT:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();
SagebrushGIS
la source
1
Votre approche semble bien fonctionner pour moi, mais je m'interroge sur mon choix d' sridici. J'ai utilisé ceci: int srid = feature.Shape.SpatialReference.FactoryCode;êtes-vous d'accord avec cette mise en œuvre?
elrobis
2
Tant que vous utilisez l'un des systèmes de coordonnées prédéfinis d'Esri, cela fonctionnera. La documentation note ce qui suit "Si vous créez un système de coordonnées projetées personnalisé, le code d'usine est zéro."
SagebrushGIS
5

Vous pouvez essayer de référencer l' assembly Microsoft.SqlServer.Types (qui, je crois, est inclus dans l'édition gratuite Sql Server Express), puis utiliser la méthode statique STGeomFromWKB pour créer une géométrie microsoft, qui pourrait ensuite être convertie en WKT à l'aide de STAsText .

Notez également que bien que Microsoft attrape beaucoup de flak sur le fait d'être propriétaire, ils offrent du code source à de nombreuses fonctions utiles dans leurs outils spatiaux SqlServer sur codeplex. Donc, si le SqlServerTypes est trop de dépendance externe pour vous, vous pourriez être en mesure de trouver le code source qui fait cela.

Kirk Kuykendall
la source
Merci, je préfère ne pas faire glisser de bits MsSql dans mon implémentation, mais une partie de la source pourrait être intéressante.
Petr Krebs
3

NTS peut "parler" WKT et a des lecteurs et des écrivains pour WKB et WKT. Donc, si vous avez WKB, NTS peut lire cela et écrire dans WKT.

Cependant, vous pouvez également créer des objets NTS en utilisant les attributs d'une géométrie ArcObjects, puis les afficher en tant que WKT.

Pour l'un de nos projets ArcObjects, nous avons créé des méthodes utilitaires permettant à NTS de déplacer la géométrie (principalement pour tirer parti des autres méthodes de projection proposées par NTS).

mwalker
la source
Merci, NTS et GeoTools ont l'air bien, je pourrais réutiliser quelques bits dans mon implémentation.
Petr Krebs
3

Le projet open source DNRGPS (licence ici ) a des méthodes d'extension pour la conversion entre IGeometryet WKT, bien que vous deviez les adapter pour ne pas les utiliser IObjectFactorysi vous souhaitez les utiliser en dehors d'une application ArcGIS.

La licence semble assez permissive, donc j'en ai mis ma version autonome (ne l'utilise pas IObjectFactory) sur GitHub si quelqu'un était intéressé:

Mise à jour: j'ai apporté quelques améliorations à ma version pour prendre en charge l'application de références spatiales pour les objets de géométrie en sortie et l'utilisation d'une référence spatiale par défaut adaptée aux coordonnées entières (Plate Carree) si aucune n'est spécifiée.

blah238
la source
Merci, regardez utile. En fait, j'ai fini par écrire mon propre analyseur WKT. Impossible de l'ouvrir, cependant.
Petr Krebs
-2

Découvrez GeometryBridge, il pourrait être en mesure de vous aider. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000

patrick
la source
Il ne fournit aucune méthode liée à WKT ... Vous pouvez le confondre avec WKS, qui est une représentation sûre d'une géométrie (utile pour la sécurité des threads et autres).
Petr Krebs
@Mapperz: regardé là aussi, mais ne fonctionne que pour les représentations WKT des systèmes de coordonnées et des unités, pas les géométries
Petr Krebs