2012-03-20 50 views
3

。 我有50个来自sql的地址。每个地址将在div LocationAddress内呈现。我循环浏览每个地图,并在地图上绘制标记。但它只显示11个。我知道这是因为地理编码器成为瓶颈。我如何使用setinterval或settimeout来控制它?我研究,并且看到了setTimeout的处理this..please有人指导我的人......setinterval或settimeout谷歌地图v3

var geocoder; 
     var map; 
     function initialize() { 
     geocoder = new google.maps.Geocoder(); 
     var latlng = new google.maps.LatLng(42.095287, -79.3185139); 
     var myOptions = { 
      maxZoom: 14, 
      zoom: 9, 
      center: latlng, 
      mapTypeId: google.maps.MapTypeId.ROADMAP, 
     }; 
     map = new google.maps.Map(document.getElementById("map_canvas"), 
      myOptions); 

     } 

    function codeAddress() { 
     var infowindow = new google.maps.InfoWindow({}); 

     $('.LocationAddress').each(function() { 

      var addy = $(this).text(); 
      geocoder.geocode({ 'address': addy}, function(results, status) { 
       if (status == google.maps.GeocoderStatus.OK) { 
         map.setCenter(results[0].geometry.location); 
         var marker = new google.maps.Marker({ 
         position: results[0].geometry.location, 
         map: map,    
         title:addy, 
        }); 

       //Adding a click event to the marker 
       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.setContent('<div id=\"infowindow\" style=" height:100px;>' 
              +'<div id=\"LeftInfo\">'+ "Hello World!" 
              +'</div>'+'</div>'); 
        infowindow.open(map, this); 
       }); 
      } 

      });//Geocoder END 

     }); 
    } 

回答

1

我实际上它编码和测试,这一工作:

var geocoder; 
var map; 
var addresses = new Array(); 
var infowindow; 
var theInterval; 

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(42.095287, -79.3185139); 
    var myOptions = { 
     maxZoom: 14, 
     zoom: 9, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
    }; 
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
    infowindow = new google.maps.InfoWindow({}); 
} 

$(document).ready(function() { 
    getAddresses(); 
    theInterval = setInterval("codeAddress()", 1000); 
}); 

function getAddresses() { 
    $('.LocationAddress').each(function() { 
     addresses.push($(this).text()); 
    }); 
} 

function codeAddress() { 
    if (addresses.length == 0) { 
     clearInterval(theInterval); 
    } 
    var addy = addresses.pop(); 
    geocoder.geocode({ 
     'address': addy 
    }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      map.setCenter(results[0].geometry.location); 
      var marker = new google.maps.Marker({ 
       position: results[0].geometry.location, 
       map: map, 
       title: addy, 
      }); 

      //Adding a click event to the marker 
      google.maps.event.addListener(marker, 'click', function() { 
       infowindow.setContent('<div id=\"infowindow\" style=" height:100px;>' + '<div id=\"LeftInfo\">' + "Hello World!" + '</div>' + '</div>'); 
       infowindow.open(map, this); 
      }); 
     } 

    }); //Geocoder END 
} 
+0

我在哪里使用setInterval函数?在CodeAddress()里面?或codeAddress(){}之后 – 2012-03-21 00:43:48

+0

你在外面做。无论如何,我只是编辑它的部分addresses.length == 0来清除我们所做的时间间隔。 – Mikko 2012-03-21 00:47:08

+0

其中getAddress()被调用?某事破坏了,所以我的地图根本没有显示...当你说'在顶部声明一个包含我们地址和infowindow的变量:'你的意思是让这些全局变量?所以它们可用于任何功能? – 2012-03-21 00:59:27

0

你可以序列化的请求,以便你一次处理一个地址。当那个完成时,你处理下一个。这可以这样做:

function codeAddress() { 
    var infowindow = new google.maps.InfoWindow({}); 

    var addresses = $('.LocationAddress'); 
    var addressIndex = 0; 

    function next() { 
     if (addressIndex < addresses.length) { 
      var addy = addresses.eq(addressIndex).text(); 
      ++addressIndex; 
      geocoder.geocode({ 'address': addy}, function(results, status) { 
       if (status == google.maps.GeocoderStatus.OK) { 
         map.setCenter(results[0].geometry.location); 
         var marker = new google.maps.Marker({ 
         position: results[0].geometry.location, 
         map: map,    
         title:addy, 
        }); 

       //Adding a click event to the marker 
       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.setContent('<div id=\"infowindow\" style=" height:100px;>' 
              +'<div id=\"LeftInfo\">'+ "Hello World!" 
              +'</div>'+'</div>'); 
        infowindow.open(map, this); 
       }); 
       next(); 
      } 

      });//Geocoder END 
     } 
    } 
    next(); 
} 
+0

这仍然只给了我11个标记? – 2012-03-21 00:57:01

+0

@AnjanaSharma - 那么,肯定会在某个地方出现错误。您需要查看错误控制台并在状态代码上执行'console.log(status)'以查明确切地处理了哪些地址以及为什么。这听起来像是一些元素调试的时间。 – jfriend00 2012-03-21 00:59:22