[QGIS-DE] Datenformat und SQL Join

Matthias Henning matthias.henning at t-online.de
Mi Feb 17 14:32:24 PST 2021


Hallo,

Ich möchte hier ein paar Ergänzungen loswerden, die vielleicht das eine 
oder andere Problem erklären können. SQL ist nicht gleich SQL, da jede 
Software nicht den kompletten Umfang abdeckt. Im Besonderen wenn es um 
räumliche Funktionen geht. Und die Datenbanken Geopackage, SpatiaLite 
und PostGIS sind jeweils eigenständige "Programme". Geopackage und 
SpatiaLite haben im Kern zwar eine SQLite Datenbank, aber eigene 
Funktionen, teils auf SQLite Basis, teils eigen. Hinzu kommt ein 
unterschiedlicher Softwarestand der SQLite-DB und damit dem 
Funktionsumfang. SpatiaLite ist dabei mehr oder weniger eine ganz eigene 
Software und Geopackage mehr ein Standard (OGC-Standard) der auf 
Datenaustausch abziehlt und nicht auf Berechnungsfunktionen. PostGIS 
wiederum ist eine Erweiterung der PostgreSQL-DB mit eigener SQL 
implementierung und zusätzlich mit PostGIS und dessen eigenen räumlichen 
Funktionen. Die haben alle nichts miteinander zu tun was den 
darunterliegenden Code der Geoverarbeitungsfunktionen angeht. Aber 
zahlreiche Funktionen heissen gleich und funktionieren meist gleich 
(auch nicht immer!). Nur haben sie nicht alle Funktionen gemeinsam. Der 
SQL-Code kann daher durchaus in PostGIS funktionieren, aber nicht auf 
SpatiaLite oder Geopackage Basis, da QGIS das SQL nur an den jeweiligen 
DB-Treiber weiterleitet. Müsste man mit den gegebenen Daten mal testen, 
da ich auch keinen Überblick habe welche Funktion welche der Datenbanken 
genau bietet.

Es ist halt leider nach wie vor eine Krux mit einem einheitlichen 
Datenformat, welches gleichzeitig umfangreiche Funktionen bietet. 
PostGIS hat alles was man sich wünscht, ist aber Serverbasiert und daher 
der Austausch umständlicher. SpatiaLite hat viele Funktionen und ist 
Dateibasiert, aber nicht so gut als Austauschformat da es nicht überall 
so einfach unterstützt wird. Geopackage ist international 
standartisiert, man kann hier auf eine immer weiter zunhemende 
Verbreitung hoffen. Die letzten Jahre haben aber kaum Fortschritt 
außerhalb der OpenSource-Welt gebracht. Ich nutzte tatsächlich keines 
der Formate für den Austausch zwischen QGIS uns anderer Software, da es 
bei den closed Source Programmen welche ich nutze (teils muss) mit 
keinem der drei Varianten im Hin-und-Her Austausch funktioniert. Dies 
aber nur am Rande, da der Export von Shapefiles angesprochen wurde.

vg

Matthias



On 17.02.21 17:04, J1999 wrote:
> Hallo bmarcus,
>
> erst einmal ganz herzlichen Dank für die informationsreiche Antwort - das
> Konzept zu verstehen ist immer noch mein Hauptziel und der Text hat mein
> Verständnis auch erweitert. Leider konnte ich erst jetzt Zeit und Ruhe
> finden um mich dieser Lösung zu widmen - und beim Versuch ergaben sich da
> einige Fragen:
>
>
> bmarcus wrote
>> Da sich das Datenbank basierte Geopackage unter QGIS als Standartformat
>> etabliert hat, möchte ich in der inzwischen stark pythonisierten GIS-Welt
>> eine Lanze brechen und stelle zur Lösung geschilderter Probleme einen SQL
>> Ansatz vor.
> Was wäre für den Fall dann besser, GeoPackage DB mit verschiedenen Layern
> oder SpatiaLite? Ich hab die Shapefiles in dem Falle auf GeoPackage
> exportiert.
>
>
> bmarcus wrote
>> Starten wir mit den Knotenpunkten. Für das Einfügen sich nicht
>> überlagernder
>> Start- und Endpunkte eines Linienlayers in einen Punktlayer bietet sich
>> folgende INSERT Anweisung an:
>>
>> ```sql
>> -- füge neue Objekte in den Punktlayer ein (nur für das Feld "geom")
>> insert into points (geom)
>> -- und zwar aus dem Resultat folgender zusammengefasster Abfragen:
>> --- 1. wähle alle Startpunkte des "lines" Layers
>> select st_startpoint(geom) from lines
>> --- vereinige diese mit Objekten, die nicht schon vorhanden sind
>> union
>> --- 2. wähle alle Startpunkte des "lines" Layers
>> select st_endpoint(geom) from lines
>> ;
>> ```
> Bei der Eingabe habe ich zuerst versucht, das SQL Ausführungstool von QGIS
> zu verwenden, was leider nicht funktionierte, danach über die DB-Verwaltung
> des GeoPackages. Ich hab die drei "```" rausgelöscht und dann war der Syntax
> Error auch weg. Nur sagt er mir jetzt, dass er Spalten (columns) will und
> die Spalte "geom" für die Geometrie nicht existiert, obwohl ich auch schon
> beim Exportieren in GeoPackage darauf geachtet habe, dass die Geometrie in
> geom gespeichert wird (stand automatisch drin wie üblich)
>
> Kann es sein, dass ich die geografische Abfrage nicht über SQL machen kann?
> Oder mach ich irgendetwas bezüglich des SQL Skripts falsch? Feldnamen hab
> ich durch meine ersetzt bzw Layernamen - einige male ausprobiert, die
> Kommentare entfernt sodass das ganze am Ende so aussieht:
>
> *1. Einfügen der Knoten:*
>
> sql
> insert into points(geom) /(hier habe ich "points" durch "Versuch_P"
> ersetzt)/
> select st_startpoint(geom) from lines /(hier habe ich "lines" durch
> "Versuch_L" ersetzt)/
> union
> select st_endpoint(geom) from lines /(hier genauso)/
> ;
>
> *2. Räumliche Abfrage aller Objekte des Punktelayers:*
>
> sql with
> cte1 (g_un) as (
> select st_collect(geom)
> from Versuch_P
> ),
>
> cte2 (node_start) as (
> select st_startpoint(geom)
> from Versuch_L as a, cte1 as b
> where st_intersects(b.g_un, st_startpoint(a.geom)) <> 1
> ),
>
> cte3 (node_end) as (
>          select st_endpoint(geom)
>          from Versuch_L as a, cte1 as b
>          where st_intersects(b.g_un, st_endpoint(a.geom)) <> 1
> )
>
> insert into Versuch_P (geom)
> select node_start from cte2
> union
> select node_end from cte3
> ;
>
>
> /Hast du eine Idee, was ich nicht richtig mache? Ansonsten könnte ich
> alternativ bei diesem Schritt erstmal Hilfe gebrauchen:/
>
> Ich hab jetzt den Punktelayer mit Nummerierungen gepflegt, von Punkt '1001'
> bis '1002' in der Spalte "Nr" und mach es jetzt so: wenn ich danach die
> Linien im Linienlayer erfasse, mach ich das Fangwerkzeug an und setze die
> Stützpunkte bzw den ersten und letzten auf die Punkte mit Nummern, quasi
> wenn ich eine Linie von Punkt '1001' bis Punkt '1002' habe, soll er im Feld
> "Nummern" dann das hier schreiben:
> '1001-1002'
>
> Kennst du eine Methode im Feldrechner vielleicht sogar, Daten aus einem
> anderen Layer abzufragen? (dachte an so etwas wie
> getfeature('layer','attribute','value')... nur leider funktioniert das nicht
> wenn ich das eingebe)
>
> meine Idee war so etwas wie Abfrage des start_node + end_node, also in etwa
> sowas hier:
>
> concat(
>   to_string(
>    contains(
>     start_point($currentfeature),
>     [Punktobjekt, das geometrisch auf derselben Position wie der Node liegt]
> --> wie schreibt man das?
>     )),
>   '-',
>   to_string(
>    contains(
>     end_point($currentfeature),
>     [Punktobjekt, das geometrisch auf derselben Position wie der Node liegt]
>     )))
>
> Wäre das umsetzbar, oder wäre der Versuch hier ebenso via SQL besser?
>
> LG und vielen Dank im Voraus
>
>
>
> --
> Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-de-f5194137.html
> _______________________________________________
> QGIS-DE mailing list
> QGIS-DE at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/qgis-de


Mehr Informationen über die Mailingliste QGIS-DE