Tính toán tất cả các khoảng cách từ các điểm đơn lẻ đến nhiều đa giác [đã đóng]


9

Tôi có hai lớp: một lớp điểm xác định các thuộc tính (95 đối tượng) và một lớp đa giác xác định các ô đất liên kết với các thuộc tính (211 đối tượng). Mỗi điểm liên quan đến một hoặc nhiều đa giác. Những gì tôi muốn tạo ra là một bảng khoảng cách của mỗi điểm đến TẤT CẢ các đa giác liên quan đến điểm đó (cạnh gần nhất hoặc tâm của đa giác - hoặc sẽ làm được). Tính toán khoảng cách gần nhất là tương đối dễ dàng trong QGIS và ArcGIS, nhưng những tính toán đó bỏ qua tất cả các đa giác ở xa, ít nhất là bằng các phương pháp tôi đã sử dụng. Lý tưởng nhất là tôi muốn một đầu ra của

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

Bất kỳ con trỏ nào trong ArcGIS 10 hoặc QGIS 2.2+ sẽ hữu ích nhất.


Điều này có thể được thực hiện với phân tích gần trong ArcGIS, nhưng để làm điều đó cho từng điểm sẽ cần một chút tự động hóa. Bạn có quen thuộc với kịch bản python?
Emil Brundage

Emil - Không, tôi không quen với Python, nhưng có lẽ tôi nên học.
NickN

Câu trả lời:


1

Bạn có thể sử dụng Ma trận khoảng cách trong QGIS để đạt được điều này. Trước tiên, bạn cần chuyển đổi đa giác của mình thành các điểm trung tâm bằng Vector > Công cụ hình học > Nhân đa giác hoặc thông qua phiên bản SAGA của đa giác đa giác. Lý do cho điều này là hàm Matrix Matrix chỉ có thể phân tích giữa 2 lớp điểm. Ngoài ra, đầu ra sẽ như thế này:

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

Đầu ra sẽ là tệp .csv để bạn có thể chỉnh sửa bố cục theo cách thủ công bằng phần mềm khác như Microsoft Excel.


Cảm ơn Joseph - Đối với một người mới đến với GIS như tôi, đây là cách đơn giản nhất để có được câu trả lời tôi muốn.
NickN

Chào mừng bạn đời! Quy trình này (và kết quả) là cơ bản nhưng khi bạn trở nên quen thuộc hơn với phần mềm GIS, bạn có thể thử sử dụng các quy trình nâng cao hơn được mô tả trong các câu trả lời khác.
Joseph

1
@nickN Chỉ cần một lưu ý rất nhỏ cho phương pháp này, centroid không phải luôn nằm trong một đa giác tùy thuộc vào hình dạng của nó. Có thể bạn có thể nhận được một số khoảng cách / thứ hạng không chính xác, nhưng nó phụ thuộc vào dữ liệu và yêu cầu của bạn về việc nó có phải là một vấn đề hay không. Mặt khác, đây thực chất là phiên bản QGIS của GNT của ArcGIS, ngoại trừ phiên bản sau có thể xử lý nhiều hơn điểm và tôi không chắc chắn làm thế nào QGIS xử lý tên / ID trong kết quả.
Chris W

5

Điều này khá đơn giản để đạt được bằng cách sử dụng QGIS (tôi nghĩ rằng bất kỳ phiên bản nào cũng được) và một câu lệnh SQL rất đơn giản trong trình quản lý DB. Nhưng đó là của bạn phải trong một số loại cơ sở dữ liệu không gian (Postgis hoặc spatialite). Vì hầu hết mọi người đều dễ tiếp cận hơn, tôi sẽ giả sử sử dụng spatialite, nhưng các câu lệnh SQL giống với Postgis.

  1. Tạo một cơ sở dữ liệu Spatialite mới;
  2. Nhập các lớp điểm và đa giác của bạn vào cơ sở dữ liệu mới;
  3. Mở plugin trình quản lý DB, chọn cơ sở dữ liệu và chạy một trong các câu lệnh SQL sau:

Khoảng cách từ tất cả các điểm đến tất cả các ranh giới đa giác

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

Khoảng cách đến tất cả các điểm đến ranh giới đa giác liên quan (giả sử rằng có một trường chung tồn tại)

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)

Khoảng cách đến tất cả các điểm đến các đa giác có liên quan :

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)

Lưu ý rằng bạn có thể thêm bất kỳ trường nào từ các lớp của bạn vào kết quả:

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)

Hoặc thậm chí tất cả các lĩnh vực:

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)

Nếu bạn cần thêm thông tin về cách tạo cơ sở dữ liệu không gian và nhập lớp, hãy cho tôi biết và tôi sẽ chỉnh sửa câu trả lời.
Alexandre Neto

Xin chào Alexandre, tại sao tham gia và không đơn giản Ở ĐÂU?
Luigi Pirelli

Chà, đó là thứ tôi bắt được từ một trong những bài thuyết trình của Paul Ramsey. Không thể nhớ lý do tại sao anh ta ủng hộ việc sử dụng Tham gia rõ ràng, nhưng nếu anh ta nói điều đó ...: -PI sẽ cố gắng chạy GIẢI THÍCH qua cả hai truy vấn để xem có sự khác biệt nào không.
Alexandre Neto

Tôi mới biết đến SpatialLite - câu trả lời này dường như giải quyết một vấn đề tôi đang làm việc. Bàn của tôi trống. Có lẽ tôi không hiểu điều này. Tôi có một lớp đa giác gọi là "Pothole VRI" và một lớp điểm khác gọi là "Grid Pothole Center". Tôi thêm đoạn mã sau bằng cách sử dụng các hướng dẫn của bạn như trên: CHỌN f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) __ Tôi nhận được một bảng trống x với các tiêu đề sau: id, id: 1, distance Tôi đã làm gì sai ở đây? Sử dụng QGIS 3.6
Mark Thompson

4

Công cụ Generate near Table trong ArcGIS sẽ làm những gì bạn muốn, nhưng nó yêu cầu giấy phép Nâng cao và sẽ làm điều đó cho tất cả các điểm / đa giác - không chỉ những điểm được liên kết với nhau. Điều này có nghĩa là với mỗi 95 đối tượng của bạn, bạn sẽ có được khoảng cách được xếp hạng cho tất cả 211 thuộc tính, do đó, 20.045 hàng trong bảng. Bạn sẽ phải lọc bảng kết quả hoặc như Emil đề nghị tự động hóa tác vụ để tạo các lựa chọn dựa trên liên kết và chỉ chạy nó trên các nhóm đó.

Theo như lọc, có, một tham gia (theo sau là một truy vấn định nghĩa hoặc lựa chọn) là tất cả những gì bạn cần. Kết quả công cụ cung cấp cho bạn IN_FID và NEAR_FID. Tùy thuộc vào cách bạn chạy công cụ (thuộc tính gần điểm hoặc điểm gần thuộc tính) xác định FID nào. Sau đó, bạn sẽ tham gia các bảng điểm và thuộc tính của mình (cả hai) vào kết quả công cụ dựa trên FID thích hợp.

Điều này giả sử mỗi bản ghi thuộc tính 211 của bạn có một thuộc tính cho biết chúng thuộc về 95 điểm nào, bởi vì bước tiếp theo là chọn (hoặc truy vấn định nghĩa) tất cả các bản ghi trong (các) bảng đã tham gia trong đó hai trường của một bản ghi khớp - trường tên điểm = thuộc tính trường tên điểm liên quan. Các trường hợp chúng không khớp là đa giác không liên quan đến điểm đó, vì vậy bạn không quan tâm đến khoảng cách của chúng từ thời điểm đó.

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.