2015-01-12 78 views
0

我使用this question中的公式找到地圖上距當前位置最近的標記。我想修改這個公式,以便找到最近的5個位置,最近的10個位置等最近的位置數量(n),我不確定如何完成此操作。Google Maps API - 最近的標記函數更改爲最接近的n個標記

下面是修改的公式我使用:

function rad(x) {return x*Math.PI/180;} 
function find_closest_marker(center, map) { 
    var lat = center.lat(); 
    var lng = center.lng(); 
    var R = 6371; // radius of earth in km 
    var distances = []; 
    var closest = -1; 
    for(i=0;i<markers.length; i++) { 
     var mlat = markers[i].position.lat(); 
     var mlng = markers[i].position.lng(); 
     var dLat = rad(mlat - lat); 
     var dLong = rad(mlng - lng); 
     var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2); 
     var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
     var d = R * c; 
     distances[i] = d; 
     if (closest == -1 || d < distances[closest]) { 
      closest = i; 
     } 
    } 

    //Log title of closest marker 
    console.log(markers[closest].title); 
} 

這裏是我正在加載標記:

// Add markers to the map 
function setMarkers(center, map) { 
    var json = (function() { 
     var json = null; 
     $.ajax({ 
      'async': false, 
      'global': false, 
      'url': "js/data.json", 
      'dataType': "json", 
      'success': function (data) { 
       json = data; 
      } 
     }); 
     return json; 
    })(); 
    // Loop over each of the json elements 
    for (var i = 0, length = json.length; i < length; i++) { 
     var data = json[i], 
     latLng = new google.maps.LatLng(data.lat, data.lon); 
     // Create a marker and place it on the map 
     var icon = 'assets/marker.png'; 
     var marker = new google.maps.Marker({ 
      position: latLng, 
      map: map, 
      icon: icon, 
      title: data.loc 
     }); 
     markers.push(marker); 
     infoBox(map, marker, data); 
    } 
} 

我怎樣才能進一步修改公式,以便找到最接近的n標記數量而不是最接近的一個?

+0

@MrUpsidown這不是一個副本(我在這個問題中引用該帖子)。在那裏發佈的公式只能找到最接近的單個標記,我希望它找到最接近的「n」個標記。 – user13286

+0

[Google Maps API - 獲取最接近郵政編碼的點]的可能重複(http://stackoverflow.com/questions/17280787/google-maps-api-getting-closest-points-to-zipcode),請參閱findClosestN( pt,numberOfResults)'函數。 – geocodezip

+0

@geocodezip感謝您的回覆,我之前看到過你的帖子,但對我來說有點太複雜。是否有任何方法可以將上述公式轉換爲最接近的n個位置(因爲我已經以此方式運行)?再次感謝! – user13286

回答

5

你可以使用(稍作修改)findClosestNthis question功能(改變gmarkersmarkers,改變了函數返回closest陣列限於numberOfResults元素)

function findClosestN(pt, numberOfResults) { 
    var closest = []; 
    for (var i = 0; i < markers.length; i++) { 
     markers[i].distance = google.maps.geometry.spherical.computeDistanceBetween(pt, markers[i].getPosition()); 
     markers[i].setMap(null); 
     closest.push(markers[i]); 
    } 
    closest.sort(sortByDist); 
    return closest.splice(0,numberOfResults); 
} 

function sortByDist(a, b) { 
    return (a.distance - b.distance) 
} 

proof of concept fiddle

+0

謝謝,我能夠使此功能正常工作,並顯示正確數量的結果。將一個「載入更多結果」按鈕添加到此會很困難嗎?我假設按鈕將不得不改變'numberOfResults'變量,然後重新調用函數? – user13286

+0

那麼......那將是最簡單的方法,是的。 – MrUpsidown

+0

爲什麼我們要做'markers [i] .setMap(null);'?這不會把地圖上的標記掉下來嗎? –

相關問題