[QGIS-DE] Datenformat und SQL Join

J1999 jean-pierre1999 at gmx.de
Mi Feb 17 08:04:31 PST 2021


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


Mehr Informationen über die Mailingliste QGIS-DE