每次平移和缩放时数据加载

时间:2015-06-23 16:45:53

标签: javascript google-maps google-maps-api-3

我正在根据地图的当前边界框(或视口)将JSON数据添加到Google地图。问题是,即使是最轻微的平移或缩放也会重绘该数据。如何在加载数据后才能这样做,它不需要重绘(或重新加载)?

这是我正在使用的事件:

google.maps.event.addListener(map, 'idle', function () {
  if (map.getZoom() > 12) {
    bBox = getBB(); // get current bounding box
      $.ajax({
        url: '/getdata',
        type: 'POST',
        data: JSON.stringify(bBox),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (ai) {
          addToMap(ai);
        }
     });
   } else {
     map.data.forEach(function(feature) {
       map.data.remove(feature);
     });
   }
});

1 个答案:

答案 0 :(得分:0)

我认为双重解决方案可行:修改选择要加载到地图的数据的方法,然后在地图处于非活动状态的短暂时间后加载数据。

可能会在被触发的idle事件和重新加载数据的地图之间添加延迟。这可以通过全局setTimeout来完成,每当地图空闲时都会更新。{/ p>

var loadDelay = setTimeout(function(){},0);

google.maps.event.addListener(map, 'idle', function(){
  clearTimeout(loadDelay);
  loadDelay = setTimeout(function(args){old_function(args)}, delayTime); //choose time between idle and load
});

此外,您可以将数据块化为方形区域,并检查地图边界内的哪些区域已经加载,然后不要将这些区域加入到地图中。

修改

跟踪数据将分为两步。首先是更改单个查询的边界。其次是保持一系列已经加载的大小均匀的区域。类似的东西:

var loaded = [];
function load(bounds){
  var north = bounds.getNorthEast().lat();
  var south = bounds.getSouthWest().lat();
  var east = bounds.getNorthEast().lng();
  var west = bounds.getSouthWest().lng();
  for(var lat=parseFloat(south.toFixed(1)); lat<north; lat += 0.1){ //or some other interval
    for(var lng=parseFloat(west.toFixed(1)); lng<east; lng += 0.1){
      if(!(south+','+west in loaded)){
        import(south, west); //function to get and display information
        loaded.push(south+','+west);
      }
    }
  }
}

这样的系统应该加载尚未加载的部分数据。