2016-11-17 67 views
0

我有兩個層次(客戶,供應商),我想在距離用戶輸入的距離內獲得所有最近的供應商,我聽說了傳單knn,但我找不到一個完整的例子來理解它,有什麼建議麼? 這是我的代碼,通過Ajax獲取客戶數據的一部分如何使用leaflet-knn來計算給定點的最近點?

$.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

如果你的問題是«有人可以幫我X?»時,[答案是要麼«是»或«無»(http://www.strcat.de/questions-with-yes-or-無answers.html)。請重新表達您的問題。 – IvanSanchez

+1

請閱讀[«我如何問一個好問題?»](https://stackoverflow.com/help/how-to-ask)。你可能想把標題改爲«給定很多點,如何計算給定的最近N個點?» – IvanSanchez

+0

非常感謝,我會改變它。 – Beginner

回答

2

如何計算最近點使用給定的點瓣葉KNN?

答案是「你不能」。

一個nearest neighbour search算法,如一個rbush-knn(和年長leaflet-knn)工具,可幫助您解答疑問:

我住在(X,Y);什麼是5最接近商店到我家?

我在(X,Y); 最接近地鐵站在哪裏?

甚至

我在(X,Y); 最接近地鐵站在哪裏? 限制搜索到500米,因爲我不會走路那麼遠。

...但你要回答查詢是非常不同的(重點煤礦):

我希望得到一個距離內所有最近的供應商特定的客戶由用戶輸入。

使用最近鄰居搜索算法是作業的錯誤工具。你想要的是:

  • 給定一個點,產生一個以該點爲中心的圓,半徑爲N。該圓圈將包含全部點,其距離中心的距離等於或小於N,沒有別的。
  • 給定一個點,生成一個以該點爲中心的正方形,邊長爲N*2。該廣場將包含全部點距離中心距離等於或小於N有些不是。

在GIS行話,使得圓被稱爲製備緩衝器,然後找到緩衝區的相交和您的點設置。

同樣,製作方塊被稱爲製作包圍盒,並且在包圍盒內查詢點。

製作一個緩衝的聲音最好的,但在計算上更昂貴。非常非常。創建邊界框和查詢一組點是非常便宜的(讀取「快速」)並且可以通過對r-樹結構的簡單查詢來實現(參見例如the documentation and examples for rbush)。