Mehr

So finden Sie alle Punkte mit einem bestimmten Höhenunterschied zwischen ihnen in QGIS


Ich habe eine Punktebene (xyz) und möchte alle Punkte mit einem Höhenunterschied von 200 m oder mehr finden. Ich möchte dann zwischen jedem Paar mit dem größten Höhenunterschied eine Linie ziehen.

Das Ziel ist es, Gebiete mit großen Höhenunterschieden und (eventuell) der nächsten Entfernung zwischen ihnen in QGIS zu identifizieren.


Am einfachsten importieren Sie Ihre Punkte in ein mit SQL abfragbares Format, wie PostGIS, SQLite oder Shapefile (mittels OGR).

Dann können Sie abfragen:

SELECT * FROM [Tabelle] a, [Tabelle] b WHERE a.[Merkmals-ID] <> b.[Merkmals-ID] AND ST_Z(a.[Geometrie]) - ST_Z(b.[Geometrie]) >= 200;

Oder Sie können in einem Schritt Zeilen abfragen und erstellen:

SELECT ST_MakeLine(a.[Geometrie], b.[Geometrie]) AS geom FROM [Tabelle] a, [Tabelle] b WHERE a.[Feature-ID] <> b.[Feature-ID] AND ST_Z(a.[Geometrie]) - ST_Z(b.[Geometrie]) >= 200;

Es kann hilfreich sein, zuerst alle Punkte herauszufiltern, die nicht >= 200 m von einem anderen Punkt entfernt sein können, da dies eine O(n^2)-Abfrage ist - wenn Sie viele Punkte haben, dauert es lange. Sie können das Matching auch auf eine bestimmte Distanz beschränken, um den Index zu verwenden und zu beschleunigen.

Hinweis: Ersetzen Sie hier [names] durch Ihre eigenen Tabellen-/Spaltennamen.

Bearbeiten:

Ich konnte in QGIS nicht finden, wo ich eine SQL-Abfrage ausführen kann, aber so geht es in ogr2ogr in der Befehlszeile:

ogr2ogr  -f "ESRI Shapefile"  -dialect "SQLITE"  -sql "SELECT * FROM Eingabe a, Eingabe b WHERE ST_Z(a.GEOMETRY)-ST_Z(b.GEOMETRY) < 200 AND a.FID<>b. FID"  output.shp input.shp

Der Schalter -f teilt dem Programm mit, welche Art von Datei erzeugt werden soll. Der Schalter -dialect sagt, dass die SQL-Engine von SQLite verwendet werden soll, um die Abfrage durchzuführen. Das Argument -sql ist die Abfrage. GEOMETRY und FID sind integrierte Feldnamen, die Sie in Ihrer Abfrage verwenden können.

Diese Abfrage wird jetzt extrem langsam sein, da kein Index vorhanden ist. Es wird versuchen, jeden Punkt mit jedem anderen Punkt abzugleichen. Mit der Dokumentation hier habe ich versucht, die Abfrage dazu zu bringen, einen räumlichen Index zu verwenden, aber es scheint nicht zu funktionieren und ich habe im Moment keine Zeit, mich damit zu beschäftigen.

Das Laden des gleichen Punktsatzes in SpatiaLite geht ungefähr so:

Spatialite> .loadshp Eingabe Eingabe UTF-8 2956 Spatialite> select createpatialindex('input', 'geometry'); Spatialite> Tabellenausgabe erstellen als select * from input a, input b where st_z(a.geometry)-st_z(b.geometry) < 200 und a.rowid<>b.rowid und a.rowid in (select rowid from Spatialindex f_table_name ="Stationen" und search_frame=b.geometry); Spatialite> .dumpshp Ausgabe 'Geometrie' Ausgabe UTF-8

Die erste Zeile lädt die shp-Datei, die zweite erstellt einen räumlichen Index, die dritte erstellt eine neue Tabelle aus der Abfrage und die vierte gibt die neue Tabelle in eine neue Datei aus. (Dokumente hier.)

Dies ist viel schneller als die ogr2ogr-Lösung (für mich).


Schau das Video: How to get Openstreetmap data in shapefile type (Oktober 2021).