¿Convertir entre Esri Geometry y WKT usando ArcObjects?

17

Parece que no hay forma de convertir una geometría de ArcObjects a la representación de texto conocido (y viceversa) en ArcGIS ArcObjects API. Lo único que pude encontrar es la conversión a WKB (la interfaz IWkb).

¿Hay alguna manera de realizar la conversión entre objetos de geometría y WKT o tengo que implementarlo yo mismo? Principalmente apunto a la implementación de .NET sin muchas dependencias externas.

Petr Krebs
fuente

Respuestas:

7

En el pasado, usé el convertidor de Sharpmap, pero primero tenía que llegar a WKB. No sé si es la mejor opción ahora.

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

SharpMap en Github

Tampoco sé dónde está el repositorio actual de SharpMap, pero encontré una referencia de la clase aquí:

En ese momento, creo que estaba usando SharpMap de Codeplex.

Me olvidé de ZigGIS. Es posible que pueda construir sobre ese código: este enlace son los ziggis más antiguos. Son los métodos aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt que creo que funcionarían: https://code.google.com/archive/p/ziggis/downloads

Jay Cummins
fuente
Codeplex AFAIK todavía tiene el repositorio Sharpmap más actual. sharpmap.codeplex.com
Kirk Kuykendall
Gracias. Lo más probable es que termine implementando la conversión por mi cuenta, pero el código de los proyectos de SO existentes podría proporcionar algunos indicadores valiosos.
Petr Krebs
@JayCummins El enlace ZigGIS está muerto
Barbarroja
@Barbarossa, lo sé, estoy tratando de encontrarlo. Aunque sospecho que está retirado.
Jay Cummins
12

El uso de la interfaz IWkb hace un buen trabajo al convertir entre un IGeometry y WKB. Desde un WKB puede usar la biblioteca Microsoft.SqlServer.Types para convertir un WKB a SqlGeometry y luego volver a 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]);

En este punto, tiene el WKB almacenado en wkb_bytes. Si desea ir al siguiente paso a SqlGeometry y luego a WKT:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();
SagebrushGIS
fuente
1
Su enfoque parece funcionar bien para mí, pero me pregunto sobre mi elección de sridaquí. Usé esto: int srid = feature.Shape.SpatialReference.FactoryCode;¿Estás de acuerdo con esa implementación?
elrobis
2
Mientras esté utilizando uno de los sistemas de coordenadas predefinidos de Esri, esto funcionará. La documentación señala lo siguiente: "Si crea un sistema de coordenadas proyectadas personalizado, el código de fábrica es cero".
SagebrushGIS
5

Puede intentar hacer referencia al ensamblado Microsoft.SqlServer.Types (que creo que se incluye con la edición gratuita Sql Server Express), luego usar el método estático STGeomFromWKB para crear una geometría de microsoft, que luego podría convertirse en WKT usando STAsText .

También tenga en cuenta que, si bien Microsoft detecta muchas fallas acerca de ser propietario, ofrecen código fuente para muchas funciones útiles en sus Herramientas espaciales SqlServer en codeplex. Entonces, si SqlServerTypes tiene demasiada dependencia externa para usted, es posible que pueda encontrar el código fuente que lo hace.

Kirk Kuykendall
fuente
Gracias, prefiero no arrastrar ningún bit MsSql a mi implementación, pero algunas de las fuentes pueden ser interesantes.
Petr Krebs
3

NTS puede "hablar" WKT, y tiene lectores y escritores para WKB y WKT. Entonces, si tiene WKB, NTS puede leer eso y escribir en WKT.

Sin embargo, también puede crear objetos NTS utilizando los atributos de una geometría de ArcObjects y luego generarlos como WKT.

Para uno de nuestros proyectos de ArcObjects, creamos métodos de utilidad para que NTS mueva la geometría (principalmente para aprovechar los métodos de proyección alternativos que ofrece NTS).

mwalker
fuente
Gracias, NTS y ​​GeoTools se ven bien, podría reutilizar algunos bits en mi implementación.
Petr Krebs
3

El proyecto de código abierto DNRGPS (licencia aquí ) tiene métodos de extensión para convertir entre IGeometryy WKT, aunque tendría que adaptarlos para que no se usen IObjectFactorysi desea usarlos fuera de una aplicación ArcGIS.

La licencia parece bastante permisiva, así que puse mi versión independiente (no la usa IObjectFactory) en GitHub si alguien estaba interesado:

Actualización: He realizado algunas mejoras en mi versión para admitir la aplicación de referencias espaciales para los objetos de geometría de salida y el uso de una referencia espacial predeterminada amigable de coordenadas enteras (Plate Carree) si no se especifica ninguna.

blah238
fuente
Gracias, luce útil. De hecho, terminé escribiendo mi propio analizador WKT. Sin embargo, no se puede abrir el código fuente.
Petr Krebs
-2

Echa un vistazo a GeometryBridge, podría ayudarte. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000

Patricio
fuente
No proporciona ningún método relacionado con WKT ... Puede estar confundiéndolo con WKS, que es una representación segura de una geometría (útil para la seguridad del hilo y demás).
Petr Krebs
@Mapperz: también buscó allí, pero solo funciona para representaciones WKT de sistemas de coordenadas y unidades, no geometrías
Petr Krebs