找到最接近其质心的几何体的内点

Find geometry's interior point closest to its centroid

我正在从 OpenStreetMap 数据库中提取水体的名称,并使用 Geos 库根据其几何图形的质心获取它们的标签long/lat:

geos::geom::Geometry* geometry = BuildInternalGeometry();
geos::geom::Coordinate centroidCoord;

bool result = geometry->getCentroid(centroidCoord);

但是,一些水体的形状不规则,导致质心的位置远离水多边形,在地图上看起来不合适。有没有我可以用来找到最接近其质心的几何体的内点的程序?

我找到了 Geos 库的 getInteriorPoint 方法,但据我所知 returns 随机点是否保证在几何图形内但不一定靠近质心。

Is there a procedure I could use to find the interior point of a geometry that falls closest to its centroid?

您知道最近的点将位于水多边形的一部分上(除非它在内部)。简单的算法是:

for all segments of the water polygon
    find distance between centroid and current segment, get closest point on segment
    remember the best distance and position

虽然 Jeffrey 的回答没有完全回答这个问题(Geos 库似乎不支持多边形部分),但它确实给了我一个想法,好吧......关于如何定位靠近内部点的 2 个想法多边形的质心。

第一个想法(更简单、不太准确)涉及迭代几何体的顶点并使用最接近外部质心的顶点作为新质心:

auto coords = geometry->getCoordinates();
                    
for (auto i = 0; i < coords.get()->getSize(); i++)
{
    double dist = coords.get()->getAt(i).distance(coordPoint);

    if (dist < nearest)
    {
        nearest = dist;
        closestCoord = coords.get()->getAt(i);
    }
}

return closestCoord;

但是,新的质心坐标将始终位于多边形的边缘,而不是其内部。

为了得到位于几何体内部的东西,可以使用Geos自带的delaunay triangulation class生成内三角多边形。可以查询这些生成的多边形的质心,并且可以将最接近外部质心的三角形质心用作位于几何内部的质心点。