javascript – 在非常接近的点的大数据集上计算Voronoï图

我有一个大的地理点数据集(大约22000点,但我将来会更多),我需要计算他们的Voronoï图.我首先将我的点从(lat,lng)投影到(x,y)(使用来自Leaflet的latLngToLayerPoint()),然后基于
Javascript implementation of Fortune’s algorithm 计算图表.我恢复图表的每个单元格,或者更精确地恢复va和vb,分别 :

“A Voronoi.Vertex object with an x and a y property defining the start
point (relative to the Voronoi site on the left) of this Voronoi.Edge
object.”

“A Voronoi.Vertex object with an x and a y property defining the end
point (relative to Voronoi site on the left) of this Voronoi.Edge
object.”

(参见文件)

最后,我预测这些点以使用传单显示图表.我知道,为了计算图表,每个点都需要是唯一的,所以我在计算图表之前就删除了重复项.但事实是,我最终得到了一个非常糟糕的结果(非节点交叉点,复杂多边形):

《javascript – 在非常接近的点的大数据集上计算Voronoï图》

特写

《javascript – 在非常接近的点的大数据集上计算Voronoï图》

我在图中有漏洞,我不知道为什么.积分是房子地址所以其中一些,即使它们不相等,也真的(非常)接近.我想知道这个问题是不是来自投影(if(lat1,lng1)和(lat2,lng2)几乎等于,(x1,y1)和(x2,y2)是否等于?).我强烈怀疑这是问题的来源,但我不知道如何解决(建立一个门槛?)

编辑:我确切地说我在投影后删除了重复项,所以它不是关于投影的精度,而是关于如果两个点相距一个像素会发生什么?

最佳答案 所以我找到了我的问题的解决方案,我发布它以防任何人需要使用Leaflet和Turf在地图上计算Voronoï图并且在实施Fortune算法时遇到麻烦(直到turf-voronoi工作).

Other sources of how to compute a Voronoï diagram on map can be found (but using d3)(我认为d3也使用了Fortune算法的这个Javascript实现)

问题不是由数据集的大小或点的接近度引起的,而是由我如何恢复单元格引起的.

因此,您首先需要将您的点从(lat,lng)投影到(x,y)(使用latLngToLayerPoint()),计算图:voronoi.compute(sites,bbox),其中站点是您的点,如下所示[ {x:200,y:200},{x:50,y:250},{x:400,y:100} / *,… * /](请注意,您的网站必须是唯一的)并且如果你想要当前缩放的屏幕框架是你的bbox juste使用:

var xl = 0, 
    xr = $(document).width(),
    yt = 0,
    yb = $(document).height();

一旦你计算了图表,只需恢复单元格(carfull,如果你想要正确的多边形,你需要边缘逆时针排序(或顺时针排序,但你要对它们进行排序),谢天谢地,算法提供了一半的边缘鉴于Voronoï.Vertex逆时针方向订购).要恢复每个单元格的顶点,可以使用getStartpoint()或getEndpoint(),而不要忘记将它们从(x,y)投射回(lat,lng)(使用layerPointToLatLng())

diagram.cells.forEach(function (c) {
    var edges=[];

    var size = c.halfedges.length;
    for (var i = 0; i < size; i++) {

        var pt = c.halfedges[i].getEndpoint();
        edges.push(map.layerPointToLatLng(L.point(pt.x,pt.y)));

    };

    voronoi_cells.push(L.polygon(edges));
});

最后,您必须使用FeatureCollection来显示图表:

《javascript – 在非常接近的点的大数据集上计算Voronoï图》

点赞