Bagaimana menemukan poligon di mana titik terletak?


8

Saya memiliki lapisan dengan fitur poligon. Setiap fitur memiliki atribut dan nilai. Saya juga punya daftar koordinat dan saya ingin tahu fitur apa (atau poligon) yang ada di koordinat tersebut.

Bisakah seseorang membimbing saya tentang bagaimana cara melakukannya? Apakah ada fungsi dalam API yang dapat membantu saya mencapai tujuan saya atau haruskah saya menggunakan beberapa algoritma geometri komputasi untuk melakukannya sendiri? Saya tahu bagaimana melakukan yang terakhir tetapi akan menghemat waktu jika sudah ada fungsi bawaan.

Terima kasih.

Jawaban:


6

Beberapa fitur

Apa yang mungkin ingin Anda lakukan adalah:

  1. Buat daftar QgsPoint dari koordinat Anda
  2. Iterate atas semua fitur layer Anda (poligon)
  3. Simpulkan daftar poin (dalam iterasi)
  4. Panggil feature.geometry (). Berisi (titik) untuk memeriksa apakah Anda memiliki kecocokan

Tentu saja Anda sekarang dapat meningkatkan kinerja jika Anda misalnya tahu, bahwa suatu titik hanya dapat dikandung oleh satu poligon, Anda dapat menghapus titik dari daftar, setelah poligon yang sesuai telah ditemukan.

Banyak fitur (Menggunakan SpatialIndex)

Seperti yang ditunjukkan dalam komentar, indeks spasial dapat digunakan untuk mempercepat proses secara signifikan.

Langkah-langkahnya di sini adalah

  1. Buat daftar QgsPoint dari koordinat Anda
  2. Buat QgsSpatialIndex
  3. Iterate atas semua fitur layer Anda (poligon)
  4. Tambahkan fitur ke indeks Anda dengan insertFeature
  5. Ulangi semua poin Anda
  6. Hubungi index.intersect (QgsRectangle (point, point)) untuk memeriksa apakah Anda memiliki kecocokan

Ada juga contoh kode oleh NathanW


Ah, saya tidak tahu tentang feature.geometry.contains (point) call. Saya menggunakan mathplotlib. pastebin.com/61LSeMWv Tolong maafkan ketidakbenaran kode saya. Saya sedang terburu-buru dan akan membersihkannya nanti.
Shubham Goyal

Saya belum mengimplementasikan solusi Anda dan jadi tidak bisa mengatakan dengan pasti apakah itu berfungsi atau tidak. Tapi saya percaya seharusnya begitu dan saya menandainya sebagai jawaban yang benar :)
Shubham Goyal

2
Mungkinkah ini dipercepat menggunakan QgsSpatialIndex?
Snorfalorpagus

1
Saya akan sangat merekomendasikan menggunakan QgsSpatailIndex. Ada contoh di nathanw.net/2013/01/04/...
Nathan W

6

Pertama-tama Anda harus mengimpor daftar koordinat ke proyek Anda. Tutorial ini menjelaskan cara melakukannya: http://qgis.spatialthoughts.com/2012/01/importing-spreadsheets-or-csv-files-to.html

Saat Anda memiliki kedua layer (poligon dan titik) ke dalam proyek Anda, buka vektor> alat manajemen data> gabungkan atribut berdasarkan lokasi

masukkan deskripsi gambar di sini

Anda mendapatkan jendela tempat Anda dapat menentukan lapisan mana yang ingin Anda gabungkan:

masukkan deskripsi gambar di sini

  • Atur layer titik Anda dengan 'layer vektor target'.
  • Atur layer poligon Anda sebagai 'gabung layer vektor'.
  • Tentukan Output Shapefile Anda (akan ada yang baru dibuat. Jadi, jika Anda melewatkan, data asli disimpan).
  • Anda dapat memilih untuk menyimpan semua data di shapefile baru, bahkan jika tidak ada kecocokan dengan poligon: centang 'simpan semua catatan (termasuk catatan target yang tidak cocok)'

Klik 'OK'. Shapefile baru dibuat dan Anda akan ditanya 'Apakah Anda ingin menambahkan layer baru ke TOC?' Klik lagi OK.

Buka atribusi atur yang baru dari shapefile yang ditambahkan dan Anda akan melihat bahwa semua fitur dari poligon yang sesuai ditambahkan ke titik yang terdapat pada poligon itu.


2

Cara sederhana untuk melakukan ini menggunakan PyQGIS. Saya pikir Anda dapat membangun QgsRectangleobjek dengan satu titik dan menggunakannya dengan QgsFeatureRequestuntuk menyaring fitur dari lapisan yang memotongnya.

point = QgsPoint(10, 10)
# Construct a QgsRectange with the same point
rect = QgsRectangle(point, point)
req = QgsFeatureRequest()
req.setFilterRect(rect)
# You get the feature that intersects the point
f = layer.getFeatures(req).next()

0

Di QuantumGIS Anda bisa menambahkan daftar koordinat dengan fungsi 'tambah lapisan teks dibatasi' (jika itu adalah file csv). Tambahkan juga poligon. Kemudian Anda dapat melakukan 'memotong' atau 'titik dalam poligon'.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.