[FOSSGIS-Talk] GDAL/OGR Skripte in Python ansprechen

Thomas B rdbath.regiodata at gmail.com
Mi Nov 17 13:41:34 CET 2021


Hallo Bernd,
bei der Aufgabe führen sicher viele Wege nach Rom.

Du könntest ja in einer Loop die entsprechenden Layer auslesen und über den
QgsVectorFileWriter zusammenführen.


Alternativ das ogr/python Beispiel von
https://pcjericks.github.io/py-gdalogr-cookbook/vector_layers.html#merge-ogr-layers
so abwandeln und testen, dass der Ziellayer nicht neu erzeugt wird (siehe
hier eingefügtes Beispiel) .

#data_source = driver.Open(src, 0) # for reading
#data_source = driver.Open(src, 1) # for writing

import os, ogr, osr

outputMergefn = 'zielshapefile.shp'
directory = "R:/MeinOrdner/mein_unterordner/"
fileStartsWith = 'flurstueck'
fileEndsWith = '.shp'
driverName = 'ESRI Shapefile'
#geometryType = ogr.wkbPolygon

out_driver = ogr.GetDriverByName( driverName )
if os.path.exists(outputMergefn):
    out_driver.DeleteDataSource(outputMergefn)

out_ds = ogr.Open(directory+outputMergefn,1)  # for writing
out_layer = out_ds.GetLayer()

fileList = os.listdir(directory)

for file in fileList:
    if file.startswith(fileStartsWith) and file.endswith(fileEndsWith):
        print (file)
        ds = ogr.Open(directory+file,0)

        lyr = ds.GetLayer()
        for feat in lyr:
            out_feat = ogr.Feature(out_layer.GetLayerDefn())
            out_feat.SetGeometry(feat.GetGeometryRef().Clone())
            out_layer.CreateFeature(out_feat)
            out_feat = None
            out_layer.SyncToDisk()

Recht gut klingt auch das QGIS Plugin "AppendFeaturesToLayer" , welches dir
einen zusätzlichen Processing-Algorithmus liefert zum appenden:
https://github.com/gacarrillor/AppendFeaturesToLayer
https://gis.stackexchange.com/a/332912/67477

params = {'SOURCE_LAYER': source_layer,
          'TARGET_LAYER': target_layer,
          'ACTION_ON_DUPLICATE' : 0}  # 0: Just append all features

processing.run("etl_load:appendfeaturestolayer", params)

Vielleicht ist da was dabei, was passt.

Viele Grüße,
Thomas


Am Mi., 17. Nov. 2021 um 11:45 Uhr schrieb <bmarcus at giswana.de>:

> Hallo,
>
> seit wenigen Wochen biege ich mir Python bei. Für den Massenimport von
> Shape-Files, die über mehrere Ordner und Unterordner verteilt vorliegen,
> habe ich ein Python-Skript geschrieben, welches die gewünschten Dateien
> aufsucht und anschließend in eine Tabelle einer SpatiaLite Datenbank
> schreibt. Hierbei kommt ich die durch QGIS bereitgestellte Funktion
> processing.run("native:mergevectorlayers"
> zum Einsatz.
>
> Ein Nachteil von "native:mergevectorlayers" ist jedoch, dass es keine
> Methode zum Anfügen neuer Daten in die gleiche Tabelle gibt. Vielmehr wird
> eine existierende Tabelle einfach überschrieben (oder ich habe bisher etwas
> Gravierendes übersehen).
>
> Das GDAL/OGR Python-Skript ogrmerge.py beherrscht das Anhängen weiterer
> Daten an eine bestehende Tabelle, doch konnte ich bisher das Skript nicht
> zum Laufen bringen.
>
> [python3 erster Versuch]
>
> import sys
> # Einbinden des Skriptpfades
> new_path = 'C:\\Program Files\\QGIS 3.22.0\\apps\\Python39\\Scripts'
> if new_path not in sys.path:
>     sys.path.append(new_path)
> # Import von ogrmerge
> import ogrmerge as om
>
> ##==> QGIS stürzt sofort ab
>
>
> [python3 zweiter Versuch: direktes Einbinden des Skripts aus  '
> osgeo_utils']
>
> import sys
> new_path = 'C:\\Program Files\\QGIS
> 3.22.0\\apps\\Python39\\Lib\\site-packages\\osgeo_utils'
>
> if new_path not in sys.path:
>     sys.path.append(new_path)
> import ogrmerge as om
>
> Das funktioniert schon mal und om.process kann angesprochen werden. Doch es
> hapert am Syntax:
>
> om.process([-o "C:\\liemas7\\dev\\temp\\ogrmerge2.gpkg"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-001_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-002_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-003_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-004_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-005_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-006_flurstueck.shp"
> -f GPKG -single -progress])
>
> ##--> Die QGIS Python-Console zeigt einen Syntax-Fehler direkt vor dem
> ersten doppelten Anführungszeichen an.
>
>
> om.process(['-o' "C:\\liemas7\\dev\\temp\\ogrmerge2.gpkg"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-001_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-002_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-003_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-004_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-005_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-006_flurstueck.shp"
> '-f' 'GPKG' '-single' '-progress'])
>
> ##--> ERROR: Unrecognized argument :
> -oC:\liemas7\dev\temp\ogrmerge2.gpkgC:\lie...
> OK, der Fehler ist augenscheinlich.
>
>
> om.process(['-o "C:\\liemas7\\dev\\temp\\ogrmerge2.gpkg"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-001_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-002_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-003_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-004_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-005_flurstueck.shp"
> "C:\\liemas7\\dev\\data\\geo\\th\\ALKIS_KB54_shp\\2601-006_flurstueck.shp"
> -f GPKG -single -progress'])
>
> ##--> ERROR: Unrecognized argument : -o
> "C:\liemas7\dev\temp\ogrmerge2.gpkg"
> "C:\liemas7\dev\data\geo\th\ALKIS_KB54_shp\2601-001_flurstueck.shp"
> "C:\liemas7\dev\data\geo\th\ALKIS_KB54_shp\2601-002_flurstueck.shp"
> "C:\liemas7\dev\data\geo\th\ALKIS_KB54_shp\2601-003_flurstueck.shp"
> "C:\liemas7\dev\data\geo\th\ALKIS_KB54_shp\2601-004_flurstueck.shp"
> "C:\liemas7\dev\data\geo\th\ALKIS_KB54_shp\2601-005_flurstueck.shp"
> "C:\liemas7\dev\data\geo\th\ALKIS_KB54_shp\2601-006_flurstueck.shp" -f GPKG
> -single -progress
>
> Das sieht zwar m.E. nach einer sauberen Übergabe der Argumente aus, doch
> die
> Maschine ist offensichtlich anderer Meinung.
>
> Ich wäre sehr dankbar, wenn mir jemand bei der Findung des richtigen Syntax
> auf die Sprünge helfen könnte, oder einen anderen Weg aufzeigt, wie man
> einen Massenimport mit Python realisiert, der auch die Möglichkeit bietet,
> weitere Daten an bestehende Datensätze anzuhängen.
> Zudem interessiert mich als blutiger Python-Anfänger, warum das Einbinden
> von ogrmerge.py aus dem Skript-Ordner 'C:\\Program Files\\QGIS
> 3.22.0\\apps\\Python39\\Scripts' nicht möglich ist.
>
> Besten Dank.
>
> Euch alle Gute
>
> Bernd
>
> --
> ....................................................................
> FOSSGIS Veranstaltungen
> https://www.fossgis.de/news/fossgis-events/
>
> 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_Verein
>
> ____________________________________________________________________
> 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