2016-01-20 155 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); 

指定多少填充想在北,南,分别在地图的东部和西部边缘