【问题标题】:How to merge adjacent polygons如何合并相邻的多边形
【发布时间】:2016-03-29 09:47:51
【问题描述】:

我正在使用 Fortune 算法的 Javascript 实现来计算 voronoi 单元 (https://github.com/gorhill/Javascript-Voronoi)。我要计算的站点是地图上的点(所以(lat,lng))。我首先制作了(lat,lng) -> (x,y) 的投影,然后我计算了 voronoi 细胞,并以另一种方式制作了半边的投影。
它工作正常,我使用传单显示结果,但我还需要做一件事。

我最初计算的每个站点都依赖于一个 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 的一组多边形(由 voronoi 单元的半边构成)。

我需要按 ID 合并这些多边形,我打算使用 turf.merge(),但是我有拓扑错误

 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 的部分图表

给定 ID 的两个“多边形”

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

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

我还尝试了一个更简单的示例:

还是报错:

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

所以这不是(或至少不仅仅是)由于扭结

【问题讨论】:

  • 我已经使用了这个库,但不幸的是我不必合并任何单元格,所以无法帮助你......如果你设法复制这个问题,你应该尝试将这个问题作为一个错误发布在 github repo 上在一个非常简单的情况下。
  • 谢谢,我在 github repo 上创建了一个错误。我遇到与 turf.union() 相同的问题
  • 你试试 whit d3.js 吗? github.com/mbostock/d3/wiki/Geometry
  • 我还没有尝试使用 d3,我正在尝试使用clipper.js ou GPC

标签: javascript geometry leaflet voronoi turfjs


【解决方案1】:

您的问题似乎发生在数据到达 Turf 之前。从 GitHub issueGeoJSON validator 运行 GeoJSON 会发现两个错误。第一个是每个特征只包含一个geometry 对象,GeoJSON 要求所有特征也有一个properties 对象,即使它是空的。其次,更重要的是,一个有效的 GeoJSON 多边形必须是一个闭环,第一个点和最后一个点的坐标相同。第二个问题似乎是导致 Turf 抛出错误的原因。一旦将第一组坐标复制到末端以闭合环,多边形将成功合并。

在地图上显示数据后,您的纬度和经度也很明显颠倒了。 GeoJSON 中的坐标应该是lon,lat,因为你的坐标在lat,lon 中,所以多边形出现在印度洋的中部。一旦纠正,它们就会出现在正确的位置。

这是一个展示他们成功合并的小提琴:

http://fiddle.jshell.net/nathansnider/p7kfxvk7/

【讨论】:

  • 感谢您的回答,我不知道闭环。关于经纬度倒转,是因为数据来自法国机构,标准是(lat,lon)
  • 坐标反转是一个非常常见的问题,因为lat,lon 是世界上大多数地方(以及 Leaflet!)的标准,但因为这与将坐标排序为的数学约定背道而驰x,y,GIS软件经常使用lon,lat
猜你喜欢
  • 2010-10-13
  • 2011-12-29
  • 2012-11-24
  • 2016-02-27
  • 2015-01-20
  • 2020-01-23
  • 2021-08-16
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多