Chuyển đổi giữa Esri Geometry và WKT bằng ArcObjects?


17

Có vẻ như không có phương tiện nào để chuyển đổi hình học ArcObjects thành biểu diễn Văn bản được biết đến (và ngược lại) trong API ArcObjects của ArcGIS. Điều duy nhất tôi có thể tìm thấy là chuyển đổi sang WKB (giao diện IWkb).

Có cách nào để thực hiện chuyển đổi giữa các đối tượng hình học và WKT hay tôi phải tự thực hiện nó? Tôi chủ yếu nhắm đến việc thực hiện .NET mà không phụ thuộc nhiều vào bên ngoài.

Câu trả lời:


7

Trước đây, tôi đã sử dụng trình chuyển đổi của Sharpmap, nhưng trước tiên tôi phải truy cập WKB. Tôi không biết nếu nó là lựa chọn tốt nhất bây giờ.

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

Bản đồ sắc nét trên Github

Tôi cũng không biết kho lưu trữ SharpMap hiện tại ở đâu, nhưng tôi đã tìm thấy một tài liệu tham khảo về lớp học ở đây:

Vào thời điểm đó, tôi nghĩ rằng tôi đang sử dụng SharpMap từ Codeplex.

Tôi đã quên ZigGIS. Bạn có thể có thể xây dựng dựa trên mã đó - liên kết này là ziggis cũ hơn. Đó là các phương thức aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt mà tôi nghĩ sẽ hoạt động: https://code.google.com.vn/archive/p/ziggis/doads


Codeplex AFAIK vẫn có kho lưu trữ sharpmap mới nhất. sharpmap.codeplex.com
Kirk Kuykendall

Cảm ơn bạn. Tôi rất có thể sẽ tự mình thực hiện chuyển đổi, nhưng mã từ các dự án hệ điều hành hiện tại có thể cung cấp một số gợi ý có giá trị.
Petr Krebs

@JayCummins Liên kết ZigGIS đã chết
Barbarossa

@Barbarossa, tôi biết - tôi đang cố gắng tìm nó. Mặc dù tôi nghi ngờ nó đã nghỉ hưu.
Jay Cummins

12

Sử dụng giao diện IWkb thực hiện một công việc tốt khi chuyển đổi giữa IGeometry và WKB. Từ WKB, bạn có thể sử dụng thư viện Microsoft.SqlServer.Types để chuyển đổi WKB sang SqlGeometry sau đó quay lại 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]);

Tại thời điểm này, bạn có WKB được lưu trữ trong wkb_bytes. Nếu bạn muốn đi bước tiếp theo đến SqlGeometry thì đến WKT:

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

1
Cách tiếp cận của bạn có vẻ hiệu quả với tôi, nhưng tôi tự hỏi về sự lựa chọn của tôi sridở đây. Tôi đã sử dụng điều này: int srid = feature.Shape.SpatialReference.FactoryCode;Bạn có đồng ý với việc thực hiện đó không?
elrobis

2
Miễn là bạn đang sử dụng một trong những hệ tọa độ được xác định trước của Esri, điều này sẽ hoạt động. Tài liệu lưu ý như sau "Nếu bạn tạo một hệ tọa độ dự kiến ​​tùy chỉnh, mã nhà máy bằng không."
Sage BrushGIS

5

Bạn có thể thử tham khảo cụm Microsoft.SqlServer.Types (mà tôi tin là có trong phiên bản Sql Server Express miễn phí), sau đó sử dụng phương thức tĩnh STGeomFromWKB để tạo hình học microsoft, sau đó có thể được chuyển đổi thành WKT bằng STAsText .

Cũng lưu ý rằng mặc dù Microsoft nắm bắt được rất nhiều thông tin về việc sở hữu độc quyền, nhưng họ cung cấp mã nguồn cho rất nhiều chức năng hữu ích trong Công cụ không gian SqlServer của họ tại codeplex. Vì vậy, nếu SqlServerTypes có quá nhiều phụ thuộc bên ngoài đối với bạn, bạn có thể tìm thấy mã nguồn thực hiện việc này.


Cảm ơn, tôi không muốn kéo bất kỳ bit MsSql nào vào triển khai của mình, nhưng một số nguồn có thể thú vị.
Petr Krebs

3

NTS có thể "nói" WKT, và có độc giả và nhà văn cho cả WKB và WKT. Vì vậy, nếu bạn có WKB, NTS có thể đọc nó và viết vào WKT.

Tuy nhiên, bạn cũng có thể tạo các đối tượng NTS bằng cách sử dụng các thuộc tính của hình học ArcObjects và sau đó xuất ra dưới dạng WKT.

Đối với một trong các dự án ArcObjects của chúng tôi, chúng tôi đã tạo các phương thức tiện ích cho NTS để di chuyển hình học xung quanh (chủ yếu để tận dụng các phương thức chiếu thay thế mà NTS cung cấp).


Cảm ơn bạn, NTS và GeoTools có vẻ tốt, tôi có thể sử dụng lại một số bit trong quá trình triển khai của mình.
Petr Krebs

3

Các DNRGPS dự án mã nguồn mở (cấp phép ở đây ) có phương pháp khuyến nông để chuyển đổi giữa IGeometryvà WKT, mặc dù bạn sẽ phải thích nghi với họ không sử dụng IObjectFactorynếu bạn muốn sử dụng chúng ngoài một ứng dụng ArcGIS.

Giấy phép trông khá dễ dãi nên tôi đã đưa phiên bản độc lập của mình (không sử dụng IObjectFactory) lên GitHub nếu có ai quan tâm:

Cập nhật: Tôi đã thực hiện một vài cải tiến cho phiên bản của mình để hỗ trợ áp dụng các tham chiếu không gian cho các đối tượng hình học đầu ra và sử dụng tham chiếu không gian mặc định thân thiện với tọa độ số (mảng Carree) nếu không được chỉ định.


Cảm ơn bạn, nhìn hữu ích. Tôi thực sự đã kết thúc việc viết trình phân tích cú pháp WKT của riêng tôi. Không thể mã nguồn mở, mặc dù.
Petr Krebs

-2

Nó không cung cấp bất kỳ phương pháp nào liên quan đến WKT ... Bạn có thể nhầm lẫn nó với WKS, đây là một biểu diễn an toàn của hình học (hữu ích cho an toàn luồng và như vậy).
Petr Krebs


@Mapperz: cũng đã xem ở đó, nhưng chỉ hoạt động cho các đại diện WKT của các hệ thống và đơn vị tọa độ, không phải hình học
Petr Krebs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.