按条件将大多边形分成较小的多边形

时间:2017-11-16 18:24:58

标签: algorithm split leaflet polygon postgis

我有一些大的多边形。在它的小册子层(点)的集合内。每个点都有一些数字属性。我想要的是将大多边形分成较小的多边形。 每个较小的多边形应包含〜等于(+ -200 ok)点属性总和的点。在我的示例页面的左侧,我添加了理想结果的图像。 Here is my simplified example有足够的代码和评论。

  1. 所以我的第一步是在大多边形内找到一些起点。它应该指向Polygon边缘附近 - 例如最北端。

    var nothernmostPoint= 0;
    var nothernmostLayer= 0;
    L.geoJSON(features, {
        pointToLayer: function (feature) {
            return L.circleMarker(feature.geometry.coordinates.reverse(), defaultPointStyle);
        },
        onEachFeature: function (feature, layer) {
            if (feature.geometry.coordinates[0] > nothernmostPoint) {
                nothernmostPoint = feature.geometry.coordinates[0];
                nothernmostLayer = feature;
            }
        }
    }).addTo(map);
    
    1. 第二步是找到我的起点的下一个最近的点。

       var geoJ = L.GeometryUtil.nClosestLayers(map, features, nothernmostLayer.geometry.coordinates, 5);
      
      1. 然后总结他们的财产。如果sum小于需要,我转到步骤2并重复,如果sum是满足条件,那么我在其中绘制带有选定点的多边形并找到最近点到我的最后一个点并重复搜索下一个较小多边形的点。
      2. 我目前的困难是找到距离我的起点最近的点。为此,我使用 GeometryUtil Leaflet插件。红点是 GeometryUtil 找到的距离我的起点(绿色点)最近的点。这肯定不是我的预期。我究竟做错了什么?也许我应该为该任务使用不同的算法和/或工具?非常感谢任何有用的建议。

        如果它有帮助 - 我将所有数据存储在 PostgreSQL 中,并带有 PostGIS 扩展名。也许这可以在数据库级别完成。

1 个答案:

答案 0 :(得分:0)

如果您的数据集相当小,您可以在PostGIS中采用强力方式:

  • 对于每个点,使用select geom, generate_series(0, weight);
  • 生成代表'权重'的N个点
  • 决定您要获得的群集数量,大约sum(weight)/desired_sum;
  • 在数据集https://postgis.net/docs/manual-2.3/ST_ClusterKMeans.html
  • 上运行K-Means聚类
  • 使用ST_ConvexHull(ST_Collect(geom))在每个簇周围绘制一个多边形。