ArcObject를 사용하여 Esri Geometry와 WKT로 변환 하시겠습니까?


17

ArcGIS ArcObjects API에서 ArcObjects 지오메트리를 Well-Known Text 표현으로 변환하거나 그 반대로 변환 할 수있는 방법이없는 것 같습니다. 내가 찾은 유일한 것은 WKB (IWkb 인터페이스) 로의 변환입니다.

지오메트리 객체와 WKT간에 변환을 수행하는 방법이 있습니까? 아니면 직접 구현해야합니까? 나는 주로 많은 외부 종속성없이 .NET 구현을 목표로합니다.

답변:


7

과거에는 Sharpmap의 변환기를 사용했지만 먼저 WKB를 사용해야했습니다. 이것이 최선의 선택인지는 모르겠습니다.

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

Github의 SharpMap

또한 현재 SharpMap 리포지토리의 위치를 ​​모르지만 여기에서 클래스에 대한 참조를 찾았습니다.

당시에는 Codeplex의 SharpMap을 사용하고 있다고 생각합니다.

ZigGIS를 잊어 버렸습니다. 이 코드를 기반으로 빌드 할 수 있습니다.이 링크는 이전 버전의 지그입니다. 내가 생각하는 aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt 메소드입니다 : https://code.google.com/archive/p/ziggis/downloads


AFAIK 코드 플렉스에는 여전히 최신 샤프 맵 저장소가 있습니다. sharpmap.codeplex.com
Kirk Kuykendall

감사합니다. 필자가 직접 변환을 구현할 가능성이 높지만 기존 OS 프로젝트의 코드는 유용한 포인터를 제공 할 수 있습니다.
Petr Krebs

@JayCummins ZigGIS 링크가 죽었습니다
Barbarossa

@Barbarossa, 나는 그것을 찾으려고 노력하고있다. 나는 그것이 은퇴했다고 의심하지만.
Jay Cummins

12

IWkb 인터페이스를 사용하면 IGeometry와 WKB를 변환 할 때 훌륭한 작업을 수행 할 수 있습니다. WKB에서 Microsoft.SqlServer.Types 라이브러리를 사용하여 WKB를 SqlGeometry로 변환 한 다음 다시 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]);

이 시점에서 WKB는 wkb_bytes에 저장됩니다. 다음 단계를 SqlGeometry로 이동하려면 WKT로 이동하십시오.

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

1
귀하의 접근 방식은 나에게 잘 작동하는 것 같지만 srid여기에서 내가 선택한 것을 궁금 합니다. 나는 이것을 사용했다 : int srid = feature.Shape.SpatialReference.FactoryCode;당신은 그 구현에 동의합니까?
elrobis

2
Esri의 사전 정의 된 좌표계 ​​중 하나를 사용하는 한 이것이 작동합니다. 설명서는 다음과 같이 설명합니다. "사용자 정의 투영 좌표계를 생성하면 팩토리 코드는 0입니다."
SagebrushGIS

5

당신은 참조 시도 할 수 있습니다 Microsoft.SqlServer.Types을 한 후 사용 (나는 자유은 SQL Server Express 버전에 포함되어 생각하는) 조립 STGeomFromWKB의 다음 사용 WKT로 변환 할 수있는 마이크로 소프트의 형상을 만들 정적 메소드를 STAsText을 .

또한 Microsoft는 독점적이라는 점에 대해 많은 단점을 가지고 있지만 코드 플렉스에서 SqlServer Spatial Tools유용한 기능 에 대한 소스 코드를 제공합니다 . 따라서 SqlServerTypes가 너무 많은 외부 종속성 인 경우이를 수행하는 소스 코드를 찾을 수 있습니다.


고맙게도 MsSql 비트를 구현으로 드래그하지 않지만 일부 소스는 흥미로울 수 있습니다.
Petr Krebs

3

NTS 는 WKT를 "말할 수"있으며 WKB와 WKT를위한 독자와 작가가 있습니다. 따라서 WKB가 있으면 NTS가이를 읽고 WKT에 쓸 수 있습니다.

그러나 ArcObjects 지오메트리의 속성을 사용하여 NTS 객체를 만든 다음 WKT로 출력 할 수도 있습니다.

ArcObjects 프로젝트 중 하나를 위해 NTS가 지오메트리를 이동할 수있는 유틸리티 방법을 만들었습니다 (주로 NTS가 제공하는 대체 투영 방법을 활용하기 위해).


고맙습니다. NTS와 GeoTools는 좋아 보입니다. 구현에 약간의 비트를 재사용 할 수 있습니다.
Petr Krebs

3

DNRGPS 오픈 소스 (라이센스 프로젝트 여기 ) 사이의 변환에 대한 확장 메서드를 가지고 IGeometry당신이 그 (것)들을 사용하지에 적응해야 할 것이다 있지만, WKT와 IObjectFactory당신이는 ArcGIS 응용 프로그램 외부에서이를 사용하려는 경우.

라이센스는 꽤 관대 한 것처럼 보이므로 IObjectFactory관심이 있다면 GitHub에 독립형 버전 (사용하지 않음 )을 올려 놓았습니다.

업데이트 : 출력 지오메트리 객체에 공간 참조를 적용하고 지정되지 않은 경우 정수 좌표 친화적 기본 공간 참조 (Plate Carree) 사용을 지원하도록 버전이 약간 개선되었습니다.


감사합니다, 유용 해 보입니다. 나는 실제로 내 자신의 WKT 파서를 작성했다. 그래도 소스를 열 수 없습니다.
Petr Krebs

-2

GeometryBridge를 확인하면 도움이 될 수 있습니다. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000


WKT 관련 방법을 제공하지 않습니다 ... WKS와 혼동 할 수 있습니다. WKS는 형상의 안전한 표현입니다 (스레드 안전 등에 유용함).
Petr Krebs


@Mapperz : 거기도 보았지만, 좌표계와 단위의 WKT 표현에 대해서만 작동합니다.
Petr Krebs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.