gpt4 book ai didi

postgresql - postgis:ST_LineLocatePoint 中返回的点无法在 ST_Contains 中检测到

转载 作者:行者123 更新时间:2023-11-29 12:44:24 25 4
gpt4 key购买 nike

我正在使用 postgisST_LineLocatePoint 找出 LineString 上最接近给定 Point 的点>,并使用 ST_LineInterpolatePoint 从返回的 float 中提取一个 Point

ST_LineLocatePoint 查询:

SELECT ST_AsText(ST_LineInterpolatePoint(foo.the_line,
ST_LineLocatePoint(foo.the_line,
ST_GeomFromText('POINT(12.962315 77.584841)')))) AS g
FROM (
SELECT ST_GeomFromText('LINESTRING(12.96145 77.58408,12.96219 77.58447,12.96302 77.58489,
12.96316 77.58496,12.96348 77.58511)') AS the_line
) AS foo;

输出:

                    g                     
------------------------------------------
POINT(12.9624389808159 77.5845959902924)

这恰好位于我已经通过的 linestring 上。演示显示here .

但是当我使用 ST_Contains 检查这个 point 是否位于 linestring 中时,它总是返回 false,即使尽管重点在于。

ST_Contains 查询:

SELECT ST_Contains(ST_GeomFromText('LINESTRING(12.96145 77.58408,12.96219 77.58447,
12.96302 77.58489, 12.96316 77.58496, 12.96348 77.58511)'),
ST_GeomFromText('POINT(12.9624389808159 77.5845959902924)'));

输出

 st_contains 
-------------
f

我没有找到我做错的地方。任何人都可以帮助我。

Postgresql : 9.4
postgis : 2.1

引用:ST_LineLocatePoint , ST_Contains

最佳答案

I am not getting where I am doing wrong.

我认为你做得很好...我前段时间遇到了同样的问题...我使用了 ST_ClosestPoint定位线串上的点,然后用这个点切割线串,但我不能。

按照文档:

ST_ClosestPoint — Returns the 2-dimensional point on g1 that is closest to g2. This is the first point of the shortest line.

所以我遇到这样的情况,一个函数说 - 这个点在一条线上,而其他函数说 - 好的,但我不能切,因为你的点不在一条线上......我很困惑,就像你一样现在……

在我的例子中,解决方案是绘制另一条线,该线将在给定点“精确”地与第一条线相交,然后第一条线被切割...

经过一些研究,我发现问题是关于计算和写入的坐标的舍入。我向自己解释说,根据定义,线是无限细的,点是无限小的(它们没有面积),所以它们很容易错过彼此——但这是我的推理,我不确定它是否是好的。我建议您使用 st_intersects,但 st_buffer 或 ST_DWithin 函数非常低,距离也非常短。

要确保您的点位于一条线上,它必须是这条线的一部分(例如 LINESTRING(0 0, 5 5) 点 (0 0) 和 (5 5)。点 (3 3) 的示例之所以有效,是因为它的坐标是在没有任何舍入的情况下计算出来的。

关于postgresql - postgis:ST_LineLocatePoint 中返回的点无法在 ST_Contains 中检测到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32847470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com