[FOSSGIS-Talk] Skript zum Hinzufügen mehrerer Quellfelder und einer gespeicherten Stil-Datei
Christoph Jung
jagodki.cj at gmail.com
Sa Dez 29 20:16:34 CET 2018
Hallo Robert,
ich gehe mal davon aus, dass du über die Features eines Layers iterierst (das würden jedenfalls zu dem Befehl „feature.id <http://feature.id/>()“ passen). Dann müsste die Fläche eines Features über folgenden Befehl berechnet werden:
feature.geometry().area()
Der Befehl „sum(feature[0])“ liefert wahrscheinlich nicht das gewünschte Resultat, weil du damit den Wert des Attributs mit Index 0 eines einzigen Features ausliest und summierst. Die Summe musst du schon berechnet haben, bevor du das Feld 2 aktualisieren willst. Ad hoc würde ich es folgendermaßen machen (ohne Gewähr, dass das der beste Weg wäre ^^):
1. erstelle VOR der Schleife zum Aktualisieren des Layers eine Variable zum Speichern der Area-Sum
2. IN deiner Schleife berechnest du die Fläche und speicherst diese in einer lokalen Variable (diese Variable wird mit jedem Schleifendurchlauf überschrieben)
3. aktualisiere deinen Layer mit deinem geposteten Befehl, aber entferne das Key-Value-Paar „2 : sum(…)“ und ersetze „$area“ durch die unter Punkt 2 angelegt Variable
4. Addiere den Wert der Variable von Punkt 2 auf die Variable von Punkt 1
5. Nachdem die Schleife zum Aktualisieren deines Layers vollständig durchlaufen wurde, startest du eine neue Schleife, in welcher nur noch das Attribut mit dem Feld-Index 2 aktualisiert wird (hier kannst du dann die Variable aus Punkt 1 nutzen)
Diese Lösung ist mir als erstes durch den Kopf gegangen. Ich schließe aber nicht aus, dass es bessere Ansätze für dein Problem geben kann :)
Viele Grüße,
Christoph
> Am 29.12.2018 um 11:18 schrieb Bob <bob3150 at freenet.de>:
>
> Hallo Christoph,
>
> Zuerst einmal vielen Dank für deine Hinweise.
>
> Nach einigen Stunden gestern und heute habe ich das meiste geschafft, doch bei der Feldberechnung hänge ich nun - ich hoffe du kannst mir dabei weiterhelfen.
>
> layer.dataProvider().changeAttributeValues({ feature.id <http://feature.id/>() : { 1 : $area, 2 : sum(feature[0]), 3 : 15 * feature[0] / 100, 4 : 22 * feature[0] / 100, 5 : 2000 * feature[0] / 100 } })
>
> $area und sum(feature[0]) funktionieren so nicht, ich hoffe du kannst mir dabei helfen wie ich diese Funktionen an dieser Stelle einbauen kann!
>
> Grüße,
> Robert
>
>> Am 28.12.2018 um 19:24 schrieb Christoph Jung <jagodki.cj at gmail.com <mailto:jagodki.cj at gmail.com>>:
>>
>> Hallo Robert,
>>
>> eine Style-Datei wird mit folgendem Befehl einem bestehenden Vektor-Layer hinzugefügt:
>>
>> layer.loadNamedStyle(filename, loadFromLocalDb=False)
>> Der Parameter „filename“ steht für den absoluten Pfad der Style-Datei (getestet mit einer QML-Datei, mit SLD hatte ich bisher meine Probleme in QGIS und habe eine solche per Python noch nicht geladen).
>>
>> Ein neues Feld kann mittels folgendem Befehl erzeugt werden:
>> layer.addAttribute(QgsField("mytext", QVariant.String))
>> bzw. mehrere Felder auf einmal hinzufügen:
>> layer.dataProvider().addAttributes(
>> [QgsField("mytext", QVariant.String),
>> QgsField("myint", QVariant.Int)])
>> Ein Feld kann mittels QgsVectorDataProvider umbenannt werden:
>> https://qgis.org/pyqgis/master/core/QgsVectorDataProvider.html?highlight=qgsvectordataprovider#qgis.core.QgsVectorDataProvider.renameAttributes <https://qgis.org/pyqgis/master/core/QgsVectorDataProvider.html?highlight=qgsvectordataprovider#qgis.core.QgsVectorDataProvider.renameAttributes>
>>
>> Um die neuen Felder mit Daten zu füllen, würde ich über alle Features des Layers iterieren und dann die Daten in die Attribute jedes Features schreiben. Siehe hierzu auch das QGIS-Cookbook:
>> https://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html <https://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html>
>>
>> Viele Grüße,
>> Christoph
>>
>>
>>> Am 26.12.2018 um 16:26 schrieb Bob <bob3150 at freenet.de <mailto:bob3150 at freenet.de>>:
>>>
>>> Hallo,
>>>
>>> Ich habe leider keine Erfahrung mit Skripte in QGis (Programmiererfahrung habe ich schon).
>>>
>>> Ich hoffe jemand kann mir helfen ein Skript zu erstellen, welches mehrere Quellfelder auf Basis eines Bestehenden erzeugt und eine gespeicherte Stil-Datei dem Layer hinzufügt:
>>>
>>> Als Basis dient eine SHP-Datei die einen Layer darstellt mit dem Quellfeld kg/ha
>>>
>>> "kg/ha" soll umbenannt werden in „Basis“
>>> Ein Quellfeld (real, 17, 4) Flaeche=$area soll erstellt werden
>>> Ein Quellfeld (real, 17, 3) GewMW=(Flaeche/sum("Flaeche"))*Basis/100 soll erstellt werden
>>> Ein Quellfeld (real, 17, 3) Menge1=15*Basis/100 soll erstellt werden
>>> Ein Quellfeld (real, 17, 3) Menge2=220*Basis/100 soll erstellt werden
>>> Ein Quellfeld (real, 17, 3) Menge3=2000*Basis/100 soll erstellt werden
>>> Dem Layer soll eine auf der Festplatte gespeicherte Stil-Datei zugewiesen werden.
>>>
>>> Das Skript denke ich wird bei den Verarbeitungswerkzeugen erstellt und verwaltet.
>>>
>>> Grüße
>>> Robert
>>>
>>> --
>>> ....................................................................
>>> FOSSGIS 2019, die Konferenz für Open Source GIS mit OpenData und
>>> OpenStreetMap in Dresden!
>>> 13.-16. März 2019 an der HTW Dresden
>>> https://fossgis-konferenz.de/2019/ <https://fossgis-konferenz.de/2019/>
>>>
>>> FOSSGIS Veranstaltungen 2018
>>> https://www.fossgis.de/node/306 <https://www.fossgis.de/node/306>
>>>
>>> FOSSGIS e.V, der Verein zur Förderung von Freier Software aus dem
>>> GIS-Bereich und Freier Geodaten!
>>> https://www.fossgis.de/ https://twitter.com/fossgis_eV
>>>
>>> ____________________________________________________________________
>>> FOSSGIS-Talk-Liste mailing list
>>> FOSSGIS-Talk-Liste at fossgis.de
>>> https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
>>
>
Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste