Más

¿Creando una nueva capa de memoria vacía con un esquema de campos de otra capa en QGIS?


Siendo nuevo con Python hasta ahora, me inspiré en esta respuesta: / a / 155988/8202 para sumergirme un poco en él.

Al crear entidades en una nueva capa de destino a partir de una capa de origen existente, todas las "soluciones" que encontré hasta ahora para crear esa nueva capa eran para

  1. prepare la nueva capa de destino manualmente en QGIS de antemano, agregando todos los campos (con tipos de campo, longitudes, etc.).
  2. Codifique la configuración del campo en la secuencia de comandos de Python al crear esa nueva capa de destino. ¿Cómo crear una nueva capa vectorial vacía mediante programación?

Me parece un poco extraño que no debería haber una forma programática de clonar el esquema de atributos de una capa y crear una nueva capa (memoria) con este esquema, por lo que no tendrá que cambiar su secuencia de comandos para cada nueva capa, o torpemente cosas juntas manualmente.

Estoy enfocado en la creación de capas de memoria, porque quiero tener la oportunidad de decidir por mí mismo si el resultado es satisfactorio y guardarlo manualmente cuando se adapte a mis necesidades.


Aquí hay un código Python rápido y sucio que funciona en una capa de shapefile simple:

# Obtener la capa actualmente seleccionada inLayer = iface.activeLayer () # Obtener su lista de campos inFields = inLayer.dataProvider (). Fields () # Convertir su tipo de geometría enum a una cadena que podemos pasar al # constructor de QgsVectorLayer inLayerGeometryType = [' Point ',' Line ',' Polygon '] [inLayer.geometryType ()] # Convierta su CRS en una cadena que podamos pasar al constructor de QgsVectorLayer inLayerCRS = inLayer.crs (). Authid () # Haga la capa de salida outLayer = QgsVectorLayer (inLayerGeometryType + '? crs =' + inLayerCRS,  inLayer.name () + u'_copy ', ' memory ') # Copie los campos de la capa anterior a la capa nueva outLayer.startEditing () outLayer.dataProvider () .addAttributes (inFields.toList ()) outLayer.commitChanges () # Agréguelo al mapa QgsMapLayerRegistry.instance (). addMapLayer (outLayer)

Carga un archivo de forma simple, selecciono esa capa en el cuadro Capas, pego el código anterior en la consola de Python y aparece una nueva capa con los mismos atributos.

Las partes clave aquí (supongo que por su pregunta) son las líneas que obtienen la lista de campos de la capa de entrada (inLayer.dataProvider (). fields (), documentado aquí) y agregue esos mismos campos a la capa de salida (outLayer.dataProvider (). addAttributes (inFields.toList ()), documentado aquí)


Ver el vídeo: Creating Shapefile or Layers in QGIS (Septiembre 2021).