Estoy utilizando la herramienta de intersección (caja de herramientas de procesamiento) para intersecar polígonos. Tengo un gran número de pequeños polígonos para intersecar y se necesita mucho tiempo para hacerlo. Quizás se deba a la gran extensión de la forma del polígono. ¿Es posible establecer una distancia máxima que defina la distancia máxima entre los polígonos que serán intersecados? Me gustaría poner esta opción en un script python si es posible.
Respuesta
¿Demasiados anuncios?
Yada
Puntos
9489
He probado tu shapefile con el siguiente script, en la consola Python de QGIS, para producir una capa de memoria con todas las intersecciones (intersección de intersecciones; 57.401 características) del shapefile original (20.730 características).
import fiona
from shapely.geometry import shape, LineString
from shapely.ops import unary_union, polygonize
import time
c = fiona.open('/home/zeito/pyqgis_data/example/example_1.shp')
collection = []
start = time.time()
print "wait..."
for i,item in enumerate(c):
geom = shape(item['geometry'])
collection.append(geom)
rings = [ LineString(pol.exterior.coords) for pol in collection ]
union = unary_union(rings)
new_intersections = [geom.wkt for geom in polygonize(union)]
epsg = int(c.crs.values()[0].split(':')[1])
uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"
mem_layer = QgsVectorLayer(uri,
'polygon',
'memory')
prov = mem_layer.dataProvider()
for i,feat in enumerate(new_intersections):
feat = QgsFeature()
feat.setAttributes([i])
feat.setGeometry(QgsGeometry.fromWkt(new_intersections[i]))
prov.addFeatures([feat])
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
end = time.time()
time_tot = end - start
print "total time = %.4f s" % time_tot
En la primera imagen, he seleccionado una característica arbitraria en el shapefile original:
En la segunda imagen, donde la capa de memoria tiene un 50 % de transparencia, se puede observar que esta característica original tiene siete características en la nueva capa.