Berechnung aller Abstände von einzelnen Punkten zu mehreren Polygonen [geschlossen]

9

Ich habe zwei Ebenen: eine Punktebene, die Eigenschaften definiert (95 Objekte), und eine Polygonebene, die mit den Eigenschaften verknüpfte Grundstücke definiert (211 Objekte). Jeder Punkt bezieht sich auf ein oder mehrere Polygone. Was ich erstellen möchte, ist eine Tabelle mit Abständen jedes Punkts zu ALLEN Polygonen, die diesem Punkt zugeordnet sind (nächste Kante oder Schwerpunkt des Polygons - beides reicht aus). Die Berechnung der nächstgelegenen Entfernung ist in QGIS und ArcGIS relativ einfach, aber bei diesen Berechnungen werden alle entfernten Polygone weggelassen, zumindest nach den von mir verwendeten Methoden. Idealerweise möchte ich eine Ausgabe von

Point_ID | distance to polygon 1 | distance to polygon 2 | distance to polygon 3 | etc.

Alle Zeiger in ArcGIS 10 oder QGIS 2.2+ wären am hilfreichsten.

NickN
quelle
Dies kann mit einer Nahanalyse in ArcGIS durchgeführt werden. Um dies jedoch für jeden Punkt zu tun, ist ein wenig Automatisierung erforderlich. Kennen Sie sich mit Python-Skripten aus?
Emil Brundage
Emil - Nein, ich kenne Python nicht, aber vielleicht sollte ich es lernen.
NickN

Antworten:

1

Sie können die Distanzmatrix in QGIS verwenden, um dies zu erreichen. Sie müssen Ihre Polygone zunächst entweder mit Vektor > Geometrie-Tools > Polygon-Schwerpunkte oder über die SAGA-Version von Polygon-Schwerpunkten in Schwerpunktpunkte konvertieren . Grund dafür ist, dass die Distanzmatrixfunktion nur zwischen 2 Punktebenen analysieren kann. Die Ausgabe würde auch so aussehen:

Point_1 | PolygonCentroid_1 | Distance
Point_1 | PolygonCentroid_2 | Distance
Point_1 | PolygonCentroid_3 | Distance
Point_2 | PolygonCentroid_1 | Distance
Point_2 | PolygonCentroid_2 | Distance

Die Ausgabe wäre eine CSV-Datei, sodass Sie das Layout manuell mit einer anderen Software wie Microsoft Excel bearbeiten können.

Joseph
quelle
Danke Joseph - Für einen GIS-Neuling wie mich ist dies der einfachste Weg, die gewünschten Antworten zu erhalten.
NickN
Herzlich willkommen Kumpel! Dieses Verfahren (und die Ergebnisse) sind grundlegend. Wenn Sie sich jedoch mit der GIS-Software vertraut gemacht haben, können Sie versuchen, erweiterte Verfahren zu verwenden, die in den anderen Antworten beschrieben werden.
Joseph
1
@nickN Nur eine sehr kleine Anmerkung zu dieser Methode: Zentroide fallen je nach Form nicht immer in ein Polygon. Es ist möglich, dass Sie falsche Entfernungen / Ranglisten erhalten, aber es hängt von Ihren Daten und Anforderungen ab, ob dies ein Problem darstellt. Ansonsten ist dies im Wesentlichen die QGIS-Version von ArcGISs GNT, außer dass letztere mehr als Punkte verarbeiten kann und ich nicht sicher bin, wie QGIS mit den Namen / IDs im Ergebnis umgeht.
Chris W
5

Dies ist mit QGIS (ich denke, jede Version wird es tun) und einer sehr einfachen SQL-Anweisung im DB-Manager ziemlich einfach zu erreichen. Aber dafür muss sich das in einer Art räumlicher Datenbank befinden (Postgis oder Spatialite). Da es für die meisten Menschen zugänglicher ist, gehe ich von der Verwendung von Spatialite aus, aber die SQL-Anweisungen sind für Postgis identisch.

  1. Erstellen Sie eine neue Spatialite-Datenbank.
  2. Importieren Sie Ihre Punkt- und Polygonebenen in die neue Datenbank.
  3. Öffnen Sie das DB Manager-Plugin, wählen Sie die Datenbank aus und führen Sie eine der folgenden SQL-Anweisungen aus:

Abstand von allen Punkten zu allen Polygongrenzen

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f, 
  polygons_table AS g

Abstand zu allen Punkten zu verwandten Polygongrenzen (unter der Annahme, dass ein gemeinsames Feld existiert)

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Abstand zu allen Punkten zu verwandten Polygonschwerpunkten :

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Beachten Sie, dass Sie dem Ergebnis ein beliebiges Feld aus Ihren Ebenen hinzufügen können:

SELECT 
  f.point_id,
  f.point_number,
  g.polygon_id,
  g.parcel_name,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Oder sogar alle Felder:

SELECT 
  f.*,
  g.*,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)
Alexandre Neto
quelle
Wenn Sie weitere Informationen zum Erstellen der Spatialite-Datenbank und zum Importieren der Ebene benötigen, lassen Sie es mich wissen, und ich werde die Antwort bearbeiten.
Alexandre Neto
Hallo Alexandre, warum mitmachen und nicht einfach WO?
Luigi Pirelli
Das habe ich aus einer Präsentation von Paul Ramsey mitbekommen. Ich kann mich nicht an den Grund erinnern, warum er die explizite Verwendung von Join befürwortet, aber wenn er es sagt ...: -PI wird versuchen, EXPLAIN über beide Abfragen auszuführen, um festzustellen, ob es einen Unterschied gibt.
Alexandre Neto
Ich bin neu bei SpatialLite - diese Antwort scheint ein Problem zu lösen, an dem ich arbeite. Mein Tisch ist leer. Vielleicht verstehe ich das nicht. Ich habe eine Polygonebene namens "Pothole VRI" und eine weitere Punktebene namens "Grid Pothole Center". Ich füge den folgenden Code unter Verwendung Ihrer Anweisungen wie oben hinzu: SELECT f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) AS Abstand VON 'Grid Pothole Center' AS f, 'Pothole VRI' AS g __ Ich erhalte eine leere Tabelle x mit folgenden Überschriften: id, id: 1, distance Was habe ich hier falsch gemacht? Verwenden von QGIS 3.6
Mark Thompson
4

Das Werkzeug " Nahe Tabelle generieren" in ArcGIS macht das, was Sie wollen, erfordert jedoch eine erweiterte Lizenz und dies für alle Punkte / Polygone - nicht nur für die miteinander verknüpften. Dies bedeutet, dass Sie für jedes Ihrer 95 Objekte den Rangabstand für alle 211 Eigenschaften erhalten, also 20.045 Zeilen in der Tabelle. Sie müssten entweder die resultierende Tabelle filtern oder, wie Emil vorschlägt, die Aufgabe automatisieren, um Auswahlen basierend auf der Zuordnung zu erstellen und sie nur für diese Gruppen auszuführen.

Was das Filtern betrifft, ist ein Join (gefolgt von einer Definitionsabfrage oder -auswahl) alles, was Sie benötigen. Das Tool-Ergebnis gibt Ihnen IN_FID und NEAR_FID. Abhängig davon, wie Sie das Tool ausführen (Eigenschaften in der Nähe des Punkts oder Punkt in der Nähe der Eigenschaft), bestimmen Sie, welche FID welche ist. Sie würden dann Ihre Punkt- und Eigenschaftstabellen (beide) basierend auf der entsprechenden FID mit dem Werkzeugergebnis verknüpfen.

Dies setzt voraus, dass jeder Ihrer 211 Eigenschaftsdatensätze ein Attribut hat, das angibt, zu welchem ​​der 95 Punkte sie gehören, da der nächste Schritt darin besteht, alle Datensätze in den verbundenen Tabellen auszuwählen (oder zu definieren), in denen zwei Felder eines Datensatzes enthalten sein sollen match - point name field = eigenschaftsassoziiertes Punktnamenfeld. Die Fälle, in denen sie nicht übereinstimmen, sind Polygone, die diesem Punkt nicht zugeordnet sind. Sie kümmern sich also nicht um ihre Entfernung von diesem Punkt.

Chris W.
quelle