การคำนวณระยะทางทั้งหมดจากจุดเดียวไปยังรูปหลายเหลี่ยม [ปิด]


9

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

Point_ID | distance to polygon 1 | distance to polygon 2 | distance to polygon 3 | etc.

พอยน์เตอร์ใด ๆ ใน ArcGIS 10 หรือ QGIS 2.2+ จะมีประโยชน์มากที่สุด


สิ่งนี้สามารถทำได้ด้วยการวิเคราะห์อย่างใกล้ชิดใน ArcGIS แต่การทำในแต่ละจุดจะต้องใช้ระบบอัตโนมัติเล็กน้อย คุณคุ้นเคยกับการเขียนสคริปต์หลามหรือไม่
Emil Brundage

Emil - ไม่ฉันไม่คุ้นเคยกับ Python แต่บางทีฉันควรเรียนรู้
NickN

คำตอบ:


1

คุณสามารถใช้Distance Matrixใน QGIS เพื่อให้บรรลุเป้าหมายนี้ ก่อนอื่นคุณจะต้องแปลงรูปหลายเหลี่ยมของคุณเป็นคะแนนเซนทรอยด์โดยVector > Geometry Tools > Polygon Centroidsหรือผ่านรูปหลายเหลี่ยม Centroids รุ่น SAGA เหตุผลของเรื่องนี้คือฟังก์ชั่นDistance Matrixสามารถวิเคราะห์ได้ระหว่างเลเยอร์ 2 จุดเท่านั้น นอกจากนี้ผลลัพธ์จะเป็นดังนี้:

Point_1 | PolygonCentroid_1 | Distance
Point_1 | PolygonCentroid_2 | Distance
Point_1 | PolygonCentroid_3 | Distance
Point_2 | PolygonCentroid_1 | Distance
Point_2 | PolygonCentroid_2 | Distance

ผลลัพธ์จะเป็นไฟล์. csv เพื่อให้คุณสามารถแก้ไขเลย์เอาต์ด้วยตนเองโดยใช้ซอฟต์แวร์อื่นเช่น Microsoft Excel


ขอบคุณโจเซฟ - สำหรับผู้ที่เพิ่งมาใหม่กับ GIS เช่นฉันนี่เป็นวิธีที่ง่ายที่สุดในการรับคำตอบที่ฉันต้องการ
NickN

ยินดีต้อนรับเพื่อนมากที่สุด! ขั้นตอนนี้ (และผลลัพธ์) เป็นพื้นฐาน แต่เมื่อคุณคุ้นเคยกับซอฟต์แวร์ GIS มากขึ้นคุณสามารถลองใช้ขั้นตอนเพิ่มเติมขั้นสูงซึ่งอธิบายไว้ในคำตอบอื่น ๆ
โจเซฟ

1
@nickN เพียงเล็กน้อยที่ทราบวิธีการนี้ centroids ไม่เคยตกอยู่ในรูปหลายเหลี่ยมขึ้นอยู่กับรูปร่างของมัน อาจเป็นไปได้ที่คุณจะได้รับระยะทาง / การจัดอันดับที่ไม่ถูกต้อง แต่ขึ้นอยู่กับข้อมูลและข้อกำหนดของคุณว่าจะเป็นปัญหาหรือไม่ ไม่อย่างนั้นจะเป็นรุ่น QGIS ของ GNT ของ ArcGIS ยกเว้นอันหลังสามารถจัดการได้มากกว่าจุดและฉันไม่แน่ใจว่า QGIS จัดการชื่อ / ID ในผลลัพธ์อย่างไร
Chris W

5

นี่ค่อนข้างง่ายในการใช้ QGIS (ฉันคิดว่าจะใช้เวอร์ชั่นใด) และคำสั่ง SQL ที่ง่ายมากในตัวจัดการฐานข้อมูล แต่สำหรับสิ่งที่คุณต้องอยู่ในฐานข้อมูลเชิงพื้นที่ (Postgis หรือ spatialite) เนื่องจากคนส่วนใหญ่เข้าถึงได้มากขึ้นฉันจะถือว่าใช้ spatialite แต่คำสั่ง SQL จะเหมือนกันสำหรับ Postgis

  1. สร้างฐานข้อมูล Spatialite ใหม่
  2. นำเข้าเลเยอร์จุดและรูปหลายเหลี่ยมของคุณไปยังฐานข้อมูลใหม่
  3. เปิดตัวจัดการฐานข้อมูล DB เลือกฐานข้อมูลและเรียกใช้หนึ่งในคำสั่ง SQL ต่อไปนี้:

ระยะทางจากจุดทั้งหมดไปยังขอบเขตรูปหลายเหลี่ยมทั้งหมด

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f, 
  polygons_table AS g

ระยะทางถึงจุดทั้งหมดไปยังขอบเขตรูปหลายเหลี่ยมที่เกี่ยวข้อง (สมมติว่ามีสนามทั่วไปอยู่)

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

ระยะทางไปยังทุกจุดสู่ศูนย์กลางรูปหลายเหลี่ยมที่เกี่ยวข้อง :

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

โปรดสังเกตว่าคุณสามารถเพิ่มฟิลด์ใด ๆ จากเลเยอร์ของคุณไปยังผลลัพธ์:

SELECT 
  f.point_id,
  f.point_number,
  g.polygon_id,
  g.parcel_name,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

หรือทุกสาขา:

SELECT 
  f.*,
  g.*,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างฐานข้อมูลเชิงพื้นที่และนำเข้าเลเยอร์โปรดแจ้งให้เราทราบและฉันจะแก้ไขคำตอบ
Alexandre Neto

สวัสดี Alexandre ทำไมเข้าร่วมและไม่ง่าย ๆ ที่ไหน?
Luigi Pirelli

มันเป็นสิ่งที่ฉันได้จากการนำเสนอของ Paul Ramsey จำไม่ได้ว่าทำไมเขาถึงสนับสนุนการเข้าร่วมอย่างชัดเจน แต่ถ้าเขาบอกว่า ... : -PI จะพยายามอธิบายคำอธิบายทั้งสองเพื่อดูว่ามีความแตกต่างหรือไม่
Alexandre Neto

ฉันใหม่สำหรับ SpatialLite - คำตอบนี้ดูเหมือนจะแก้ปัญหาที่ฉันกำลังทำอยู่ ตารางของฉันว่างเปล่า บางทีฉันไม่เข้าใจสิ่งนี้ ฉันมีเลเยอร์หลายเหลี่ยมที่เรียกว่า "Pothole VRI" และอีกจุดหนึ่งเรียกว่า "Grid Pothole Center" ฉันเพิ่มรหัสต่อไปนี้โดยใช้คำแนะนำของคุณตามด้านบน: เลือก f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) ตามระยะทางจาก 'ศูนย์ Pothole กริด' AS f, 'Pothole VRI' AS g __ ฉันได้รับตารางว่าง x กับหัวเรื่องเหล่านี้: id, id: 1, ระยะทางฉันทำอะไรผิดที่นี่ ใช้ QGIS 3.6
Mark Thompson

4

สร้างใกล้โต๊ะเครื่องมือใน ArcGIS จะทำในสิ่งที่คุณต้องการ แต่จะต้องมีใบอนุญาตขั้นสูงและจะทำเพื่อทุกจุด / รูปหลายเหลี่ยม - ไม่เพียง แต่ผู้ที่เกี่ยวข้องกับแต่ละอื่น ๆ ซึ่งหมายความว่าสำหรับวัตถุ 95 รายการของคุณคุณจะได้รับระยะทางที่จัดอันดับสำหรับคุณสมบัติทั้งหมด 211 รายการดังนั้นแถว 20,045 ในตาราง คุณอาจต้องกรองตารางผลลัพธ์หรือตามที่ Emil แนะนำให้ทำงานอัตโนมัติเพื่อสร้างตัวเลือกตามการเชื่อมโยงและรันเฉพาะในกลุ่มเหล่านั้น

สำหรับการกรองใช่แล้วการเข้าร่วม (ตามด้วยการสืบค้นคำจำกัดความหรือการเลือก) เป็นสิ่งที่คุณต้องการ ผลลัพธ์ของเครื่องมือให้คุณ IN_FID และ NEAR_FID ขึ้นอยู่กับวิธีที่คุณเรียกใช้เครื่องมือ (คุณสมบัติใกล้กับจุดหรือคุณสมบัติใกล้จุด) กำหนดว่า FID ใดอยู่ จากนั้นคุณจะเข้าร่วมจุดและตารางคุณสมบัติของคุณ (ทั้งคู่) กับผลลัพธ์ของเครื่องมือตาม FID ที่เหมาะสม

สิ่งนี้จะถือว่าระเบียนคุณสมบัติ 211 รายการของคุณแต่ละรายการมีแอตทริบิวต์ที่ระบุว่าเป็นจุดใดใน 95 จุดเนื่องจากขั้นตอนต่อไปคือการเลือก (หรือแบบสอบถามคำจำกัดความ) ระเบียนทั้งหมดในตารางที่เข้าร่วมโดยที่สองเขตข้อมูลของระเบียนหนึ่งควร จับคู่ - ฟิลด์ชื่อจุด = คุณสมบัติฟิลด์ชื่อจุดเชื่อมโยง กรณีที่พวกเขาไม่ตรงกันคือรูปหลายเหลี่ยมที่ไม่เกี่ยวข้องกับจุดนั้นดังนั้นคุณไม่สนใจระยะทางจากจุดนั้น

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