Mehr

Wie ändere ich den Wert eines Attributs mit QgsFeature in PyQGIS?

Wie ändere ich den Wert eines Attributs mit QgsFeature in PyQGIS?


Ich möchte ein Attribut eines Features aktualisieren. Ich weiß jedoch nicht, wie ich es mithilfe des Feature-Objekts aktualisieren kann. Ich muss den Datenanbieter verwenden, um es zu aktualisieren.

layer = QgsMapLayerRegistry.instance().mapLayersByName('my_line') layer = layer[0] dp = layer.dataProvider() it = dp.getFeatures() für i in range(0, dp.featureCount()): feat = it.next() attrs = { 2 : 30 } layer.dataProvider().changeAttributeValues({ feat.id() : attrs })

Kann ich den Wert eines Attributs ändern mitQgs-FunktionObjekt?

Ist es außerdem möglich, mit einem Iteratorobjekt eine Schleife zu verwenden?


Beantwortung deiner beiden Fragen:

  1. Sie können Ihre Feature-Werte über dasSchichtObjekt, kein Zugriff auf dieDatenanbieter().

  2. Ja, Sie können den Iterator in a . verwendenProSchleife.

Überprüfen Sie den folgenden Code:

layer = QgsMapLayerRegistry.instance().mapLayersByName('my_line') layer = layer[0] it = layer.getFeatures() layer.startEditing() für darin enthaltenes feat: layer.changeAttributeValue(feat.id(), 2, 30 ) layer.commitChanges()

Dadurch wird der dritte Feldwert (Index 2) für alle Layer-Features auf 30 aktualisiert.


Hinweis: Wie Sie bereits erwähnt haben, kann das QgsFeature-Objekt aus irgendeinem Grund keine Feature-Werte aktualisieren, obwohl die API dies sagt.


Ja, aber Sie müssen den Index des Feldes kennen:

QgsFeature::setAttribute(int field,const QVariant & attr)

Sie können die Felder abrufen mitQgsFeature::Felderund dann iterieren Sie sie, bis Sie die gewünschte gefunden haben oderQgsFeature::attribute(const QString & name)um den Feldindex nach Namen zu finden.

Der Grund für QVariant ist, dass das setAttribute Integer-, Float-, Date- und Text-Typen annehmen kann. QgsFeature.attribute(name) gibt eine Variante auch vom Typ int zurück, wenn das Attribut gefunden wird, und etwas anderes, wenn es nicht gefunden werden kann. Beachten Sie dies in Ihrem Code. Ein Versuch… außer Block wäre gerechtfertigt, versuchen Sie, in int zu konvertieren und außer wenn type nicht int ist.

Es ist möglich, dass Ihre Funktion diese Methode nicht unterstützt. Eine andere Methode, die ich angewendet habe, istQgsVectorLayer::changeAttributeValue:

self.canvas.currentLayer().changeAttributeValue(UpdateFeatureID,FieldToUpdate,self.CurrentWidget.text(),True)

Dadurch wird der Layer angewiesen, ein bestimmtes Feature und ein bestimmtes Attribut zu aktualisieren. Im Beispielfall stammt der Wert von einem Widget.


Hfrhyu

Was wäre die ideale Energiequelle für ein kybernetisches Auge?

Wie zeichnet man dieses Diagramm mit dem TikZ-Paket?

3 Türen, drei Wachen, ein Stein

Gibt es eine spanische Version von "Dot your i's and cross your t's", die den Buchstaben "ñ" enthält?

Wenn 'B wahrscheinlicher A' gegeben wird, dann 'A wird wahrscheinlicher B gegeben'

Lagerung von Flusssäure vor der Erfindung von Kunststoffen

Ist Bluthochdruck jemals ein Symptom, das ausschließlich auf Dehydration zurückzuführen ist?

Wann sollte man aufhören zu sparen und zu investieren?

Hat Kevin echtes Chili verschüttet?

Wie kann ich den Player ausblenden, wenn er innerhalb oder außerhalb des Bereichs geht?

Wie funktioniert die Berührung des Todes-Features eines Klerikers der Todesdomäne mit Berührungszaubern, die von Vertrauten geliefert werden?

Was ist dieses einmotorige Tiefdecker-Propellerflugzeug?

Geweihhelm: Kann es funktionieren?

Wie viel Strahlung setzen nuklearphysikalische Experimente Forscher heute aus?

Wann geht Phishing-Erziehung zu weit?

Stimmt es, dass der DNS-Server eines Hosting-Providers die gesamte Hosting-Umgebung mit ICANN verbindet?

Wie nennen Sie einen Plan, der ein alternativer Plan ist, falls Ihr ursprünglicher Plan fehlschlägt?

Wie finde ich alle verfügbaren Tools im macOS-Terminal?

Die Logistik der Leichenentsorgung

Warum wird "Captain Marvel" in Portugal als männlich übersetzt?

Wie können Spieler zusammenarbeiten, um Aktionen durchzuführen, die sonst unmöglich wären?

Hat die Annahme einer Begnadigung einen Einfluss darauf, dass diese Person für dasselbe Verbrechen in einer souveränen Gerichtsbarkeit angeklagt wird?

Wie verhindere ich, dass meine Schleime aus ihren Stiften entkommen?

Hinzufügen einer Höhe zu einem Punkt in PyQGIS?

Unicorn Meta Zoo #1: Warum noch ein Podcast?Wie erhalte ich die Z-Werte von vorhandenem lineStringZ mit pyqgis?Wie erhalte ich ein Höhenprofil für einen GPS-Track?Höhen- und PunktdatenGPS-Punkthöhe vs von osm2poMüssen die Plotpunkte in Gruppen basierend auf ihrer Höhe gruppiert werdenPostgis Self-Intersection on Geometrie<->RastervergleichErmitteln der Höhe von Punkten mit PyQGIS?Extrahieren von Rasterwerten in Point-Feature-Class schlägt in ArcMap fehl?Methode asPoint().x() funktioniert nicht in QGIS 3.4.3, aber in 3.4.1Hinzufügen von Kachelebenen über PyQGIS

Ich versuche, einem 2D-Punkt in einem QGIS 3-Plugin eine Höhe hinzuzufügen, vorzugsweise auf kurze und einfache Weise. Finde das nicht einfach.

Ich denke, ein Teil des Problems ist, dass fromPoint() in QGIS 3 in fromPointXY() umbenannt wurde. Mir ist nicht ganz klar, wie man 3D-Punktgeometrie erstellt.

Ich habe eine Reihe von Variationen ausprobiert, ohne eine funktionierende zu finden, und konnte kein passendes Beispiel online finden.

Was ich im Grunde erreichen möchte, ist PointXY + Elevation -> Point , was ich in etwa wie folgt erwarten würde:

Zum Wohle anderer wird dies nun mit der/den Antwort(en) unten gelöst.

Ich füge jetzt die Höhe wie folgt hinzu:

Es stellte sich heraus, dass mein Problem nicht so sehr darin bestand, die Höhe hinzuzufügen, sondern zu wissen, wann ich sie erfolgreich hinzugefügt hatte.

Das enthält 2 x ')' und 1 x '(', also würde ich syntaktisch nicht erwarten, dass das wie geschrieben funktioniert. Aus der Dokumentation scheint klar zu sein, dass QgSPointXY speziell ein 2D-Punkt ist und keine az-Dimension unterstützt 'geom = QgsGeometry.fromPointXY(pt3D)' mit etwas wie 'geom = QgsGeometry.fromPointXY( QgsPointXY(1, 2), 3)' dann nein, das geht nicht.

QgsPointXY ist speziell ein 2D-Punkt und unterstützt keine Z-Dimension. Dies scheint aus der QGIS API-Dokumentation klar zu sein und ich habe es versucht. 'pt3D = QgsPointXY((1,2), 3)' führt zu einem TypeError.

Bitte schreiben Sie eine Eigenantwort in den für Antworten reservierten Bereich und nicht in den für Fragen reservierten Bereich.

Ich versuche, einem 2D-Punkt in einem QGIS 3-Plugin eine Höhe hinzuzufügen, vorzugsweise auf kurze und einfache Weise. Finde das nicht einfach.

Ich denke, ein Teil des Problems ist, dass in QGIS 3 fromPoint() in fromPointXY() umbenannt wurde. Mir ist nicht ganz klar, wie man 3D-Punktgeometrie erstellt.

Ich habe eine Reihe von Variationen ausprobiert, ohne eine funktionierende zu finden, und konnte kein passendes Beispiel online finden.

Was ich im Grunde erreichen möchte, ist PointXY + Elevation -> Point , was ich in etwa wie folgt erwarten würde:

Zum Wohle anderer wird dies nun mit der/den Antwort(en) unten gelöst.

Ich füge jetzt die Höhe wie folgt hinzu:

Es stellte sich heraus, dass mein Problem nicht so sehr darin bestand, die Höhe hinzuzufügen, sondern zu wissen, wann ich sie erfolgreich hinzugefügt hatte.

Das enthält 2 x ')' und 1 x '(', also würde ich syntaktisch nicht erwarten, dass das wie geschrieben funktioniert. Aus der Dokumentation scheint klar zu sein, dass QgSPointXY speziell ein 2D-Punkt ist und keine az-Dimension unterstützt 'geom = QgsGeometry.fromPointXY(pt3D)' mit etwas wie 'geom = QgsGeometry.fromPointXY( QgsPointXY(1, 2), 3)' dann nein, das geht nicht.

QgsPointXY ist speziell ein 2D-Punkt und unterstützt keine Z-Dimension. Dies scheint aus der QGIS API-Dokumentation klar zu sein und ich habe es versucht. 'pt3D = QgsPointXY((1,2), 3)' führt zu einem TypeError.

Bitte schreiben Sie eine Eigenantwort in den für Antworten reservierten Bereich und nicht in den für Fragen reservierten Bereich.

Ich versuche, einem 2D-Punkt in einem QGIS 3-Plugin eine Höhe hinzuzufügen, vorzugsweise auf kurze und einfache Weise. Finde das nicht einfach.

Ich denke, ein Teil des Problems ist, dass fromPoint() in QGIS 3 in fromPointXY() umbenannt wurde. Mir ist nicht ganz klar, wie man 3D-Punktgeometrie erstellt.

Ich habe eine Reihe von Variationen ausprobiert, ohne eine funktionierende zu finden, und konnte kein passendes Beispiel online finden.

Was ich im Grunde erreichen möchte, ist PointXY + Elevation -> Point , was ich in etwa wie folgt erwarten würde:

Zum Wohle anderer wird dies nun mit der/den Antwort(en) unten gelöst.

Ich füge jetzt die Höhe wie folgt hinzu:

Es stellte sich heraus, dass mein Problem nicht so sehr darin bestand, die Höhe hinzuzufügen, sondern zu wissen, wann ich sie erfolgreich hinzugefügt hatte.

Ich versuche, einem 2D-Punkt in einem QGIS 3-Plugin eine Höhe hinzuzufügen, vorzugsweise auf kurze und einfache Weise. Finde das nicht einfach.

Ich denke, ein Teil des Problems ist, dass in QGIS 3 fromPoint() in fromPointXY() umbenannt wurde. Mir ist nicht ganz klar, wie man 3D-Punktgeometrie erstellt.

Ich habe eine Reihe von Variationen ausprobiert, ohne eine funktionierende zu finden, und konnte kein passendes Beispiel online finden.

Was ich im Grunde erreichen möchte, ist PointXY + Elevation -> Point , was ich in etwa wie folgt erwarten würde:

Zum Wohle anderer wird dies nun mit der/den Antwort(en) unten gelöst.

Ich füge jetzt die Höhe wie folgt hinzu:

Es stellte sich heraus, dass mein Problem nicht so sehr darin bestand, die Höhe hinzuzufügen, sondern zu wissen, wann ich sie erfolgreich hinzugefügt hatte.

Das enthält 2 x ')' und 1 x '(', also würde ich syntaktisch nicht erwarten, dass das wie geschrieben funktioniert. Aus der Dokumentation scheint klar zu sein, dass QgSPointXY speziell ein 2D-Punkt ist und keine az-Dimension unterstützt 'geom = QgsGeometry.fromPointXY(pt3D)' mit etwas wie 'geom = QgsGeometry.fromPointXY( QgsPointXY(1, 2), 3)' dann nein, das geht nicht.

QgsPointXY ist speziell ein 2D-Punkt und unterstützt keine Z-Dimension. Dies scheint aus der QGIS API-Dokumentation klar zu sein und ich habe es versucht. 'pt3D = QgsPointXY((1,2), 3)' führt zu einem TypeError.

Bitte schreiben Sie eine Eigenantwort in den für Antworten reservierten Bereich und nicht in den für Fragen reservierten Bereich.

Das enthält 2 x ')' und 1 x '(', also würde ich syntaktisch nicht erwarten, dass das wie geschrieben funktioniert. Aus der Dokumentation scheint klar zu sein, dass QgSPointXY speziell ein 2D-Punkt ist und keine az-Dimension unterstützt 'geom = QgsGeometry.fromPointXY(pt3D)' mit etwas wie 'geom = QgsGeometry.fromPointXY( QgsPointXY(1, 2), 3)' dann nein, das geht nicht.

QgsPointXY ist speziell ein 2D-Punkt und unterstützt keine Z-Dimension. Dies scheint aus der QGIS API-Dokumentation klar zu sein und ich habe es versucht. 'pt3D = QgsPointXY((1,2), 3)' führt zu einem TypeError.

Bitte schreiben Sie eine Eigenantwort in den für Antworten reservierten Bereich und nicht in den für Fragen reservierten Bereich.

Das enthält 2 x ')' und 1 x '(', also würde ich syntaktisch nicht erwarten, dass das wie geschrieben funktioniert. Aus der Dokumentation scheint klar zu sein, dass QgSPointXY speziell ein 2D-Punkt ist und keine az-Dimension unterstützt 'geom = QgsGeometry.fromPointXY(pt3D)' mit etwas wie 'geom = QgsGeometry.fromPointXY( QgsPointXY(1, 2), 3)' dann nein, das geht nicht.

Das enthält 2 x ')' und 1 x '(', also würde ich syntaktisch nicht erwarten, dass das wie geschrieben funktioniert. Aus der Dokumentation scheint klar zu sein, dass QgSPointXY speziell ein 2D-Punkt ist und keine az-Dimension unterstützt 'geom = QgsGeometry.fromPointXY(pt3D)' mit etwas wie 'geom = QgsGeometry.fromPointXY( QgsPointXY(1, 2), 3)' dann nein, das geht nicht.

QgsPointXY ist speziell ein 2D-Punkt und unterstützt keine Z-Dimension. Dies scheint aus der QGIS API-Dokumentation klar zu sein und ich habe es versucht. 'pt3D = QgsPointXY((1,2), 3)' führt zu einem TypeError.

QgsPointXY ist speziell ein 2D-Punkt und unterstützt keine Z-Dimension. Dies scheint aus der QGIS API-Dokumentation klar zu sein und ich habe es versucht. 'pt3D = QgsPointXY((1,2), 3)' führt zu einem TypeError.

Bitte schreiben Sie eine Eigenantwort in den für Antworten reservierten Bereich und nicht in den für Fragen reservierten Bereich.

Bitte schreiben Sie eine Eigenantwort in den für Antworten reservierten Bereich und nicht in den für Fragen reservierten Bereich.


2 Antworten 2

Sie müssen kein QgsGeometry-Objekt erstellen.

Minimales Beispiel für setGeometry 3D hinzufügen

Der Originalcode befindet sich in meinem Github, wo viele Ebenen in 3d sind

Und um den Z-Wert von der Funktion zu erhalten, können Sie Folgendes verwenden:

Vielen Dank. Beim QgsGeometry-Objekt verstanden. Es kann sein, dass ich die Höhe erfolgreich hinzufüge, aber ich kann einfach nicht auf den Z-Wert zugreifen, um ihn zu überprüfen. Wenn ich versuche, die Geometrie mit asPoint() abzurufen, wird ein 2D-Punkt zurückgegeben und jeder Z-Wert wird verworfen. Die API-Dokumentation ist diesbezüglich klar. So. Wie erhalte ich die vollständigen Koordinaten eines 3D-Punktes? Ich möchte so etwas tun: 'QgsMessageLog.logMessage(str(f.geometry().z()))' aber das funktioniert nicht. Ich erhalte 'AttributeError: 'QgsGeometry'-Objekt hat kein Attribut 'z''.

Wenn Sie sich die Geometrie eines Features ansehen, müssen Sie Folgendes tun:


Schau das Video: QGIS Python PyQGIS - Loading and symbolizing raster layers