如何从Postgis中实际位于多边形内的多边形获取最接近点

时间:2019-06-21 13:45:33

标签: postgis

我正在尝试清理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查询解决此问题,那将是完美的。

2 个答案:

答案 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);