如何获得线串上最接近给定点的点?


28

我已经使用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()正确的使用方法是吗?我想我做错了,因为我想得到的距离是点与线之间的最小距离,而不是点与线串中的点之一之间的距离。

插图:

替代文字

Answers:


11

广告1)查看您使用的函数的文档时,我会说:“是的,将找到所有相关的线串。”

展开(几何,浮动)

此函数返回一个边界框,该边界框从输入几何的边界框向所有方向扩展第二个参数中指定的数量。对于distance()查询非常有用,可以向查询添加索引过滤器。

A && B

“ &&”运算符是“重叠”运算符。如果A的边界框与B的边界框重叠,则运算符返回true。

广告2)您应该可以通过以下方式实现所需的目标:

line_interpolate_point(linestring, line_locate_point(LineString, Point))

line_interpolate_point(线串,位置)

沿线插入点。第一个参数必须为LINESTRING。第二个参数是一个介于0和1之间的float8,代表该点必须位于的总2d长度的一部分。

line_locate_point(LineString,Point)

返回介于0和1之间的浮点数,表示LineString上与给定Point点最近的点的位置,以总2d线长的一部分表示。您可以使用返回的位置提取一个点(line_interpolate_point)

资料来源:http : //main.merlin.com.ua/doc/postgis/docs/ch06.html


对于第2点),我只是想知道POINT几何图形和LINESTRING几何图形之间的ST_Distance是否给出这些图形之间的最小距离(又称POINT和LINGESTRING之间的垂直线的长度);我确实希望与每个LINESTRING几何体保持距离:)
Vivi 2010年

而且我猜这不是我要寻找的距离,因为“ line_locate_point函数为您提供0到1之间的值,代表LineString上与给定点最近的点的位置”:/
Vivi

恐怕您在最近的评论中迷失了我。现在我不确定了你想要什么;)
昏暗

1
抱歉:)我想这样:给一个LINESTRING几何图形(表示一个路径)和一个POINT几何图形,我想拥有路径上最近的POINT几何图形(可能不是LINESTRING几何图形定义的一个点)。清楚吗?也许我应该用绘图更新我的帖子:D
Vivi 2010年

我无法更新自己的帖子,因此,这是我想要得到的图片的链接:i.imgur.com/UwPxo.jpg
Vivi

7

哈罗

首先是有关ST_Distance返回什么的问题。ST_Distance返回线与点之间的最短距离(或输入了哪些几何类型),这意味着点(1 3)与线串(0 0,0 10)之间的ST_Distance将返回1。点和(0 0)或点和(0 10),但从点(1 3)到(0 3)。

因此,据我了解,ST_Distance可为您提供所需的答案。

如果要在上面的示例中找到点(0 3),则可以在拥有PostGIS 1.5的情况下使用ST_Closestpoint。对于我的示例,可以这样使用它:ST_Closestpoint('LINESTRING(0 0,0 10)':: geometry,' POINT(1 3)':: geometry),那么您应该得到点(0 3)作为回报,该点是线上最接近您的点的点。

HTH尼克拉斯


5

我找到了:)(好吧,我猜:P)

使用ST_Line_Locate_Point()ST_Line_Interpolate_point()我设法得到一个点,该点不是LINESTRING定义的一部分,而是在所述行上:)我要做的就是获取从我的点到该点的距离,然后完成。

SELECT AsText(ST_Line_Interpolate_Point(myLineGeom,ST_Line_Locate_Point(myLineGeom,ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395))))
FROM myLines
WHERE myGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)

ST_Line_Locate_Point()方法找到直线上与给定点最接近的点的位置,该ST_Line_Interpolate_Point方法将该位置变成一个点。


1
点和线之间的St_distance将给您相同的答案。为什么您认为必须这样做?
NicklasAvén13年

1
我认为ST_Distance可以与任何几何类型一起使用。postgis.refractions.net/docs/ST_Distance.htmlST_Distance(geometry g1, geometry g2)
木兰ç

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.