Mehr

Erstellen eines neuen leeren Speicherlayers mit einem Feldschema aus einem anderen Layer in QGIS?

Erstellen eines neuen leeren Speicherlayers mit einem Feldschema aus einem anderen Layer in QGIS?


Da ich bisher neu bei Python war, wurde ich von dieser Antwort inspiriert: /a/155988/8202, um ein wenig darin einzutauchen.

Beim Erstellen von Features in einem neuen Ziel-Layer aus einem vorhandenen Quell-Layer waren alle "Lösungen", die ich bisher gefunden habe, um diesen neuen Layer zu erstellen, entweder

  1. Bereiten Sie den neuen Ziellayer vorher manuell in QGIS vor, indem Sie alle Felder hinzufügen (mit Feldtypen, Längen usw.).
  2. Codieren Sie die Feldeinstellungen fest in das Python-Skript, wenn Sie diese neue Zielebene erstellen. Wie erstelle ich programmgesteuert eine neue leere Vektorebene?

Es erscheint mir etwas seltsam, dass es keine programmatische Möglichkeit geben sollte, das Attributschema einer Ebene zu klonen und mit diesem Schema eine neue (Speicher-)Ebene zu erstellen, sodass Sie Ihr Skript nicht für jede neue Ebene ändern oder fummeln müssen Dinge manuell zusammen.

Ich konzentriere mich auf die Erstellung von Speicherschichten, weil ich die Möglichkeit haben möchte, selbst zu entscheiden, ob das Ergebnis zufriedenstellend ist, und es manuell zu speichern, wenn es meinen Bedürfnissen entspricht.


Hier ist ein schneller Python-Code, der auf einer einfachen Shapefile-Ebene funktioniert:

# Abrufen des aktuell ausgewählten Layers inLayer = iface.activeLayer() # Abrufen seiner Liste von Feldern inFields = inLayer.dataProvider().fields() # Konvertieren seines Geometrietyps enum in einen String, den wir an den # Konstruktor von QgsVectorLayer übergeben können inLayerGeometryType = [' Point','Line','Polygon'][inLayer.geometryType()] # Wandelt seinen CRS in einen String um, den wir an den Konstruktor von QgsVectorLayer übergeben können inLayerCRS = inLayer.crs().authid() # Macht die Ausgabeebene outLayer = QgsVectorLayer (inLayerGeometryType + '?crs='+inLayerCRS,  inLayer.name() + u'_copy',  'memory') # Kopieren Sie die Felder vom alten Layer in den neuen Layer outLayer.startEditing() outLayer.dataProvider() .addAttributes(inFields.toList()) outLayer.commitChanges() # Zur Karte hinzufügen QgsMapLayerRegistry.instance().addMapLayer(outLayer)

Ich lade eine einfache Formdatei hoch, wähle diese Ebene im Feld Ebenen aus, füge den obigen Code in die Python-Konsole ein und eine neue Ebene mit denselben Attributen wird angezeigt.

Die wichtigsten Teile hier (ich vermute aus Ihrer Frage) sind die Zeilen, die die Liste der Felder aus der Eingabeschicht (inLayer.dataProvider().fields(), hier dokumentiert) und fügen Sie dieselben Felder zur Ausgabeschicht hinzu (outLayer.dataProvider().addAttributes(inFields.toList()), hier dokumentiert)


Schau das Video: Cut Polygon from another Polygon layer QGIS