Convertendo entre Esri Geometry e WKT usando ArcObjects?

17

Parece que não há como converter uma geometria do ArcObjects na representação de texto conhecido (e vice-versa) na API do ArcGIS ArcObjects. A única coisa que consegui encontrar é a conversão para WKB (a interface IWkb).

Existe uma maneira de executar a conversão entre objetos de geometria e o WKT ou eu mesmo tenho que implementá-lo? Eu viso principalmente a implementação do .NET sem muitas dependências externas.

Petr Krebs
fonte

Respostas:

7

No passado, eu usei o conversor do Sharpmap, mas tive que chegar ao WKB primeiro. Não sei se é a melhor opção agora.

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

SharpMap no Github

Também não sei onde está o repositório atual do SharpMap, mas encontrei uma referência da classe aqui:

Na época, acho que estava usando o SharpMap da Codeplex.

Eu esqueci o ZigGIS. Você pode criar esse código - esse link é o ziggis mais antigo. São os métodos aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt que eu acho que funcionariam: https://code.google.com/archive/p/ziggis/downloads

Jay Cummins
fonte
O codeplex AFAIK ainda possui o repositório sharpmap mais atual. sharpmap.codeplex.com
Kirk Kuykendall
Obrigado. Provavelmente acabarei implementando a conversão por conta própria, mas o código de projetos existentes do SO pode fornecer alguns indicadores valiosos.
Petr Krebs
@JayCummins O link do ZigGIS está morto #
Barbarossa
@ Barbarossa, eu sei - estou tentando encontrá-lo. Embora eu suspeite que esteja aposentado.
Jay Cummins
12

O uso da interface IWkb faz um bom trabalho na conversão entre um IGeometry e WKB. Em um WKB, você pode usar a biblioteca Microsoft.SqlServer.Types para converter um WKB em SqlGeometry e voltar ao 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]);

Neste ponto, você tem o WKB armazenado em wkb_bytes. Se você deseja ir para o próximo passo para SqlGeometry, em seguida, para WKT:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();
SagebrushGIS
fonte
1
Sua abordagem parece funcionar bem para mim, mas estou me perguntando sobre a minha escolha sridaqui. Eu usei o seguinte: int srid = feature.Shape.SpatialReference.FactoryCode;Você concorda com essa implementação?
9134 elrobis
2
Enquanto você estiver usando um dos sistemas de coordenadas predefinidos da Esri, isso funcionará. A documentação observa o seguinte "Se você criar um sistema de coordenadas projetadas personalizadas, o código de fábrica será zero".
precisa
5

Você pode tentar fazer referência ao assembly Microsoft.SqlServer.Types (que acredito estar incluído na edição gratuita do Sql Server Express) e, em seguida, usar o método estático STGeomFromWKB para criar uma geometria da Microsoft, que pode ser convertida em WKT usando STAsText .

Observe também que, embora a Microsoft receba muitas críticas por ser proprietária, elas oferecem código fonte para muitas funções úteis em suas Ferramentas Espaciais do SqlServer no codeplex. Portanto, se o SqlServerTypes tiver muita dependência externa, você poderá encontrar o código-fonte que faz isso.

Kirk Kuykendall
fonte
Obrigado, prefiro não arrastar nenhum bit MsSql para minha implementação, mas parte da fonte pode ser interessante.
Petr Krebs
3

O NTS pode "falar" o WKT e possui leitores e escritores para o WKB e o WKT. Portanto, se você possui WKB, o NTS pode ler e escrever no WKT.

No entanto, você também pode criar objetos NTS usando os atributos de uma geometria do ArcObjects e, em seguida, produzir como WKT.

Para um de nossos projetos do ArcObjects, criamos métodos utilitários para o NTS mover a geometria (principalmente para aproveitar os métodos alternativos de projeção que o NTS oferece).

mwalker
fonte
Obrigado, o NTS e o GeoTools parecem bons; talvez eu reutilize alguns bits na minha implementação.
Petr Krebs
3

O projeto de código-fonte aberto DNRGPS (licenciamento aqui ) possui métodos de extensão para conversão entre IGeometrye WKT, embora você precise adaptá-los para não usá-los IObjectFactoryse desejar usá-los fora de um aplicativo ArcGIS.

A licença parece bastante permissiva, então eu coloquei minha versão autônoma (não a usa IObjectFactory) dela no GitHub se alguém estivesse interessado:

Atualização: fiz algumas melhorias na minha versão para oferecer suporte à aplicação de referências espaciais para os objetos de geometria de saída e ao uso de uma referência espacial padrão amigável de coordenadas inteiras (Plate Carree), se nenhuma for especificada.

blah238
fonte
Obrigado, pareça útil. Na verdade, acabei escrevendo meu próprio analisador WKT. Não é possível abrir o código-fonte, no entanto.
31813 Petr Krebs
-2

Confira GeometryBridge, pode ser capaz de ajudá-lo. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000

patrick
fonte
Ele não fornece nenhum método relacionado ao WKT ... Você pode confundi-lo com o WKS, que é uma representação segura de uma geometria (útil para segurança de linhas e outras).
Petr Krebs
@Mapperz: olhou para lá também, mas funciona apenas para representações WKT de sistemas e unidades de coordenadas, não geometrias
Petr Krebs