2017-05-17 7 views
0

Ich habe einen Punkt auf der Linie mit zwei Polygonen auf beiden Seiten. Das Szenario wird im Folgenden gezeigt:Orthogonal Abstand zwischen Polygonen in PostGIS

Point on line scenario

Nun würde Ich mag den senkrechten Abstand zwischen zwei Polygone berechnen (beispielsweise gelbe Linie) unter Verwendung einer PostGIS Abfrage. Ich habe mich gefragt, ob mir jemand vorschlagen könnte, wie ich das mache?

EDIT1:

Above bestimmten Szenario war ein Beispiel. In Szenarien mit Straßen, Punkten und Polygonen kann es zu Komplikationen kommen. Zum Beispiel ist die Seite parallel zur Straße möglicherweise nicht immer da.

Scenario_2:

Scenario_2

Scenario_3:

Scenario_3

EDIT2

Scenario_4

Scenario_4

Ich möchte nur den senkrechten Abstand berechnen, wo ein Punkt dort auf der Leitung ist. Ich verstehe, dass es Ausnahmen geben kann, als Punkt von @JGH.

+0

Mit Ihrem Punkt finden Sie den [Abstand vom Punkt zu den Polygonen] (https://gis.stackexchange.com/questions/86079/distance-between-polygon-and-point) – JGH

+0

Vielen Dank für Ihren Vorschlag. Ich möchte die Straßenbreite tatsächlich berechnen (der senkrechte Abstand zwischen zwei Gebäudepolygonen). Ihr Vorschlag funktioniert möglicherweise in diesem Beispielszenario, das heißt, ich kann ST_Distance() verwenden und beide Entfernungen hinzufügen, um die Straßenbreite zu erhalten, aber in großen Dataset wird es problematisch sein. Ist es nicht? –

+0

Haben Sie einen Punkt vor jedem Polygon? Haben alle Polygone eine Seite parallel zur Straße? Wenn die Antwort für beide Fragen Ja ist, wird der Vorschlag funktionieren.Beachten Sie, dass Sie, wie für alle Jobs, die sich auf Straßen beziehen, bereit sein sollten, einige Ausnahmen zu behandeln – JGH

Antwort

1

Unter der Annahme, dass Ihre Daten projiziert werden und der Abstand zwischen den Punkten und dem nächsten Polygon der gesuchte ist, können Sie den Abstand von jedem Punkt zu den zwei Polygonen berechnen und die Summe berechnen.

1) Berechnen Sie den Abstand. Beschränken Sie die Suche auf eine angemessene Entfernung, vielleicht zweimal die erwartete größte Entfernung. Stellen Sie sicher, dass die Geometrien indiziert sind !!

SELECT pt.gid point_gid, plg.gid polygon_gid, ST_Distance(pt.geom, plg.geom) distance 
    FROM pointlayer pt, polygonlayer plg 
    WHERE ST_Distance(pt.geom, plg.geom) < 50 
    ORDER BY pt.gid, ST_Distance(pt.geom, plg.geom); 

2) Für jeden Punkt, erhalten die beiden am nächsten Polygone mit der partition function

SELECT 
    point_gid, polygon_gid, distance 
FROM (
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY point_gid ORDER BY distance asc) AS rank, 
    t.* 
    FROM 
    [distanceTable] t) top_n 
WHERE 
    top_n.rank <= 2; 

3) Agregate das Ergebnis und zu verfolgen, welche Polygone verwendet wurden

select point_gid, 
     sum(distance) streetwidth, 
     string_agg(polygon_gid || ' - ' || distance,';') polyid_dist_info 
from [top_2_dist dst] 
group by dst.point_gid; 

Alle zusammen :

SELECT 
    point_gid, 
    sum(distance) streetwidth, 
    string_agg(polygon_gid || ' - ' || distance,';') polyid_dist_info 
FROM (
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY point_gid ORDER BY distance asc) AS rank, 
    t.* 
    FROM 
    (SELECT pt.gid point_gid, 
      plg.gid polygon_gid, 
      ST_Distance(pt.geom, plg.geom) distance 
     FROM pointlayer pt, polygonlayer plg 
     WHERE ST_Distance(pt.geom, plg.geom) < 50 
    ) t 
) top_n 
WHERE 
    top_n.rank <= 2 
GROUP BY point_gid; 
+0

Nun, vielen Dank. Dein Code hat funktioniert! Bitte schauen Sie sich Szenario 4 an. Die ursprüngliche Straßenbreite ist 11,3, die durch eine rote Linie markiert ist, aber der Code gibt mir 41,0 Meter, was auch gemäß Ihrer vorherigen Warnung (Umgang mit Ausnahmen) sinnvoll ist. Ich würde gerne Ihren vorgeschlagenen Code als eine Lösung akzeptieren, aber was würden Sie vorschlagen, um obige Ausnahme in Szenario 4 anzusprechen? –

+1

Für Ausnahmen ist es wichtiger, sie zu erkennen, als sie nach Code zu korrigieren. Für Szenario 4 könnten Sie den Abstand zwischen den zwei Polygonen und Flag-Einträgen vergleichen, bei denen sich die beiden Entfernungen um mehr als X% unterscheiden (in Ihrem Screenshot erscheint ein Verhältnis von 1: 6). Ansonsten zeichne einen Puffer anhand der gefundenen Entfernung um jeden Punkt und untersuche die größeren Polygone visuell. – JGH

+0

+1 für Ihren ersten Vorschlag. Ich könnte die CASE-Anweisung verwenden, um in solchen Fällen Ausnahmen hinzuzufügen. Bezüglich des zweiten Vorschlags wäre es in Ordnung, die Ergebnisse visuell zu untersuchen, aber für eine große Anzahl von Polygonen könnte es zeitaufwendig sein. –