การแปลงระหว่าง Esri Geometry และ WKT โดยใช้ ArcObjects?


17

ดูเหมือนว่าไม่มีวิธีการแปลงเรขาคณิต ArcObjects เป็นตัวแทนข้อความที่รู้จักกันดี (และในทางกลับกัน) ใน ArcGIS ArcObjects API สิ่งเดียวที่ฉันสามารถค้นหาได้คือการแปลงเป็น WKB (อินเทอร์เฟซ IWkb)

มีวิธีที่จะทำการแปลงระหว่างวัตถุรูปทรงเรขาคณิตกับ WKT หรือฉันต้องใช้มันเอง? ฉันตั้งเป้าหมายในการติดตั้ง. NET เป็นหลักโดยไม่ต้องพึ่งพาภายนอกมากนัก

คำตอบ:


7

ในอดีตฉันใช้ตัวแปลงของชาร์ปแมป แต่ฉันต้องไปที่ WKB ก่อน ฉันไม่รู้ว่ามันเป็นตัวเลือกที่ดีที่สุดตอนนี้หรือไม่

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

SharpMap บน Github

ฉันยังไม่รู้ว่าแหล่งเก็บข้อมูล SharpMap ปัจจุบันอยู่ที่ใด แต่ฉันพบการอ้างอิงของชั้นเรียนที่นี่:

ในตอนนั้นฉันคิดว่าฉันใช้ SharpMap จาก Codeplex

ฉันลืมเกี่ยวกับ ZigGIS คุณอาจสร้างรหัสได้ - ลิงค์นี้เป็นซิกแซกที่เก่ากว่า มันเป็นวิธี aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt ที่ฉันคิดว่าจะใช้ได้: https://code.google.com/archive/p/ziggis/downloads


AFAIK codeplex ยังคงมีพื้นที่เก็บข้อมูลชาร์ปล่าสุด sharpmap.codeplex.com
Kirk Kuykendall

ขอขอบคุณ. ฉันมักจะใช้การแปลงด้วยตัวเอง แต่รหัสจากโครงการระบบปฏิบัติการที่มีอยู่อาจมีตัวชี้ที่มีค่าบางอย่าง
Petr Krebs

@JayCummins ลิงก์ ZigGIS is dead
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 สิ่งนี้จะใช้ได้ เอกสารประกอบการบันทึกต่อไปนี้ "ถ้าคุณสร้างระบบพิกัดที่กำหนดเองที่กำหนดไว้แล้วรหัสโรงงานจะเป็นศูนย์"
SagebrushGIS

5

คุณอาจลองอ้างอิงMicrosoft.SqlServer.Typesประกอบ (ซึ่งผมเชื่อว่ามีอยู่ในฟรี SQL Server Express Edition) จากนั้นใช้STGeomFromWKB วิธีการแบบคงที่จะสร้างรูปทรงเรขาคณิตที่ไมโครซอฟท์ซึ่งก็จะถูกแปลงเป็น WKT ใช้STAsText

โปรดทราบว่าในขณะที่ Microsoft จับข้อบกพร่องจำนวนมากเกี่ยวกับการเป็นกรรมสิทธิ์พวกเขาจะเสนอซอร์สโค้ดให้กับฟังก์ชันที่มีประโยชน์มากมายในเครื่องมือ Spatial SqlServer Spatialของพวกเขาที่ codeplex ดังนั้นหาก SqlServerTypes นั้นเป็นการพึ่งพาภายนอกมากเกินไปสำหรับคุณคุณอาจจะสามารถค้นหาซอร์สโค้ดที่ทำสิ่งนี้ได้


ขอบคุณฉันไม่อยากลากบิต MsSql ใด ๆ ลงในการนำไปใช้ของฉัน แต่แหล่งข้อมูลบางอย่างอาจน่าสนใจ
Petr Krebs

3

NTSสามารถ "พูด" WKT และมีผู้อ่านและนักเขียนทั้ง WKB และ WKT ดังนั้นถ้าคุณมี WKB, NTS สามารถอ่านและเขียนลงใน WKT ได้

อย่างไรก็ตามคุณยังสามารถสร้างวัตถุ NTS โดยใช้คุณลักษณะของเรขาคณิต ArcObjects แล้วส่งออกเป็น 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 ซึ่งเป็นการแสดงรูปทรงเรขาคณิตที่ปลอดภัย (มีประโยชน์สำหรับความปลอดภัยของด้ายและอื่น ๆ )
Petr Krebs


@Mapperz: ดูที่นั่นเช่นกัน แต่ใช้งานได้เฉพาะสำหรับการเป็นตัวแทน WKT ของระบบพิกัดและหน่วยงานไม่ใช่รูปทรงเรขาคณิต
Petr Krebs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.