2016-01-20 204 views
0

我有一個側欄顯示當前谷歌地圖的地圖視圖中的標記的名稱。側邊欄內容更改爲地圖被感動:添加填充到谷歌地圖bounds.contains()

google.maps.event.addListener(map, 'bounds_changed', function() { 
      document.getElementById("list").innerHTML = ""; 
      var mklen = mkrs.length, 
       a = 0, 
       bnds = map.getBounds(); 

      for (a; a < mklen; a++) { 
       var themk = mkrs[a]; 
       if (bnds.contains(themk.getPosition())) { 
        var myli = document.createElement("li"); 
        myli.innerHTML = themk.title; 
        document.getElementById("list").appendChild(myli); 
       } 
      } 
     }); 

這是工作正常,但問題是,bounds.contains()是非常嚴格的 - 如果只是標記的尖底是在地圖上(即,你看不到它的99%)它被列在邊欄上。我想要的是隻有完全顯示的標記通過該測試。

有一對夫婦的,我能想到的,我不能相信別人沒碰到這個問題的辦法,所以我不知道是否有偏好,記載下列事項:

  1. 採取的界限,並重新計算它們比實際的邊界更小,使用這些新邊界的bounds.contains()測試
  2. 計算,其中的標記圖標的邊緣(我猜使用fromDivPixelToLatLng),然後檢查兩個ne和sw的邊角在範圍內,如果是的話,列出項目

在你問之前,我還沒有嘗試過其中的任何一種 - 我更多地尋找哪種方法最好甚至可能的建議,或者如果有另一種方法可以做到這一點。這裏有一個fiddle演示這個問題,以防萬一它澄清

回答

10

如果有人發現這一點後,我最終重新計算邊界 - 這似乎是涉及最少的開銷的方法。這裏的功能:

function paddedBounds(npad, spad, epad, wpad) { 
    var SW = map.getBounds().getSouthWest(); 
    var NE = map.getBounds().getNorthEast(); 
    var topRight = map.getProjection().fromLatLngToPoint(NE); 
    var bottomLeft = map.getProjection().fromLatLngToPoint(SW); 
    var scale = Math.pow(2, map.getZoom()); 

    var SWtopoint = map.getProjection().fromLatLngToPoint(SW); 
    var SWpoint = new google.maps.Point(((SWtopoint.x - bottomLeft.x) * scale) + wpad, ((SWtopoint.y - topRight.y) * scale) - spad); 
    var SWworld = new google.maps.Point(SWpoint.x/scale + bottomLeft.x, SWpoint.y/scale + topRight.y); 
    var pt1 = map.getProjection().fromPointToLatLng(SWworld); 

    var NEtopoint = map.getProjection().fromLatLngToPoint(NE); 
    var NEpoint = new google.maps.Point(((NEtopoint.x - bottomLeft.x) * scale) - epad, ((NEtopoint.y - topRight.y) * scale) + npad); 
    var NEworld = new google.maps.Point(NEpoint.x/scale + bottomLeft.x, NEpoint.y/scale + topRight.y); 
    var pt2 = map.getProjection().fromPointToLatLng(NEworld); 

    return new google.maps.LatLngBounds(pt1, pt2); 
} 

,你這樣稱呼它:

var padbnds = paddedBounds(50, 70, 100, 30); 

指定多少填充想在北,南,分別在地圖的東部和西部邊緣