O que estou tentando fazer: laço através de um shapefile ponto e selecione cada ponto que cai em um polígono.
O código a seguir é inspirado em um exemplo de consulta espacial que encontrei em um livro:
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
Isso funciona e seleciona conjuntos de dados, mas o problema é que ele seleciona por caixa delimitadora , portanto, obviamente, retornando pontos nos quais não estou interessado:
Como eu poderia retornar apenas pontos dentro do polígono sem usar qgis: selectbylocation ?
Eu tentei usar os métodos inside () e intersects () , mas como não estava conseguindo que eles funcionassem, recorri ao código acima. Mas talvez eles sejam a chave, afinal.
fonte
Você pode usar o algoritmo "Ray Casting" que adaptei levemente para usar com o PyQGIS:
Aplicado a esta situação:
o resultado, no Python Console, foi:
Funcionou.
Nota de edição:
Código com a proposta mais concisa de gene :
fonte
if geo_pol.contains(geo_point) == True:
porque está implícito naif geo_pol.contains(geo_point)
(sempre True)Com alguns conselhos de um colega de trabalho, finalmente consegui usá-lo usando within ().
Lógica geral
Aqui está o código:
Isso também funcionaria com interseções () em vez de dentro de () . Ao usar pontos, não importa qual deles você usaria, pois ambos retornarão o mesmo resultado. Ao verificar linhas / polígonos, no entanto, isso pode fazer uma diferença importante: inside () retorna objetos que estão inteiramente dentro, enquanto intersects () retoca objetos que estão inteiramente dentro e que estão parcialmente dentro (ou seja, que se cruzam com o recurso, como o nome indica).
fonte