gpt4 book ai didi

postgresql - Postgis - ST_within 没有做我想做的事。如何在空心区域中找到一个点?

转载 作者:行者123 更新时间:2023-12-01 21:46:09 25 4
gpt4 key购买 nike

请参阅屏幕打印。

我在 Postgis 中运行了一个空间查询,以返回 map 上某个点所在的选区(区域)。该查询使用 ST_within 函数,其中该点位于多边形内。

正如您从打印品中看到的那样,该点实际上并不“在”York Outer 的多边形区域中,尽管从技术上讲您可能会说它在“内部”,或者至少 Postgis 是这么认为的。重点实际上在于约克中心。

我确定 Postgis 实际上返回了两者,但由于我只从游标中获取了第一条记录,所以这就是我所看到的。

一个点一次只能在一个选区,这个查询返回了错误的选区或者我问错了数据库的问题。

我应该使用哪个函数来确保我始终为某个点返回正确的区域,该区域可能有一个空心内部或一个奇怪的形状?

ST_within allows a non overlapping point

谢谢

菲尔

最佳答案

这应该像您描述的那样工作。也许数据有问题?你能提供一个带有多边形/点数据的小型复制品吗?

此外,此类问题的一个常见原因是无效的 GIS 数据。您可以使用 PostGIS 的 ST_IsValid 函数检查多边形形状。如果数据无效,不同的工具可能会以不同的方式解释它,并且 GIS 数据的绘制方式可能与 PostGIS 认为该数据代表的内容不匹配,从而导致更多的困惑。

这是一个简单的重现,显示它按您预期的那样工作,外多边形孔内的点仅 st_within 内多边形,而不是外多边形:

select st_astext(point), name 
from
(select
'outer' as name,
st_geomfromtext('polygon((0 0, 30 0, 30 30, 0 30, 0 0), (10 10, 20 10, 20 20, 10 20, 10 10))') g
union all
select
'inner' as name,
st_geomfromtext('polygon((10 10, 20 10, 20 20, 10 20, 10 10))') g
) shapes
cross join
(select st_geomfromtext('point(15 15)') point
union all
select st_geomfromtext('point(5 5)') point
) points
where st_within(point, g)

我的结果是

1   POINT(5 5)     outer
2 POINT(15 15) inner

关于postgresql - Postgis - ST_within 没有做我想做的事。如何在空心区域中找到一个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60460941/

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