Tengo una capa de puntos (que representa las ciudades), y un conjunto de capas vectoriales cuyas características son cientos de discos concéntricos, cada uno de los cuales me gustaría utilizar como capa de recorte para seleccionar sólo las ciudades que se encuentran dentro de ese disco, realizar algunas operaciones en esas ciudades, y luego pasar al siguiente disco.
Aquí hay algunas capturas de pantalla del proyecto. Los discos concéntricos de color azul-gris son los polígonos de recorte: topes de 25/50/100/150 millas alrededor de las ubicaciones de las bases militares (representadas como diamantes verdes). Los puntos rojos son las características de la ciudad (mostradas en tamaños graduados por la tasa de criminalidad violenta) que estoy tratando de usar como capa de entrada:
Estaba tratando de usar el QGIS processing
módulo para hacerlo. Sin embargo, toda la documentación que he podido encontrar sobre el qgis:clip
muestra su salida hacia un shapefile. Por ejemplo las respuestas a la pregunta ¿Existe una forma de llamar a la función clip en pyQGIS desde la consola de python? sugieren:
processing.runalg("qgis:clip",inputlayer,overlaylayer,"output_file.shp")
processing.runandload("qgis:clip",inputlayer,overlaylayer,"output_file.shp")
Lo que quiero hacer en su lugar es iterar a través de todos los discos en la(s) capa(s) de recorte, y guardar los resultados de usar cada uno en un en memoria capa vectorial en lugar de un shapefile.
Aquí está el código (que no funciona) que intenté escribir para hacer esto:
for disc in troopBuffers:
# Clipping requires the cities layer and troop buffer disc to both be selected
buffLayer.select(disc.id())
cityLayer.selectAll()
clipLayer = QgsVectorLayer("Point", "temporary_points", "memory:tmpClipLayer")
QgsMapLayerRegistry.instance().addMapLayer(clipLayer)
processing.runandload("qgis:clip", cityLayer, disc, clipLayer)
clippedCities = [f for f in clipLayer.getFeatures()]
for c in clippedCities:
# do something with each city that lies within this disc ...
buffLayer.removeSelection()
QgsMapLayerRegistry.instance().removeMapLayer(clipLayer.id())
... sin embargo, cuando ejecuto esto clippedCities
parece estar siempre vacío, por lo que es evidente que algo va mal.
¿Cómo podría recortar así sin crear realmente archivos shape en el disco para cada iteración?
¿Puedo tener processing
enviar los resultados de cada clip a una "capa de raspado" en memoria, o (incluso mejor) simplemente obtener una lista de QgsFeature
objetos de la capa de ciudades para cada disco?
¿O voy a tener que usar otra cosa además de processing
¿Aquí?