Berechnung des nächsten Nachbarn in PostGIS?

8

Ich lerne, wie man PostGIS und räumliche Datenbanken für die Analyse verwendet. Ich versuche, eine Berechnung durchzuführen, um den Abstand für das nächste Polygon in einer Datei mithilfe der Kantenberechnung anstelle von Scheitelpunkten zu ermitteln.

Verwenden Sie diese Antwort von Paul Ramsey, um mithilfe von ArcGIS Desktop den Mindestabstand von Kante zu Kante von Polygonen zu ermitteln? Das ist eine ähnliche Frage:

TABELLE ERSTELLEN mytable_distances AS SELECT a.id, b.id, ST_Distance (a.geom :: geography, b.geom :: geography) als Abstand von mytable a, mytable b;

Ich versuche, es auf meine räumliche Datenbank anzuwenden. Ich verstehe die Struktur dieser Abfrage jedoch nicht. Ich denke, CREATE TABLE mytable_distances ASerstellt eine Tabelle, um das Ergebnis zu speichern, aber nach diesem Teil bin ich verloren. Sind aund bSpaltennamen? Wenn ja, warum sollte ich zwei Spalten angeben, um dies zu berechnen?

Meine Tabelle wird aufgerufen TestAreaund ich habe erfolgreich mit einigen grundlegenden Abfragen experimentiert:

SELECT 
  "TestArea".hgt
FROM 
  public."TestArea"
WHERE
  "TestArea".area > 100

Die Struktur der Datenbank in PGAdmin III ist wie folgt, wobei meine Tabelle aufgerufen wird TestArea. Ich bin mir nicht sicher, wie die Berechnung des nächsten Nachbarn unter Verwendung meiner Spaltenüberschriften aussehen soll (alle diese Objekte sind Polygone).

Geben Sie hier die Bildbeschreibung ein

djq
quelle

Antworten:

10

aund bsind Alias-Tabellennamen für dieselbe Tabelle. Dies ist effektiv eine T1 CROSS JOIN T2in DB-Sprache. Auf diese Weise kann ein Self-Join in einer einzelnen Tabelle angeben, wie nah ein Teil an einem anderen ist.

SELECT 
  a.hgt AS a_hgt,
  b.hgt AS b_hgt,
  ST_Distance(a.the_geom, b.the_geom) AS distance_between_a_and_b
FROM 
  public."TestArea" AS a, public."TestArea" AS b
WHERE
  a.gid < b.gid AND a.area > 100 AND b.area > 100

Möglicherweise möchten Sie eine weitere WHEREKlausel hinzufügen , um die Anzahl der Zeilen zu begrenzen, z. B. AND ST_Distance(a.the_geom, b.the_geom) < 1000.0so, dass alle Entfernungen weniger als einen Kilometer betragen (wenn Sie UTM projiziert haben).

Mike T.
quelle
Danke für deine Antwort Mike. Ich habe es benutzt und verstehe jetzt, was los ist. Vielleicht sollte ich dies als neue Frage stellen, aber gibt es eine Möglichkeit, die Berechnung zu optimieren? Wenn ich zum Beispiel 100 Polygone habe, sind das 10.000 Berechnungen. Ich habe zufällig 1.000.000 Polygone und frage mich, wie ich die Berechnung verkleinern kann.
DJQ
1
Genau deshalb habe ich den letzten ST_DistanceFilter in der WHEREKlausel eingeführt, um zu sagen, dass "wir keine Entfernungen zwischen etwas anderem über eine bestimmte Entfernung hinaus finden wollen". Hatten Sie erwartet, das [eine] nächstgelegene Gebiet zu einem anderen zu finden? Dies wäre in der Tat eine etwas andere Abfrage.
Mike T
Ich dachte, dies würde nur nicht die Werte über einem bestimmten Niveau aufzeichnen, sondern sie trotzdem berechnen. Daher meine nachfolgende Frage .... gis.stackexchange.com/q/11979/803
djq