Menghitung semua jarak dari titik tunggal ke beberapa poligon [ditutup]

9

Saya memiliki dua lapisan: lapisan titik yang mendefinisikan properti (95 objek), dan lapisan poligon yang mendefinisikan bidang tanah yang terkait dengan sifat-sifat tersebut (211 objek). Setiap titik berhubungan dengan satu atau lebih poligon. Apa yang ingin saya hasilkan adalah tabel jarak setiap titik ke SEMUA poligon yang terkait dengan titik itu (tepi terdekat atau centroid dari poligon - yang akan dilakukan). Menghitung jarak terdekat relatif mudah di QGIS dan ArcGIS, tetapi perhitungan itu menghilangkan semua poligon yang jauh, setidaknya dengan metode yang saya pakai. Idealnya saya ingin keluaran

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

Pointer apa pun di ArcGIS 10 atau QGIS 2.2+ akan sangat membantu.

NickN
sumber
Ini dapat dilakukan dengan analisis dekat di ArcGIS, tetapi untuk melakukannya untuk setiap titik akan memerlukan sedikit otomatisasi. Apakah Anda terbiasa dengan skrip python?
Emil Brundage
Emil - Tidak, saya tidak terbiasa dengan Python, tapi mungkin saya harus belajar.
NickN

Jawaban:

1

Anda dapat menggunakan Distance Matrix di QGIS untuk mencapai ini. Pertama-tama Anda perlu mengubah poligon Anda menjadi titik sentroid dengan Vector > Geometry Tools > Polygon centroids atau melalui versi SAGA dari poligon centroid. Alasan untuk ini adalah fungsi Distance Matrix hanya dapat menganalisis antara 2 titik layer. Juga, hasilnya akan seperti ini:

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

Outputnya akan berupa file .csv sehingga Anda dapat mengedit tata letak secara manual menggunakan perangkat lunak lain seperti Microsoft Excel.

Yusuf
sumber
Terima kasih Joseph - Untuk pendatang baru di GIS seperti saya, ini adalah cara paling sederhana untuk mendapatkan jawaban yang saya inginkan.
NickN
Teman yang paling selamat datang! Prosedur ini (dan hasilnya) adalah dasar tetapi ketika Anda menjadi lebih akrab dengan perangkat lunak GIS, Anda dapat mencoba menggunakan prosedur yang lebih maju yang dijelaskan dalam jawaban lain.
Joseph
1
@nickN Hanya catatan kecil untuk metode ini, centroid tidak selalu termasuk dalam poligon tergantung pada bentuknya. Ini mungkin Anda bisa mendapatkan beberapa jarak yang tidak benar / peringkat, tapi itu tergantung pada data Anda dan persyaratan apakah itu akan menjadi masalah. Kalau tidak, ini pada dasarnya adalah versi QGIS dari ArcGIS's GNT, kecuali yang terakhir dapat menangani lebih dari poin dan saya tidak yakin bagaimana QGIS menangani nama / ID dalam hasilnya.
Chris W
5

Ini cukup sederhana untuk dicapai menggunakan QGIS (saya pikir versi apa pun akan melakukannya) dan pernyataan SQL yang sangat sederhana di DB manager. Tetapi untuk itu Anda harus menggunakan semacam basis data spasial (Postgis atau spatialite). Karena lebih mudah diakses oleh kebanyakan orang, saya akan menganggap menggunakan spatialite, tetapi pernyataan SQL adalah sama untuk Postgis.

  1. Buat database Spatialite baru;
  2. Impor layer titik dan poligon Anda ke dalam basis data baru;
  3. Buka plugin DB manager, pilih database dan jalankan salah satu pernyataan SQL berikut:

Jarak dari semua titik ke semua batas poligon

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

Jarak ke semua titik ke batas poligon terkait (dengan asumsi bahwa bidang umum ada)

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)

Jarak ke semua titik ke centroid poligon terkait :

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)

Perhatikan bahwa Anda dapat menambahkan bidang apa saja dari lapisan Anda ke hasilnya:

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)

Atau bahkan semua bidang:

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
sumber
Jika Anda membutuhkan lebih banyak input tentang cara membuat basis data spasial dan mengimpor layer, beri tahu saya dan saya akan mengedit jawabannya.
Alexandre Neto
Hai Alexandre, mengapa bergabung dan tidak sederhana DI MANA?
Luigi Pirelli
Ya, itu sesuatu yang saya tangkap dari salah satu presentasi Paul Ramsey. Tidak dapat mengingat alasan mengapa ia menganjurkan penggunaan Join secara eksplisit, tetapi jika ia mengatakannya ...: -PI akan mencoba menjalankan EXPLAIN di kedua kueri untuk melihat apakah ada perbedaan.
Alexandre Neto
Saya baru mengenal SpatialLite - jawaban ini sepertinya mengatasi masalah yang sedang saya kerjakan. Meja saya kosong. Mungkin saya tidak mengerti ini. Saya memiliki lapisan poligon yang disebut "Pothole VRI" dan lapisan titik lain yang disebut "Grid Pothole Center". Saya menambahkan kode berikut menggunakan instruksi Anda seperti di atas: SELECT f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) SEBAGAI jarak DARI 'Grid Pothole Center' AS f, 'Pothole VRI' AS g __ Saya mendapatkan tabel kosong x dengan judul ini: id, id: 1, distance Apa yang saya lakukan salah di sini? Menggunakan QGIS 3.6
Mark Thompson
4

Alat Hasilkan Dekat Tabel di ArcGIS akan melakukan apa yang Anda inginkan, tetapi memerlukan lisensi Tingkat Lanjut dan akan melakukannya untuk semua poin / poligon - bukan hanya yang terkait satu sama lain. Ini berarti untuk masing-masing dari 95 objek Anda, Anda akan mendapatkan jarak peringkat untuk semua 211 properti, jadi 20.045 baris dalam tabel. Anda harus memfilter tabel yang dihasilkan atau seperti yang disarankan Emil mengotomatiskan tugas untuk membuat pilihan berdasarkan asosiasi dan hanya menjalankannya di grup tersebut.

Sejauh pemfilteran, ya, gabungan (diikuti oleh kueri definisi atau seleksi) adalah yang Anda butuhkan. Hasil alat memberi Anda IN_FID dan NEAR_FID. Bergantung pada bagaimana Anda menjalankan alat (properti di dekat titik, atau titik di dekat properti) menentukan FID mana. Anda kemudian akan bergabung dengan tabel titik dan properti Anda (keduanya) ke hasil alat berdasarkan FID yang sesuai.

Ini mengasumsikan masing-masing 211 catatan properti Anda memiliki atribut yang mengatakan yang mana dari 95 poin yang dimiliki, karena langkah selanjutnya adalah memilih (atau permintaan definisi) semua catatan dalam tabel yang digabungkan di mana dua bidang dari satu catatan harus match-point name field = bidang nama poin terkait properti. Kasus di mana mereka tidak cocok adalah poligon yang tidak terkait dengan titik itu, jadi Anda tidak peduli jarak mereka dari titik itu.

Chris W
sumber