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

插图:



#1 楼

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

expand(geometry,float)


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


A && B


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


ad 2)您应该能够通过以下方式实现所需的功能:

st_line_interpolate_point(linestring, st_line_locate_point(LineString, Point))


st_line_interpolate_point(线串,位置)


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


st_line_locate_point(LineString,Point)


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


评论


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

– Vivi
2010-09-21在12:04

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

– Vivi
2010-09-21在12:06

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

– Underdark♦
2010-09-21在12:15

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

– Vivi
2010-09-21在12:57

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

– Vivi
2010-09-21 14:34

#2 楼

哈罗

首先是有关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
尼克拉斯

#3 楼

我找到了:)(好吧,我猜: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方法会将这个位置变成一个点。

评论


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

–尼克拉斯·阿文(NicklasAvén)
13年5月5日在17:07

我认为ST_Distance可以与任何几何类型一起使用。 postgis.refractions.net/docs/ST_Distance.html:ST_Distance(几何g1,几何g2)

– Magno C
13年11月8日15:01



#4 楼

这个Postgis存档线程可以回答您http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html

评论


refractions.net对我不起作用:“ refractions.net于2010年9月14日到期,正在等待更新或删除。”

– Underdark♦
2010-09-21 15:54

@underdark它对我有用

– dassouki
2010-09-21 17:58

@dassouki:很奇怪:|

– Underdark♦
2010-09-21 18:04

@underdark refractions.net再次工作

– ThomasG77
2010-09-21 23:16