Ich benutze PostGIS, um die nächsten Nachbarn von Polygonen zu berechnen. Was ich berechnen möchte, ist der Mindestabstand von jedem Polygon zum nächsten Polygon.
Bisher hat mir die Antwort von Mike Toews (die ich mit einer kleinen Änderung zitiere) hier sehr geholfen :
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.hgt != b.hgt AND ST_Distance(a.the_geom, b.the_geom) < 400
Dann habe ich das Minimum berechnet:
SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt
Meine Herausforderung besteht jedoch darin, dies für eine große Anzahl von Polygonen (1.000.000) zu berechnen. Da die obige Berechnung jedes Polygon mit jedem anderen Polygon vergleicht, habe ich mich gefragt, wie ich die Berechnung verbessern kann, damit ich keine 10 ^ 12-Berechnungen durchführen muss.
Ein Gedanke, den ich hatte, war, jedes Polygon zu puffern und dann die nächsten Nachbarn aller Werte innerhalb des Puffers für dieses Polygon zu berechnen und das Minimum aufzuzeichnen. Ich bin mir nicht sicher, ob dies der beste Ansatz ist oder ob es eine Funktion in PostGIS gibt, die ich verwenden sollte.
EDIT: Mit einem von Nicklas 'Vorschlägen experimentiere ich mit ST_Dwithin()
:
CREATE TABLE mytable_withinRange AS SELECT
a.hgt AS a_hgt,
b.hgt AS b_hgt,
ST_DWithin(a.the_geom, b.the_geom, 400)
FROM
public."lon_TestArea" AS a, public."lon_TestArea" AS b
Dies gibt eine Tabelle mit der ID jedes Polygons zurück und ob es sich innerhalb einer bestimmten Entfernung befindet oder nicht. Ist es möglich, eine IF/ELSE
Typanweisung mit SQL zu erstellen? (Ich habe Informationen zur Verwendung der CASE
Bedingung erhalten.) Oder sollte ich versuchen, die von mir erstellte Tabelle mit der Originaltabelle zu verbinden und die Abfrage dann erneut mit ST_Distance auszuführen?