如何合并相邻的多边形

5
我正在使用Fortune算法的Javascript实现来计算Voronoi图形 (https://github.com/gorhill/Javascript-Voronoi)。我的计算站点是地图上的点 (即 (纬度,经度))。我首先进行了投影 (纬度,经度) -> (x,y),然后计算了Voronoi图形,并将半边投影到另一侧。
它的工作正常,我使用leaflet显示结果,但我需要做更多的事情。
每个我最初计算的站点都依赖于一个ID,我通过ID重新分类Voronoi单元格,最终为每个ID得到一个标准数据结构,看起来像这样:
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [[
          [9.994812, 53.549487],
          [10.046997, 53.598209],
          [10.117721, 53.531737],
          [9.994812, 53.549487]
        ]]
      }
    }, {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [[
          [10.000991, 53.50418],
          [10.03807, 53.562539],
          [9.926834, 53.551731],
          [10.000991, 53.50418]
        ]]
      }
    }
  ]
};

给定ID的一组多边形(由沃罗诺伊单元的半边构成)。
我需要按ID将这些多边形合并,打算使用,但出现了拓扑错误。
 turf.min.js:13 Uncaught TopologyError: side location conflict

基于这篇文章(http://lists.refractions.net/pipermail/jts-devel/2009-March/002939.html),我尝试将(lat,lng)对从10^-14舍入到10^-7,但实际效果并不理想。在寻找问题并试图解决之前,我打印了一些数据样本,并且现在我在思考是否使用了Fortune算法的正确数据。当我显示所有ID的所有多边形时,我得到了正确的图表,但是当我显示一个ID的所有多边形或某些多边形时,我得到了不完整的图表:

完整图表的一部分

完整图表的一部分

输入图像说明

一个ID的图表的一部分

输入图像说明

给定ID的两个“多边形”

有没有人有想法如何合并共享至少一个公共顶点的多边形?为什么会出现拓扑错误?

编辑:多边形不是“不完整的”(我使用了折线)

输入图像说明

我还在一个更简单的样本上尝试过:

输入图像说明

但仍然出现错误:

Uncaught TopologyError: side location conflict [ (44.8220601, -0.5869532) ]

所以这不是(或至少不仅仅是)由于缺陷引起的。

我曾经使用过这个库,但不幸的是我没有必要合并任何单元格,所以无法帮助你......如果你能在一个非常简单的情况下重现它,你应该尝试将这个问题发布到 Github 存储库中作为一个 bug。 - dekajoo
谢谢,我在 Github 存储库上创建了一个 bug。我在使用 turf.union() 时遇到了相同的问题。 - kwn
你尝试过使用d3.js吗?https://github.com/mbostock/d3/wiki/Geometry - cbertelegni
我还没有尝试过d3,我正在尝试使用clipper.js或GPC。 - kwn
1个回答

2
您的问题似乎出现在数据到达Turf之前。通过GitHub问题中提供的GeoJSON,在GeoJSON验证器上运行时发现两个错误。第一个错误是每个特征仅包括一个geometry对象,而GeoJSON要求所有特征也具有一个properties对象,即使它为空。其次,更重要的是,有效的GeoJSON多边形必须是闭合环,第一个和最后一个点必须具有相同的坐标。这第二个问题似乎是导致Turf抛出其错误的原因。一旦将第一组坐标复制到末尾以关闭环路,这些多边形将成功合并。
在地图上显示数据后,还可以明显看出您的纬度和经度被颠倒了。在GeoJSON中,坐标应该是lon,lat,因为您的坐标是lat,lon,所以多边形显示在印度洋中央。一旦更正,它们将显示在正确的位置。
下面是一个演示它们成功合并的示例: http://fiddle.jshell.net/nathansnider/p7kfxvk7/

谢谢你的回答,我之前不知道有闭环。至于纬度和经度颠倒的问题,那是因为数据来自法国机构,他们的标准是(纬度,经度)。 - kwn
1
坐标反转是一个相当常见的问题,因为在世界上大多数地方(包括Leaflet)中,lat,lon是标准格式,但由于这与按照数学约定顺序排列坐标的x,y相反,GIS软件通常使用lon,lat - nathansnider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接