Я давно использую PostGIS, но никогда не использовал LINESTRING
геометрию ...! :)
Вот что я хотел бы сделать: у меня есть таблица линий линий (представляющих улицы данного города, SRID 3395), и я хотел бы найти ближайшие строки линий к данной точке (позиция GPS, SRID 4326).
Решение, которое я нашел, состоит в том, чтобы выбрать все линии линий в моей точке, используя expand()
метод, и определить расстояние между каждой строкой и моей точкой, используя ST_Distance()
метод.
Вот 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;
Результаты, которые я получаю, выглядят нормально, но я чувствую, что что-то не так в моей реализации.
1) Вы, ребята, думаете, что expand()
можете получить все заинтересованные строки?
2) Ребята, вы считаете, что ST_Distance()
это правильный метод? Думаю, я делаю это неправильно, поскольку расстояние, которое я хотел бы получить, - это наименьшее расстояние между точкой и моей линией, а не расстояние между точкой и одной из точек линейной линии.
Иллюстрация:
алло
Сначала вопрос о том, что возвращает ST_Distance. ST_Distance возвращает кратчайшее расстояние между линией и точкой (или какие типы геометрии вводятся). Это означает, что ST_Distance между точкой (1 3) и линией строк (0 0,0 10) вернется 1. Расстояние не будет измерено между точка и (0 0) или точка и (0 10), но из точки (1 3) в (0 3).
Итак, насколько я понимаю, ST_Distance дает вам ответ, который вы хотите.
Если вы хотите найти точку (0 3) в приведенном выше примере, вы можете использовать ST_Closestpoint, если у вас есть PostGIS 1.5. Для моего примера вы используете его следующим образом: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometry, ' ТОЧКА (1 3) ':: geometry) тогда вы должны получить взамен точку (0 3), точку на линии, которая ближе всего к вашей точке.
HTH Никлас
источник
Я нашел это :) (Ну, я думаю: P)
С помощью
ST_Line_Locate_Point()
иST_Line_Interpolate_point()
мне удалось получить точку, которая НЕ является частью определения LINESTRING, но находится на указанной линии :) Все, что мне нужно сделать, это получить расстояние от моей точки до этой точки, и все готово.ST_Line_Locate_Point()
Способ найти местоположение ближайшей точки на линии в данной точке, тоST_Line_Interpolate_Point
способ превратить это место в точку.источник
ST_Distance(geometry g1, geometry g2)
Эта ветка архивов Postgis может ответить вам http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html
источник