เป็นไปได้อย่างแน่นอนกับ rasters
ภาพหน้าจอนี้หวังว่าจะแสดงปัญหาได้ชัดเจนยิ่งขึ้น ส่วน B ของโวโรนอยนั้นอยู่ใกล้กับ 'เหมือนนกกาบิน' ไปยังศูนย์โวโรโนอิดั้งเดิม, แต่สิ่งนี้ไม่ได้คำนึงถึงความจริงที่ว่ามันต้องใช้เวลานานกว่าจะเดินไปรอบ ๆ อาคาร. ความเข้าใจในคำถามของ OP คือ voronoi ต้องพิจารณาระยะทางพิเศษนี้เพื่อเดินไปรอบ ๆ อาคาร
ฉันชอบคำแนะนำจาก @Guillaume อย่างไรก็ตามเมื่อฉันลองมันฉันมีปัญหาในการr.grow.distance
ให้เกียรติหน้ากาก (ดูด้านล่างระลอกไม่ควรผ่านอาคาร)
ความรู้หญ้าของฉันไม่แข็งแรงเท่าที่ควรดังนั้นฉันอาจจะทำอะไรที่โง่ แน่นอนตรวจสอบคำแนะนำนั้นก่อนเพราะมันจะทำงานน้อยกว่าของฉัน ;-)
ขั้นตอนที่ 1 - สร้างพื้นผิวต้นทุน
ขั้นตอนแรกคือการสร้างพื้นผิวต้นทุน สิ่งนี้จะต้องทำเพียงครั้งเดียว
- สร้างเลเยอร์ที่สามารถแก้ไขได้หลุมและทั้งหมด
- เพิ่มเขตข้อมูลที่เรียกว่า 'หน่วย' ตั้งเป็น 1
- ใช้รูปหลายเหลี่ยมต่อแรสเตอร์บนเลเยอร์เวกเตอร์ "punched out" ของคุณ (อันที่มีรู) โดยใช้ฟิลด์ 'หน่วย' ขณะนี้คุณมีเลเยอร์ "หน้ากาก" โดยที่ 1 คือพื้นที่ว่างและ 0 กำลังสร้าง
ใช้เครื่องคิดเลขแรสเตอร์เพื่อเปลี่ยนสิ่งนี้ให้เป็นพื้นผิวต้นทุน ฉันจะตั้ง 'กลางแจ้ง' เป็น 1 และ 'ในบ้าน' ถึง 9999 ซึ่งจะทำให้การเคลื่อนย้ายผ่านอาคารเป็นเรื่องยาก
(( "หน้ากาก @ 1" = 1) * 1) + (( "หน้ากาก @ 1" = 0) * 9999)
คุณสามารถได้ผลลัพธ์ 'อินทรีย์' มากขึ้นโดยการเพิ่มเสียงเล็กน้อยลงบนพื้นผิวของค่าใช้จ่าย (เช่นใช้หมายเลขสุ่มจาก 1 ถึง 3 แทนที่จะเป็น 1 สำหรับ pxiels กลางแจ้ง)
ขั้นตอนที่ 2 สร้าง raster ต้นทุนสะสมสำหรับแต่ละศูนย์ voronoi
ตอนนี้เราสามารถเรียกใช้ (สำหรับ voronoi ครั้งละหนึ่งเซลล์) อัลกอริทึม GRASS r.cost.coordinates
เทียบกับชั้นผิวต้นทุนของเรา
สำหรับพิกัดเริ่มใช้ศูนย์ vornoi สำหรับพิกัดสุดท้ายให้เลือกมุมใดมุมหนึ่งของพื้นที่ของคุณ ฉันแนะนำให้ใช้ 'ทัวร์อัศวิน' เพราะนี่จะให้ผลลัพธ์ที่ราบรื่นขึ้น
ผลลัพธ์แสดงให้เห็นเส้นเวลาการเดินทางที่เท่ากันจากศูนย์โวโรโนอิหนึ่งศูนย์ สังเกตว่ามีวงพันรอบอาคารอย่างไร
ไม่แน่ใจว่าจะทำให้สิ่งนี้ดีที่สุดอย่างไร อาจกำลังประมวลผลโหมดแบตช์หรือดำเนินการใน pyqgis
ขั้นตอนที่ 3. รวม rasters
นี่อาจจะต้องใช้รหัส ขั้นตอนวิธีจะเป็น
create a raster 'A' to match the size of your cumulative cost images
fill raster 'A' with a suitably high number e.g. 9999
create an array of the same size as the raster.
for each cumulative cost raster number 1..N
for each cell in image
if cell < value in raster 'A'
set value in raster 'A' to cell value
set corresponding cell in array to cum. cost image number
write out array as a raster
วิธีการนั้นควรให้แรสเตอร์ที่แต่ละเซลล์ถูกจัดหมวดหมู่ตามศูนย์โวโรนอยซึ่งใกล้เคียงที่สุดโดยคำนึงถึงอุปสรรค
จากนั้นคุณสามารถใช้แรสเตอร์ต่อรูปหลายเหลี่ยม จากนั้นคุณสามารถใช้ปลั๊กอินGeneralizeเพื่อลบเอฟเฟกต์ "ขั้นตอน" ออกจากแรสเตอร์
ขอโทษสำหรับความคลุมเครือในขั้นตอนที่ 2 และ 3 ... ฉันหวังว่าบางคนจะตีระฆังด้วยวิธีที่หรูหรากว่า :)