Lo que estoy tratando de hacer: bucle a través de un shapefile de puntos y seleccionar cada punto que cae en un polígono.
El siguiente código está inspirado en un ejemplo de consulta espacial que encontré en un libro:
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
Esto funciona y selecciona conjuntos de datos, pero el problema es que selecciona por cuadro delimitador , por lo tanto, obviamente, devuelve puntos que no me interesan:
¿Cómo podría hacer que solo devuelva puntos dentro del polígono sin usar qgis: selectbylocation ?
Intenté usar los métodos inside () e intersects () , pero como no conseguía que funcionaran, recurrí al código anterior. Pero tal vez son la clave después de todo.
fuente
Puede usar el algoritmo "Ray Casting" que he adaptado ligeramente para usar con PyQGIS:
Aplicado a esta situación:
El resultado, en la Consola Python, fue:
Funcionó.
Nota de edición:
Código con la propuesta más concisa del gen :
fuente
if geo_pol.contains(geo_point) == True:
porque está implícito enif geo_pol.contains(geo_point)
(siempre Verdadero)Con algunos consejos de un compañero de trabajo, finalmente lo puse a trabajar usando dentro de ().
Lógica general
Aquí está el código:
Esto también funcionaría con intersects () en lugar de dentro de () . Al usar puntos, no importa cuál use, ya que ambos devolverán el mismo resultado. Sin embargo, al verificar líneas / polígonos, puede hacer una diferencia importante: inside () devuelve objetos que están completamente dentro, mientras que intersects () vuelve a ejecutar objetos que están completamente dentro y que están parcialmente dentro (es decir, que se cruzan con la característica, como el nombre lo indica).
fuente