สร้างแผนภาพ voronoi จากส่วนของเส้น


14

ฉันกำลังมองหาวิธีในการสร้างแผนภาพ voronoi ตามส่วนของเส้นแทนที่จะเป็นจุด ดูตัวอย่างด้านล่าง (นำมาจากการนำเสนอนี้ )

เป็นการดีที่ฉันต้องการบางสิ่งบางอย่างที่ฉันสามารถเขียนสคริปต์จาก Python แต่โซลูชันที่ใช้ ArcGIS หรือที่คล้ายคลึงกันก็เป็นที่ยอมรับได้เช่นกัน

แผนภาพ voronoi จากส่วนของเส้น

ห้องสมุดแห่งเดียวที่ทำสิ่งนี้ที่ฉันได้ค้นพบในตอนนี้คือopenvoronoiซึ่งดูมีแนวโน้ม มีคนอื่นบ้างไหม?


1
สิ่งนี้อาจช่วยได้: gis.stackexchange.com/questions/53414/…
Dan C

ขอบคุณ ไม่แน่ใจว่าทำไมคำถามนั้นไม่เกิดขึ้นในการค้นหาของฉัน
Snorfalorpagus

คำตอบ:


5

เรา (ทีมมหาวิทยาลัย) ได้ออกแบบการใช้งานสำหรับสิ่งนี้โดยใช้แอดจิน ArcGIS 10.0 และ ArcObjects แอปพลิเคชั่นนั้นฟรีอย่างสมบูรณ์ การนำไปใช้ใช้วิธีการแรสเตอร์ที่ใช้เป็นจุดอินพุท, เส้นหรือรูปหลายเหลี่ยมเพื่อสร้างไดอะแกรม Voronoi ที่มีน้ำหนักแบบธรรมดาหรือแบบหลายขั้นตอน (หรือการรวมกันของด้านบนนั่นคือคุณสามารถใช้รูปร่างแต่ละประเภท สามคุณสมบัติที่แตกต่างกัน) มันยังอยู่ในการพัฒนา แต่ควรมีความเสถียรพอสมควรโดยเฉพาะอย่างยิ่งถ้าคุณต้องการทำสาย Addin ต้องการใบอนุญาตนักวิเคราะห์เชิงพื้นที่เพื่อดำเนินการ รหัสตัวเองเป็นโอเพนซอร์สดังนั้นอย่าลังเลที่จะทำตามที่คุณต้องการ

https://github.com/UNTGeography/VoronoiDiagramsGIS

มันใช้วิธีการที่คล้ายกันกับ "การจัดสรรแบบยุคลิด" ที่อธิบายไว้ในคำตอบของ @ radouxju และใช้ Flow Direction / Basin raster เพื่อสร้างเวกเตอร์รูปหลายเหลี่ยมจากแรสเตอร์ผลลัพธ์


ส่วนสำคัญสำหรับผู้ที่สนใจ: github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/…
Sancarn

3

Voronoïได้รับการออกแบบเบื้องต้นสำหรับคะแนน นี่คือสองวิธีที่ฉันสามารถจินตนาการถึงปัญหาของคุณ (อ้างถึงเครื่องมือ ArcGIS แต่อาจเป็นไปได้ด้วยหุ่นดี):

1)

a) สร้างคะแนนตามเส้น (เช่นเพิ่ม densify แล้วนำเสนอจุดยอดตามเส้น)

b) สร้างรูปหลายเหลี่ยม Thiessen

c) ละลายรูปหลายเหลี่ยม Thiessen ตามเส้นที่พวกเขาตัดกัน

2)

a) นักวิเคราะห์เชิงพื้นที่คำนวณการปันส่วน Euclidian ไปยังบรรทัด

b) แปลงแต่ละโซนเป็นรูปหลายเหลี่ยม


3

สำหรับลูกค้าบางคนมีเพื่อนร่วมงานสองคนและฉันกำลังทำงานในการสร้างเครื่องมือการประมวลผลทางภูมิศาสตร์ 2 รายการที่ทำเช่นนั้น แม้ว่าเครื่องมือการประมวลผลทางภูมิศาสตร์จะไม่เปิดเผยต่อสาธารณชน แต่ไพ ธ อนและ C # ที่เราใช้มีดังนี้:

ทั้ง C # และ python wrapper นั้นพึ่งพา C ++ Boost Voronoi API: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

โปรดทราบว่า API ใช้หน่วยความจำจำนวนมาก นี่ไม่ใช่ปัญหาหากคุณใช้การประมวลผลทางภูมิศาสตร์สำหรับ 64 บิต, ArcGIS Pro หรือ QGIS นี่เป็นข้อ จำกัด หากคุณใช้งาน ArcGIS Desktop เนื่องจากเป็น 32 บิต (เครือข่ายถนนที่มีรายละเอียด 40,000 แถวขึ้นไปน่าจะเพียงพอที่จะถึงขีด จำกัด หน่วยความจำ)


1
ฉันได้สร้างเครื่องมือการประมวลผลทางภูมิศาสตร์สำหรับ ArcMap และ ArcGIS Pro ซึ่งอาศัยไลบรารี pyvoronoi: github.com/fabanc/Boost-Voronoi-For-ArcGIS
Fabien Ancelin

2

ET Geowizards (ปลั๊กอินสำหรับอาร์ค) มีเครื่องมือสำหรับการนี้ที่ยอมรับ Polylines (ดูภาพหน้าจอด้านล่าง) น่าเสียดายที่คุณจะต้องมีผลิตภัณฑ์ที่มีลิขสิทธิ์เพื่อใช้งานเครื่องมือ แต่ฉันคิดว่ามันควรจะทำเคล็ดลับ

ป้อนคำอธิบายรูปภาพที่นี่


0

บวกอีกหนึ่งวิธีในการแก้ปัญหางานของคุณโดยใช้ PostgreSQL / PostGIS

หากบรรทัดสั้นและเรียบง่ายให้รันสคริปต์:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (SELECT (ST_DumpPoints(geom)).geom geom FROM tbla
        UNION
        SELECT ST_Centroid(geom) geom FROM tbla),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

เห็นผล

หากบรรทัดยาวให้รันสคริปต์:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (WITH btbl AS (SELECT (ST_Dump(geom)).geom geom FROM tbla),
intervals AS (SELECT generate_series (0, 9) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM btbl, intervals GROUP BY intervals.steps, geom),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

เห็นผล

หากจำเป็นให้กระชับจำนวนคะแนนในบรรทัดในตัวอย่างของฉันนี่คือ 10 คะแนน

โซลูชั่นดั้งเดิม

สคริปต์นี้มีชื่อว่า: ST_VoronoiDiagramsFromLines


ฉันยังไม่ได้เปิดใช้งาน แต่ดูเหมือนว่ามันจะสร้างรูปหลายเหลี่ยม voroni โดยใช้จุดยอดของรูปทรงเรขาคณิตจากนั้นผสานเข้าด้วยกัน (ถ้าเป็นแบบรวมกัน) หากพวกเขาสัมผัสรูปทรงเรขาคณิตดั้งเดิม ถูกต้องหรือไม่ ถ้าเป็นเช่นนั้นมันเป็นการประมาณที่โอเคตราบใดที่รูปเรขาคณิตดั้งเดิมของคุณมีจุดยอดมากมายและไม่มีเซ็กเมนต์ที่ไม่มีความยาว
Snorfalorpagus

ทดสอบโดย: PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Cyril Mikhalchenko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.