如何合并相邻的多边形
How to merge adjacent polygons
我正在使用 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
基于此 post (http://lists.refractions.net/pipermail/jts-devel/2009-March/002939.html),我尝试将 (lat,lng)
对从 10^-14 舍入到 10^-7 但实际上并没有工作了。
在寻找问题并尝试消除它们之前,我打印了一些数据样本,我知道我问自己是否使用了《财富》算法中的好数据。当我显示所有 ID 的所有多边形时,我得到了正确的图表,但是当我显示一个 ID 的所有多边形或一个 ID 的一些多边形时,我得到的图表不完整:
完整图表的一部分
一个ID的部分图
给定 ID
两个 "polygons"
有没有人知道如何合并共享至少一个公共顶点的多边形?为什么会出现拓扑错误?
编辑:多边形不是"incomplete"(我使用的是折线)
我也尝试了一个更简单的示例:
仍然出现错误:
Uncaught TopologyError: side location conflict [ (44.8220601, -0.5869532) ]
所以这不是(或者至少不是)由于问题
您的问题似乎发生在数据到达 Turf 之前。 运行 来自您 GitHub issue through a GeoJSON validator 的 GeoJSON 揭示了两个错误。第一个是你只为每个特征包含一个 geometry
对象,GeoJSON 要求所有特征也有一个 properties
对象,即使它是空的。其次,更重要的是,一个有效的 GeoJSON 多边形必须是一个闭环,第一个点和最后一个点的坐标相同。第二个问题似乎是导致 Turf 抛出错误的原因。一旦将第一组坐标复制到末尾以关闭环,多边形将成功合并。
在地图上显示数据后,也清楚你的经纬度颠倒了。 GeoJSON 中的坐标应该是 lon,lat
,因为你的坐标是 lat,lon
,多边形出现在印度洋中部。更正后,它们就会出现在正确的位置。
这是一个 fiddle 显示他们合并成功的例子:
我正在使用 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
基于此 post (http://lists.refractions.net/pipermail/jts-devel/2009-March/002939.html),我尝试将 (lat,lng)
对从 10^-14 舍入到 10^-7 但实际上并没有工作了。
在寻找问题并尝试消除它们之前,我打印了一些数据样本,我知道我问自己是否使用了《财富》算法中的好数据。当我显示所有 ID 的所有多边形时,我得到了正确的图表,但是当我显示一个 ID 的所有多边形或一个 ID 的一些多边形时,我得到的图表不完整:
完整图表的一部分
一个ID的部分图
给定 ID
两个 "polygons"有没有人知道如何合并共享至少一个公共顶点的多边形?为什么会出现拓扑错误?
编辑:多边形不是"incomplete"(我使用的是折线)
我也尝试了一个更简单的示例:
仍然出现错误:
Uncaught TopologyError: side location conflict [ (44.8220601, -0.5869532) ]
所以这不是(或者至少不是)由于问题
您的问题似乎发生在数据到达 Turf 之前。 运行 来自您 GitHub issue through a GeoJSON validator 的 GeoJSON 揭示了两个错误。第一个是你只为每个特征包含一个 geometry
对象,GeoJSON 要求所有特征也有一个 properties
对象,即使它是空的。其次,更重要的是,一个有效的 GeoJSON 多边形必须是一个闭环,第一个点和最后一个点的坐标相同。第二个问题似乎是导致 Turf 抛出错误的原因。一旦将第一组坐标复制到末尾以关闭环,多边形将成功合并。
在地图上显示数据后,也清楚你的经纬度颠倒了。 GeoJSON 中的坐标应该是 lon,lat
,因为你的坐标是 lat,lon
,多边形出现在印度洋中部。更正后,它们就会出现在正确的位置。
这是一个 fiddle 显示他们合并成功的例子: