Post by Stefan KellerSo, from your query it doesn't look like you want any interpolated opint at
all, just the distance (wich is calculated from a interpolated point behind
the scenes)
Exactly.
Post by Stefan KellerSecond and very important
Using KNN distance as you do will not always give you the right answer since
the <-> operator only works on the center of the bounding box, not the
geoemetry itself. So another geometry with the bbox-center much more far
away can come much closer than the one you have found. In this case it
happened to be the same and give correct result.
Many thanks. That seems to be the final solution
Nice blog.
ultimately only want the closest line (or id) and the distance.
-S.
Post by Stefan KellerHallo
ST_Distance(osm_line.way,ST_ClosestPoint(osm_line.way, mypt.geom))
there is two things with this, on warning and one error.
The error is that it should be
ST_Distance( mypt.geom,ST_ClosestPoint(osm_line.way, mypt.geom))
to get what you want. The way you wrote it you ask for thedistance from the
interpolated point on the line to the line which will be 0 in all cases.
The notice or warning is that you should instead write
ST_Distance( osm_line.way, mypt.geom)
It is the same thing and will be twice as fast since it is only doing the
calculation once instead of doing the exactly same thing twice.
ST_ClosestPoint is just one of the points that ST_Distance uses to get its
result. To get both points use ST_ShortestLine.
So, from your query it doesn't look like you want any interpolated opint at
all, just the distance (wich is calculated from a interpolated point behind
the scenes)
Then you can use ST_DWithin to speed up since ST_Dwithin can use spatial
indexes to do a first bounding box search.
Second and very important
Using KNN distance as you do will not always give you the right answer since
the <-> operator only works on the center of the bounding box, not the
geoemetry itself. So another geometry with the bbox-center much more far
away can come much closer than the one you have found. In this case it
happened to be the same and give correct result.
SELECT
ST_AsText(osm_line.way) AS geom,
ST_Distance(osm_line.way, mypt.geom) AS label
FROM osm_line,
(SELECT ST_Transform(ST_GeomFromText('POINT(8.8211 47.2221)',
4326), 900913) AS geom) AS mypt
ORDER BY ST_Distance(osm_line.way, mypt.geom)
LIMIT 1;
http://blog.jordogskog.no/2010/02/07/how-to-use-the-new-distance-related-functions-in-postgis-part1/
HTH
Nicklas Avén
Hi Michi,
Post by Stefan KellerPost by M***@dlr.deHey! What about ST_ClosestPoint
(http://postgis.refractions.net/documentation/manual-2.0/ST_ClosestPoint.html)?
Greets, Michi
That's it. but I got unexpected malfunctioning of the query which uses
SELECT
ST_AsText(osm_line.way) AS geom,
ST_Distance(osm_line.way,ST_ClosestPoint(osm_line.way, mypt.geom)) AS label
FROM osm_line,
(SELECT ST_Transform(ST_GeomFromText('POINT(8.8211 47.2221)',
4326), 900913) AS geom) AS mypt
ORDER BY ST_ClosestPoint(osm_line.way, mypt.geom) <-> mypt.geom
LIMIT 1
-- Solution with ST_Distance => wrong result. linestring is far away :-<
SELECT
ST_AsText(osm_line.way) AS geom,
ST_Distance(osm_line.way,ST_ClosestPoint(osm_line.way, mypt.geom)) AS label
FROM osm_line,
(SELECT ST_Transform(ST_GeomFromText('POINT(8.8211 47.2221)',
4326), 900913) AS geom) AS mypt
ORDER BY ST_Distance(osm_line.way,ST_ClosestPoint(osm_line.way, mypt.geom))
LIMIT 1
You can reproduce that in http://labs.geometa.info/postgisterminal .
Simply paste it into the Query textarea.
Here's 'mypoint'
SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(8.8211
47.2221)', 4326), 900913)) as geom, 'XXX' AS label
LIMIT 1
-S.
Post by M***@dlr.de-----Ursprüngliche Nachricht-----
Gesendet: Mittwoch, 23. Januar 2013 03:25
An: PostGIS Users Discussion
Betreff: [postgis-users] Nearest linestring given a point, a tolerance and a set
of linestrings?
What is the nearest interpolated point on a linestring given a single point, a
tolerance (say 100m) and a set of linestrings (i.e. a table called myways with
linestring geometry column); return way/linestring id and distance?
It's a use case similar to snapping or to a navigation system where you have a
point and a set of lines.
I found hints to ST_Line_Interpolate_Point and ST_Line_Locate_Point but
theses posts/blogs are rather outdated and I'm not sure if KNN index would
do the job better?
- S.
_______________________________________________
postgis-users mailing list
http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
_______________________________________________
postgis-users mailing list
http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
_______________________________________________
postgis-users mailing list
http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
_______________________________________________
postgis-users mailing list
http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users