2017-08-28 35 views
0

我正在尋找一種方法來計算標記如何接近或遠是視覺與谷歌地圖谷歌地圖標記之間的距離。我不在乎他們之間的mi/km。我想知道什麼時候,例如,當你放大兩個標記相互靠近。獲取以像素爲單位或「可視距離」

我知道MarkerClusterer的非常好。我甚至有我自己的重大修改的叉子,但它沒有按照我需要的這個項目設置。 MarkerClusterer創建一個覆蓋層,它不會與我所需要的一起工作。這是我在其他問題中向其他人暗示的建議。

在我的完美的世界裏我有一個功能distanceInPx我可以用這樣的:

if (distanceInPx(marker1, marker2) < 10) { 
    // do my thing 
} 

或者,如果有另一種方式來做到這概念同樣的事情,將工作過。

+0

聽起來像一個XY問題,你想達到什麼目的?看起來你想看看兩個標記是否彼此接近,爲什麼你不能用公里和/或英里做這個? – Nick

+0

km/mi在放大或縮小時不會改變。如果我放大出路,東西相距僅10公里,他們將重疊的,但如果我放大超遠的,他們可能是在屏幕 –

+0

重新完全不同的方面:「什麼是你想達到」我試着去改變了一些UI時標記在視覺上靠近在一起。當我縮小它們時,如果它們非常接近,它們將在餅圖中。如果我放大,如果它們之間有足夠的視距,它們會分開。這是我能得到與MarkerClusterer大部分工作,但不幸的是,OverlayView的使它成爲一個沒有去,因爲我需要基於縮放級別,你可以找出米/像素比是什麼給它添加 –

回答

1

你可以寫下面的函數來獲得距離像素中的兩個標記之間。它假設該地圖被初始化,您有全局變量mapprojection_changed事件被觸發

function distanceInPx(marker1, marker2) { 
    var p1 = map.getProjection().fromLatLngToPoint(marker1.getPosition()); 
    var p2 = map.getProjection().fromLatLngToPoint(marker2.getPosition()); 

    var pixelSize = Math.pow(2, -map.getZoom()); 

    var d = Math.sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y))/pixelSize; 

    return d; 
} 

後你執行的功能,請參考文檔的詳細信息:

https://developers.google.com/maps/documentation/javascript/reference#Projection

https://developers.google.com/maps/documentation/javascript/reference#Point

示例代碼

var map; 
 
     
 
function initMap() { 
 
    var myLatLng = {lat: 41.079351, lng: -0.758057}; 
 

 
    var madrid = {lat: 40.416775, lng: -3.70379}; 
 
    var barca = {lat: 41.385064, lng: 2.173403}; 
 

 
    map = new google.maps.Map(document.getElementById('map'), { 
 
    zoom: 4, 
 
    center: myLatLng, 
 
    gestureHandling: "greedy" 
 
    }); 
 

 
    var marker1 = new google.maps.Marker({ 
 
    position: madrid, 
 
    map: map, 
 
    title: 'Madrid' 
 
    }); 
 

 
    var marker2 = new google.maps.Marker({ 
 
    position: barca, 
 
    map: map, 
 
    title: 'Barcelona' 
 
    }); 
 

 
    google.maps.event.addListener(map, "projection_changed", function(){ 
 
     var d = distanceInPx(marker1, marker2); 
 
     document.getElementById("distance").innerHTML = "Distance: " + d; 
 
    }); 
 

 
    google.maps.event.addListener(map, "zoom_changed", function(){ 
 
     var d = distanceInPx(marker1, marker2); 
 
     document.getElementById("distance").innerHTML = "Distance: " + d; 
 
    }); 
 
} 
 

 
function distanceInPx(marker1, marker2) { 
 
    var p1 = map.getProjection().fromLatLngToPoint(marker1.getPosition()); 
 
    var p2 = map.getProjection().fromLatLngToPoint(marker2.getPosition()); 
 

 
    var pixelSize = Math.pow(2, -map.getZoom()); 
 

 
    var d = Math.sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y))/pixelSize; 
 

 
    return d; 
 
}
#map { 
 
    height: 100%; 
 
} 
 
html, body { 
 
    height: 100%; 
 
    margin: 0; 
 
    padding: 0; 
 
}
<div id="distance"></div> 
 
<div id="map"></div> 
 
<script async defer 
 
    src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDztlrk_3CnzGHo7CFvLFqE_2bUKEq1JEU&callback=initMap"></script>

希望這有助於!

+0

這看起來不錯!我認爲這工作完美:) –

相關問題