4 votos

Cambio de CRS de la capa con pyQGIS sin guardar archivo y whitout la iteración de cada función?

Así que tengo un layerA con CRS:4326 y puedo cambiar de CRS guardarla:

# This layer has crs:4346
layerA = QgsVectorLayer("layerA.sqlite", "layerA", "ogr")

#New crs
crs=QgsCoordinateReferenceSystem("epsg:32629")

#saving layerA to layerB with new crs:32629
error = QgsVectorFileWriter.writeAsVectorFormat(layerA, "layerB.sqlite", "UTF-8", crs , "SpatiaLite")

Con este código se puede obtener una nueva LayerB con otro CRS

He leído esto: http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/crs

Pero creo que esta solución necesita iterar sobre cada característica para reproyectar.

Existe alguna solución para reproyectar una capa con una única instrucción (como cuando de ahorro), pero sin necesidad de crear una nueva capa ?

Algo como layerA.reproject(newCRS) ?

7voto

Mue Puntos 2469

No creo que usted puede reproyectar una capa y sobrescribir sus datos , al mismo tiempo, se accede a ella. Una opción es:

  1. Crear una capa de memoria
  2. La transferencia de todos los datos de la capa original para la capa de memoria
  3. Quite las dependencias de la capa original
  4. Sobrescribir capa original con el nuevo CRS

# Get original shapefile and its features
layer = QgsVectorLayer("path/to/shapefile", "polygon", "ogr")
feats = [feat for feat in layer.getFeatures()]

# Create memory layer and copy over all attributes and geometries
mem_layer = QgsVectorLayer("Polygon?crs=epsg:4326", "memory_layer", "memory")
mem_layer_data = mem_layer.dataProvider()
attr = layer.dataProvider().fields().toList()
mem_layer_data.addAttributes(attr)
mem_layer.updateFields()
mem_layer_data.addFeatures(feats)
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

# Get original shapefile path
layer_source = layer.source()
# Remove dependence on shapefile
del layer
#New crs
crs = QgsCoordinateReferenceSystem("EPSG:32629")
# Overwrite original shapefile
error = QgsVectorFileWriter.writeAsVectorFormat(mem_layer, layer_source, "utf-8", crs, "ESRI Shapefile")
# Add result to canvas
QgsMapLayerRegistry.instance().addMapLayer(QgsVectorLayer(layer_source, "Result", "ogr"))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X