Ich benutze PostGIS schon lange, musste aber nie die LINESTRING
Geometrie verwenden ...! :)
Folgendes möchte ich tun: Ich habe eine Tabelle mit Linienfolgen (die Straßen einer bestimmten Stadt darstellen, SRID 3395) und möchte die nächsten Linienfolgen zu einem bestimmten Punkt finden (GPS-Position, SRID 4326).
Die Lösung, die ich gefunden habe, besteht darin, alle Linienfolgen in meinem Punkt mithilfe der expand()
Methode auszuwählen und den Abstand zwischen den einzelnen Linienfolgen und meinem Punkt mithilfe der ST_Distance()
Methode zu bestimmen .
Hier ist die SQL:
SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;
Die Ergebnisse sehen gut aus, aber ich habe das Gefühl, dass etwas in meiner Implementierung nicht stimmt.
1) Glaubt ihr, dass die expand()
alle betroffenen Linestrings bekommen können?
2) Glaubt ihr, das ST_Distance()
ist die richtige Methode? Ich denke, ich mache es falsch, da die Entfernung, die ich erhalten möchte, die kleinste Entfernung zwischen dem Punkt und meiner Linie ist und nicht die Entfernung zwischen dem Punkt und einem der Punkte der Linienfolge.
Illustration:
Hallo
Zuerst die Frage, was ST_Distance zurückgibt. ST_Distance gibt den kürzesten Abstand zwischen der Linie und dem Punkt zurück (oder welche Geometrietypen eingegeben werden). Dies bedeutet, dass ST_Distance zwischen Punkt (1 3) und Linienfolge (0 0,0 10) 1 zurückgibt. Der Abstand zwischen wird nicht gemessen Punkt und (0 0) oder Punkt und (0 10), aber von Punkt (1 3) bis (0 3).
Soweit ich weiß, gibt Ihnen ST_Distance die gewünschte Antwort.
Wenn Sie den Punkt (0 3) im obigen Beispiel finden möchten, können Sie ST_Closestpoint verwenden, wenn Sie PostGIS 1.5 haben. In meinem Beispiel verwenden Sie ihn wie folgt: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometry, ' POINT (1 3) ':: geometry), dann sollten Sie den Punkt (0 3) zurückgeben, den Punkt auf der Linie, der Ihrem Punkt am nächsten liegt.
HTH Nicklas
quelle
Ich habe es gefunden :) (Nun, ich denke: P)
Mit
ST_Line_Locate_Point()
und habeST_Line_Interpolate_point()
ich es geschafft, einen Punkt zu erhalten, der NICHT Teil der LINESTRING-Definition ist, sondern auf der besagten Linie.Die
ST_Line_Locate_Point()
Methode ermittelt die Position des nächstgelegenen Punkts auf der Linie zu dem angegebenen Punkt. DieST_Line_Interpolate_Point
Methode wandelt diese Position in einen Punkt um.quelle
ST_Distance(geometry g1, geometry g2)
Dieser Postgis-Archiv-Thread kann Ihnen antworten: http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html
quelle