如何使用传单来计算给定点的最近点?

时间:2016-11-17 09:12:59

标签: php ajax leaflet

我有两个点层(客户,供应商),我希望在用户输入的距离内获得特定客户的所有最近的供应商,我听说传单,但我找不到一个完整的示例了解它,有什么建议吗? 这是我通过ajax获取客户数据的代码

    $.ajax({
            type: "POST",
            url: 'Customers_geojson.php',
            dataType: 'json',
            success: function (response) {
                    geojsonLayer = L.geoJson(
                        response,
                        {
                        pointToLayer: function (feature, latlng) 
                            {
                             return L.circleMarker(latlng, geojsonMarkerOptions1);
                            }
                            },
                            {   
                            onEachFeature: function (feature, layer) 
                            {
                            layer.bindPopup('<label>Nick Name:</label>' + feature.properties.nick_name_);
                            }
                    }).addTo(mymap);
                    $("#info").fadeOut(500);
                    var gj = L.geoJson(response);
                    var nearest = leafletKnn(gj).nearest(L.latLng(8.71224, 125.692), 10000);
                    alert(nearest);

                    }
                });

1 个答案:

答案 0 :(得分:2)

  

如何使用leaflet-knn计算给定点的最近点?

答案是&#34;你不能&#34;。

nearest neighbour search算法,例如rbush-knn(以及较旧的leaflet-knn)实现的算法,可帮助您回答以下查询:

  

我住在(x,y);我家的 5个最近的商店是什么?

  

我在(x,y); 最近的地铁站在哪里?

甚至

  

我在(x,y); 最近的地铁站在哪里? 限制将搜索范围限制在500米,因为我不想走得那么远。

...但是想要回答的问题是非常不同的(强调我的):

  

我希望所有离用户输入的距离的最近供应商

使用最近邻搜索算法该作业的错误工具。你想要的是:

  • 给定一个点,生成一个以该点为中心的圆,半径为N。该圈子将包含距离中心距离等于或小于N所有点,而不包含任何其他内容。
  • 给定一个点,生成一个以该点为中心的正方形,边长为N*2。该方块将包含所有点,距离中心的距离等于或小于N加上一些不是。

在GIS术语中,制作一个圆圈称为缓冲区,然后找到缓冲区的交叉点并设置点数。

同上,制作一个正方形称为边界框,在边界框内查询点

制作缓冲区听起来效果最好,但计算成本更高。非常如此。创建一个边界框并查询一组点是非常便宜的(阅读&#34;快速&#34;)并且可以通过对r树结构的简单查询来实现(参见例如the documentation and examples for rbush)。 / p>