我正在尝试清理PostGIS数据库中的某些地理空间数据。由于地理编码过程中的某些不确定性,某些必须落在某个区域边界内的点被映射为非常接近,但位于该区域的定界多边形之外。
我的第一种方法是在PostGIS中使用ST_ClosestPoint函数,但没有成功。问题是,此函数返回 几何A上最接近几何B的点(https://postgis.net/docs/ST_ClosestPoint.html)。但是,ON并不代表IN,因为如果我运行以下查询,它将询问A中是否包含ON A(一个多边形)与B(一个点)最近的点:
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查询解决此问题,那将是完美的。
答案 0 :(得分:0)
我发现的解决方案是通过使用半径为负的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。
答案 1 :(得分:0)
只需将多边形转换为其边界:
SELECT ST_ClosestPoint(ST_Boundary(polygon.geometry), point.geometry);