Apa yang saya coba lakukan: loop melalui shapefile titik dan pilih setiap titik yang jatuh ke dalam poligon.
Kode berikut ini terinspirasi oleh contoh kueri spasial yang saya temukan di sebuah buku:
mitte_path = r"D:\PythonTesting\SelectByLocation\mitte.shp"
punkte_path = r"D:\PythonTesting\SelectByLocation\punkte.shp"
polygon = QgsVectorLayer(mitte_path, 'Mitte', 'ogr')
points = QgsVectorLayer(punkte_path, 'Berlin Punkte', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(polygon)
QgsMapLayerRegistry.instance().addMapLayer(points)
polyFeatures = polygon.getFeatures()
pointsCount = 0
for poly_feat in polyFeatures:
polyGeom = poly_feat.geometry()
pointFeatures = points.getFeatures(QgsFeatureRequest().setFilterRect(polyGeom.boundingBox()))
for point_feat in pointFeatures:
points.select(point_feat.id())
pointsCount += 1
print 'Total:',pointsCount
Ini berfungsi, dan ia memang memilih dataset, tetapi masalahnya adalah ia memilih dengan kotak pembatas , karenanya jelas mengembalikan poin yang tidak saya minati:
Bagaimana saya bisa pergi hanya mengembalikan poin dalam poligon tanpa menggunakan qgis: selectbylocation ?
Saya telah mencoba menggunakan metode inside () dan intersect () , tetapi karena saya tidak membuatnya berfungsi, saya beralih ke kode di atas. Tapi mungkin mereka kuncinya.
sumber
Anda dapat menggunakan algoritme "Ray Casting" yang sedikit saya adaptasi untuk digunakan dengan PyQGIS:
Diterapkan pada situasi ini:
hasilnya, di Python Console, adalah:
Itu berhasil.
Catatan Pengeditan:
Kode dengan proposal gen yang lebih ringkas :
sumber
if geo_pol.contains(geo_point) == True:
karena ini tersirat dalamif geo_pol.contains(geo_point)
(selalu Benar)Dengan beberapa saran dari rekan kerja saya akhirnya berhasil menggunakan dalam ().
Logika umum
Ini kodenya:
Ini juga akan bekerja dengan intersect () bukan inside () . Saat menggunakan poin, tidak masalah yang mana yang akan Anda gunakan, karena keduanya akan menghasilkan hasil yang sama. Ketika memeriksa garis / poligon, bagaimanapun, itu dapat membuat perbedaan penting: di dalam () mengembalikan objek yang sepenuhnya di dalam, sedangkan memotong () mengembalikan objek yang sepenuhnya di dalam dan yang sebagian di dalam (yaitu yang bersinggungan dengan fitur, seperti namanya menunjukkan).
sumber