我正在尝试清理PostGIS数据库中的一些地理空间数据。由于地理编码过程中的一些不精确,一些必须落在某个区域的边界内的点被映射为非常接近,但在所述区域的分界多边形之外。
我的第一种方法是在PostGIS中使用ST_ClosestPoint函数,但没有成功。问题是,此函数将几何图形A上最近的点返回到几何图形B (https://postgis.net/docs/ST_ClosestPoint.html)。然而,ON并不意味着IN,因为如果我运行下面的查询,它会询问A(多边形)上与B(点)最近的点是否包含在A中:
SELECT ST_Contains(
ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'),
ST_ClosestPoint(
ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'),
ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20)
)
) As ptwkt;它返回false,这意味着最近的点根本不包含在A中。我想要的是多边形(包含在该多边形中)中离另一个点最近的点。我想要这样,因为我的其余代码检查这些点是否在它们各自的区域内。如果可以用PostGIS查询来解决这个问题,那就太好了。
发布于 2019-06-24 18:49:51
我找到的解决方案是通过使用具有负半径的ST_Buffer来“收缩”初始多边形,然后获得我的初始点与缩小的多边形之间的最近点。与缩小的多边形最近的点位于初始多边形内。
SELECT ST_Contains(
ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'),
ST_ClosestPoint(
ST_Buffer(ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'), -5),
ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20)
)
) As ptwkt;现在它返回true。
https://stackoverflow.com/questions/56704687
复制相似问题