查找最接近质心的几何内部点

时间:2020-07-30 13:27:13

标签: c++ geometry openstreetmap geos

我正在从OpenStreetMap数据库中提取水体的名称,并使用Geos库基于其几何形状的质心来获得其长/纬度标签:

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

bool result = geometry->getCentroid(centroidCoord);

但是,一些水体的形状不规则,导致质心的位置远远落在水面之外,因此在地图上查看时看起来不正确。有什么程序可以用来找到最接近质心的几何内部点?

我已经找到了Geos库的getInteriorPoint方法,但是从我可以确定返回的随机点是否保证在几何范围内,但不一定在质心附近。

2 个答案:

答案 0 :(得分:1)

虽然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生成内部三角形多边形。可以查询这些所得多边形的质心,并且可以将最接近外部质心的三角形质心用作位于几何图形内的质心点。

答案 1 :(得分:0)

是否可以使用某个程序来查找最接近其质心的几何图形的内部点?

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

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