代码之家  ›  专栏  ›  技术社区  ›  Jeyhun Rahimov

导航地图时向谷歌地图添加标记

  •  1
  • Jeyhun Rahimov  · 技术社区  · 13 年前

    我在谷歌地图中有很多标记(大约3000个),它们在弹出窗口中有图标和高级细节。这就是为什么,地图打开得很晚, 而且所有标记加载都很晚。 因为我从数据库中加载所有标记列表,并用foreach循环一次性显示它们。

    现在我想 在导航(滑动)地图时逐部分加载标记 .

    例如,如果我在 地区1 ,我只能在中看到标记 地区1 ,当我将地图导航(滑动)到 地区2 ,只加载中的标记 地区2

    请提供任何想法、样本或链接。谷歌地图API有导航事件吗?

    3 回复  |  直到 12 年前
        1
  •  5
  •   Barry Beerman    13 年前

    您可以为中心和缩放级别的更改注册地图事件,然后如果标记位于当前视口中,则加载标记:

    function loadMarker() {
        // Get the center lat/lng of the map
        var center = map.getCenter();
    
        // Get the size of the map viewport
        var bounds = map.getBounds(), 
        var cor1 = bounds.getNorthEast(), 
        var cor2 = bounds.getSouthWest(), 
        var cor3 = new google.maps.LatLng(cor2.lat(), cor1.lng()), 
        var cor4 = new google.maps.LatLng(cor1.lat(), cor2.lng()), 
        var width = spherical.computeDistanceBetween(cor1,cor3), 
        var height = spherical.computeDistanceBetween( cor1, cor4);
    
        // Loop through your markers
        for(var i=0; i < <size of your marker array>; i++) {
            // Get the distance between the center of the map and your markers
            var distanceFromMarker = google.maps.geometry.spherical.computeDistanceBetween(center, <marker lat/lng>);
    
            if(distanceFromMarker <= width || distanceFromMarker <= height) {
                <load marker>
            }
        }
    }
    
    // Register center and zoom level change events
    google.maps.event.addListener(map, 'center_changed', loadMarker);
    google.maps.event.addListener(map, 'zoom_changed', loadMarker);
    
        2
  •  2
  •   user2622729    13 年前

    谷歌网站有一个专门讨论这个问题的页面,采用了不同的方法来提高性能: https://developers.google.com/maps/articles/toomanymarkers

    特别是“视口标记管理”一章应该包含一些关于如何实现所述内容的有用信息。

        3
  •  2
  •   Dr.Molle    13 年前

    您可以根据DB的要求(例如在bounds_changed上)根据地图的边界请求标记的详细信息。

    数据库应支持的最佳配置 spatial queries (但不是必须的)