如何从实际上在 Postgis 中的多边形内的多边形中获取最近点

Posted

技术标签:

【中文标题】如何从实际上在 Postgis 中的多边形内的多边形中获取最近点【英文标题】:How to get closest point from a polygon that is ACTUALLY inside the polygon in Postgis 【发布时间】:2019-06-21 13:45:33 【问题描述】:

我正在尝试清理 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 查询来解决,那就完美了。

【问题讨论】:

【参考方案1】:

我找到的解决方案是通过使用具有负半​​径的 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。

【讨论】:

【参考方案2】:

只需将多边形转换为其边界:

SELECT ST_ClosestPoint(ST_Boundary(polygon.geometry), point.geometry);

【讨论】:

以上是关于如何从实际上在 Postgis 中的多边形内的多边形中获取最近点的主要内容,如果未能解决你的问题,请参考以下文章

如何按纬度和经度(Postgis)从表中选择多边形

从PostGIS数据库中的Geography Polygon读取点

PostGIS - 将多面体转换为单面体

POSTGIS 显示多边形

在java中存储PostgreSQL/PostGIS“几何(多多边形)”数据类型

使用JAVA中的geotools从定义距离(km)内的线(GPS坐标)生成多边形