[FOSSGIS-Talk] QGIS 3.18.1: Nächster Nachbar

Bernd Marcus bmarcus at giswana.de
Di Apr 13 17:44:07 CEST 2021


Aufgrund eines aktuellen Projektes „durfte“ ich mich nun auch mit 
nächsten Nachbarn beschäftigen. Somit kam die Anfrage von Michael 
ganz gelegen, um sich der Sache einmal intensiver zu widmen. 

Der Vermutung von Thomas, dass es sich um Punktlayer bei Michaels 
Problem handelt, kann ich mich nur anschließen, da schließlich auch 
die Punkt basierte Distanzmatrix zum Einsatz kam. Jedoch kann ich 
beim Einsatz von Punktlayern keine Unterschiede in den Ergebnissen 
zwischen der Funktion 'Abstand zum nächsten Knoten (Linie zu 
Knoten)' und der Hub Analyse vom MMQGIS Plugin feststellen.

Bei mir dienten jedoch sowohl Polygone wie auch Linien als 
Datengrundlage und da sah die Sache schon gleich ganz anders aus. 
Bei Verwendung von zwei Polygonlayern kam es tlws. zu erheblichen 
Abweichungen.
 
Wie der Name von 'Abstand zum nächsten Knoten (Linie zu Knoten)' 
schon sagt, wird eine Linie zwischen Knoten gebildet. Doch während 
sich die Hub-Tools von MMQGIS auf den Zentroiden stützen, berechnet 
'Abstand zum nächsten Knoten (Linie zu Knoten)' einen anderen Punkt 
innerhalb der Ausdehnung der Eingangspolygone (bbox). Ein Grund, 
warum es zu Abweichungen kommen kann.

In der Abbildung im Anhang (siehe Link unten) wird die Lage der 
Verbindungsknoten inkl. "Hub-Verhalten" veranschaulicht. Weiße 
Kreise zeigen die Zentroide der Polygone an. Die roten Flächen 
stellen die Naben dar (mit Zahlenangabe), blau die Speichen (mit 
Buchstabenkennzeichnung), um im Hub-Jargon zu bleiben. Rot-
gestrichelte Linien mit Distanzangabe unterhalb entsprechen dem 
'Abstand zum nächsten Knoten (Linie zu Knoten)' und die orange-
gestrichelten mit Distanzangabe oberhalb der Hub-Berechung mit 
MMQGIS. Als Zusatz kommen noch die grünen Linien mit Distanzangabe 
auf der Linie ins Spiel: diese resultieren aus einer Berechnung mit 
der räuml. SQL-Funktion 'ST_Shortest_Line()'.

Spätestens bei der abgegriffenen Flächenkombination 4e lassen 
Zweifel an der Zuverlässigkeit der Funktion 'Abstand zum nächsten 
Knoten (Linie zu Knoten)' beim Einsatz mit Polygonen aufkommen. 
Während die berechnete Verbindungslinie von 4 auf e eine Distanz von 
knapp 3274m aufweist, misst das Messen-Werkzeug zwischen 2 und e 
eine kürzere Entfernung von 2997m zwischen den berechneten Knoten 
der Funktion.

Die von Thomas ins Feld geführte Funktion 'Attribute nach nächstem 
verknüpfen' liefert die gleichen Flächenpaarungen mit gleicher 
Entfernung wie 'ST_Shortest_Line()'. Allerdings werden keine Linien, 
sondern die Eingangspolygone mit neuen Attributen erstellt. Geht man 
den vorgeschlagenen Weg mit 'Durch Linien verbinden' weiter, so 
erhält man Verbindungslinien, die den jeweiligen 'Punkt auf 
Oberfläche' als Start- bzw. Endpunkte haben, also nicht die kürzeste 
Linie zwischen den Polygongrenzen. 

Wer allerdings die Verbindungslinie zwischen den Polygonen benötigt, 
kann sich diese über die neuen Attribute 'feature_x/y' und 
'nearest_x/y' selbst mit dem Geometrie-Generator zusammenbauen. Was 
für ein Umstand.
 
Zuverlässig und einfacher und auch in ein Modell-„Workflow“ 
integrierbar geht‘s mit 'SQL-Anweisung ausführen' (QGIS Version, 
nicht gdal). Die beiden Eingangslayer auswählen (Geometrietyp spielt 
keine Rolle) und folgenden Code in den Editor eintragen:
--Code-Start>

select a.pk, b.pk, 
min(st_distance(a.geometry, b.geometry)) as laenge, 
st_shortestLine(a.geometry, b.geometry) as geom 
from input1 as a, input2 as b 
group by a.pk

--Code-ende<

Erklärung: es werden die ID-Spalten („pk“ ) beider Eingangslayer, 
die minimal kürzeste Distanz zwischen zwei Geometrien und die 
kürzesten Linien zwischen den Eingangslayern selektiert und nach der 
Objektkennung des als Speichen fungierenden Layers gruppiert, so 
dass nur eine Linie von jedem Objekt des Speichenlayers 
zurückgegeben wird. 

Hierbei ist auf die Reihenfolge der Eingangslayer zu achten, da 
diese im Editor über „inputX“ angesprochen werden. Liegt der 
Nabenlayer in der Mehrfach-Layerauswahl über dem Speichenlayer, so 
ist der Alias (durch 'as' deklariert) zu vertauschen, ergo: 
from input1 as b, input2 as a.

Der Name der ID und der Geometriename müssen entsprechend angepasst 
werden. Für ID wird meist fid (gpkg), ogc-fid, pk (beide Spatialite) 
verwendet. Viele Shape-Dateien kommen ohne ID daher, also nach gpkg 
oder Spatialite umwandelt.

Weitere benötigte Attribute können direkt im Code eingebunden 
werden. Wer sich mit SQL jedoch nicht auskennt, kann im Nachgang 
über die Objektkennungen weitere Attribute verknüpfen.
Ein gewichtiger Vorteil bei diesem SQL basierten Ansatz besteht in 
der Unabhängkeit gegenüber dem Geometrietypen. Linien und Flächen 
werden genauso zuverlässig abgegriffen wie Punktgeometrien. Zudem 
lassen sich benötigte Attribute direkt einbinden (SQL-Kenntnisse 
vorausgesetzt).

Grüße

Bernd


Am Freitag, 9. April 2021, 12:00:02 CEST schrieb fossgis-talk-liste-
request at fossgis.de:

> Meldungen des Tages:
> 
>    1. Re:  QGIS 3.18.1: Nächster Nachbar (Thomas B)

> Hallo auch,
> um mal kurz meinen "Senf" dazuzugeben:
> 
> Warum die Algorithmen unterschiedliche Ergebnisse liefern ist 
> "aus der Ferne" schwer zu sagen.
> 
> Ist denn der räumliche Index der Layer aktuell?
> Je nachdem ob der jeweilige Algorithmus selbst einen erzeugt oder
> den bestehenden nutzt könnte ein nicht korrekter räumlicher Index
> eventuell Probleme machen.
> 
> ( Da ich vermute, dass beides Punktlayer sind dürfte auch die Art
> der Entfernungsmessung nicht ins Gewicht fallen. Der Algorithmus
> "Abstand zum nächsten Knoten" misst ja die kürzeste Entfernung
> explizit zum Zentrum eines Objektes, was z.B. bei einem
> Ziel-Polygon einen Unterschied macht zur kürzesten Distanz zum
> nächsten Punkt auf dem äußeren Ring. )
> 
> Aber genug der Kaffeesatz-Leserei.
> 
> Es gibt in QGIS 3.18 ja noch die Algorithmen "Attribute nach
> nächstem verknüpfen" und analog zum MMQGIS-Plugin einen
> Algorithmus "Durch Linien verbinden".
> Vielleicht klappt es mit einem der beiden Algorithmen besser?
> 
> Grundsätzlich könnte man das MMQGIS-Plugin schon auch abseits der
> GUI ansprechen aber das fände ich relativ kompliziert, da man
> dann ja manuell alle möglichen Parameter mit übergeben muss.
> 
> Von der Syntax her wäre das grob:
> 
> 
> from mmqgis.mmqgis_library import mmqgis_hub_lines
> 
> mmqgis_hub_lines( notwendige Argumente hier... )
> 
> # 8 benötigte Parameter der Funktion:: 'hub_layer',
> 'hub_name_field', 'spoke_layer', 'spoke_hub_name_field',
> 'allocation_criteria', 'distance_unit', 'output_geometry' und
> 'output_file_name'
> 
> 
> Viele Grüße,
> Thomas
> 
> 
> 
> Am Do., 1. Apr. 2021 um 20:00 Uhr schrieb Dr. Michael Hälsig <
> 
> michael.haelsig at online.de>:
> > Hallo,
> > ich habe Oberzentren und Mittelzentren, und möchte die
> > Mittelzentren an das
> > nächstliegende Oberzentrum anbinden.
> > 
> > Der Algorithmus 'Abstand zum nächsten Knoten (Linie zu Knoten)'
> > aus der Werkzeugkiste liefert auch *weitgehend* passende
> > Ergebnisse, der Algorithmus 'Distanzmatrix' mit k=1 das gleiche
> > - weitgehend passende- Ergebnis. Allerdings sind einige
> > Mittelzentren an weiter entfernte Oberzentren
> > angebunden, was ich nicht verstehe. Es geht um Distanzen von
> > 1.400 und 1.900
> > m, kann also nicht an Rundungsfehlern oder unterschiedlicher
> > Distanzberechnung
> > liegen.
> > 
> > Der Algorithmus 'Create Hublines / Distance' aus dem Plugin
> > MMQGIS liefert mir
> > *genau* das richtige Ergebnis. Er hat allerdings den Nachteil
> > für mich, dass
> > ich ihn nicht in einen Workflow, wie die anderen Algorithmen,
> > einbinden kann.
> > 
> > ==> Wieso liefern die Algorithmen unterschiedliche Ergebnisse?
> > Was übersehe
> > ich - oder wo schaue ich nicht genau hin?
> > 
> > ==>  Gibt es (alternativ) eine einfache Möglichkeit, den 'Create
> > Hublines' Algorithmus aus MMQGIS in einen Workflow einzubinden?
> > 
> > Vielen Dank für Tipps!
> > Michael Hälsig
> > 
> > --
> > Dr. Michael Hälsig
> > Diefenbachstr. 9
> > 81479 München
> > 
> > Tel: +49 89 79 199 563
> > Mobil: +49 171 333 7558
> > 
> > 
> > --
> > ................................................................
> > .... 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_eV
> > 
> > ________________________________________________________________
> > ____ FOSSGIS-Talk-Liste mailing list
> > FOSSGIS-Talk-Liste at fossgis.de
> > https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
> 
> ------------------------------
> 
> Subject: Fusszeile der Nachrichtensammlung


-- 
Ihnen eine gute Zeit

Bernd Marcus
__________________________________

GISwana - Datentektonik

Am Steneberg 10 | D-37133 Friedland

T: +49 (0)5504 949 844 7
M: +49 (0)176 816 991 64
@: bmarcus at giswana.de
U: https://www.giswana.de/
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : vergleich_QGISknotenabstand_MMnearestHub_SQLshortestLine.png
Dateityp    : image/png
Dateigröße  : 79798 bytes
Beschreibung: nicht verfügbar
URL         : <http://lists.fossgis.de/pipermail/fossgis-talk-liste/attachments/20210413/39da61f1/attachment.png>


Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste