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

标签 c++ geometry openstreetmap geos

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

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

bool result = geometry->getCentroid(centroidCoord);
但是,一些水体具有不规则的形状,导致质心的位置远远落在水面之外,从而使它们在 map 上查看时显得格格不入。是否可以使用某个程序找到最接近其质心的几何图形的内部点?
我已经找到了Geos库的getInteriorPoint方法,但是从我可以确定返回的随机点是否保证在几何范围内,但不一定在质心附近。

最佳答案

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

关于c++ - 查找最接近质心的几何内部点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63174232/

相关文章:

c++ - 这个 boost-asio UDP 广播代码应该如何只与本地主机一起工作?

python - 展开宏并检索宏值

android - google maps android,所有标记都在圆圈内加载

PostgreSQL:更新大表

django - GeoDjango:我可以在User Admin的内联中使用OSMGeoAdmin吗?

c++ - Win32 中的动画图像

c++ - 仿函数与 std::bind

algorithm - 如何检查线段是否与矩形相交?

gis - Osmosis - 从 OSM 数据中删除业务以供地理编码使用

javascript - AJAX 刷新、setInterval 计时和本地主机崩溃