【问题标题】:Javascript google maps creating markers from xml dataJavascript 谷歌地图从 xml 数据创建标记
【发布时间】:2014-08-05 02:40:24
【问题描述】:

-我有这个代码,我正在 Mozilla 上测试它。此代码应在地图上进行大量标记。我有 XML 文件中标记的纬度和经度。当它运行它时,它会冻结浏览器几秒钟并只制作 15 个标记。控制台说这是“太多递归”。我也尝试使用 for(var i =0;i

var map;
var i =0;
var xmldoc=loadXMLDoc("skoly.xml");
var x= xmldoc.getElementsByTagName("skoly");
var image = {url: 'images/blackmarker.png',
                    anchor: new google.maps.Point(0, 10)};

function loop(){

 createMarker(function(){loop();});
 }

  function createMarker(callback) {
  var location =new google.maps.LatLng (xmldoc.getElementsByTagName("gps_latitude")[i].childNodes[0].nodeValue,xmldoc.getElementsByTagName("gps_longitude")[i].childNodes[0].nodeValue);
  var marker = new google.maps.Marker({
        position: location,
        map:map,
        icon: image
         });
         i++;
  if(i < x.length)callback();       
         }

function initialize() {
  var startlatlng = new google.maps.LatLng(49.8037633,15.4749126,7);
  var mapOptions = {
    zoom: 7,
    center: startlatlng
  }
  map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); 
  loop();
}
google.maps.event.addDomListener(window, 'load', initialize);

带有for循环的代码:

var map;
var xmldoc=loadXMLDoc("skoly.xml");
var x= xmldoc.getElementsByTagName("skoly");
var image = {url: 'images/blackmarker.png',
                    anchor: new google.maps.Point(0, 10)};
  function createMarker(i) {
  var location =new google.maps.LatLng (xmldoc.getElementsByTagName("gps_latitude")[i].childNodes[0].nodeValue,xmldoc.getElementsByTagName("gps_longitude")[i].childNodes[0].nodeValue);
  var marker = new google.maps.Marker({
        position: location,
        map:map,
        icon: image
         });       
         }

function initialize() {
  var startlatlng = new google.maps.LatLng(49.8037633,15.4749126,7);
  var mapOptions = {
    zoom: 7,
    center: startlatlng
  }
  map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);  
  for(var i =0;i < x.length;i++){createMarker(i);}
}
google.maps.event.addDomListener(window, 'load', initialize);

XML 文件看起来像:

  <DocumentElement>
    <skoly>
      <stuff1>someting</stuff1>
      <stuff2>something</stuff2>    
      <gps_latitude>49,2816216</gps_latitude>
      <gps_longitude>15,4402835</gps_longitude>
   </skoly>
   <skoly>
     .
     .
   </skoly>
</DocumentElement>

【问题讨论】:

    标签: javascript xml google-maps


    【解决方案1】:

    您的 loop()createMarker() 函数是相互递归的,这意味着它们相互调用。

    如果我们去掉谷歌地图代码,简化 loop() 函数,并重命名回调参数,你会更清楚地看到这一点:

    function loop() {
      createMarker(loop);
    } 
    
    function createMarker(loop) {
      i++;
      if(i < x.length) loop();
    }
    

    loop() 调用 createMarker(),后者又调用 loop()——直到它在 x 集合。调用堆栈大小将是 x 长度的两倍,这会在集合很大时导致“递归过多”错误。

    for 循环在这种情况下应该工作得更好,但我们需要查看您的 for 循环代码(可能还有 XML 文件)才能知道为什么会这样失败。

    【讨论】:

    • 这有帮助,谢谢。将 XML 文件的经纬度坐标中的逗号更改为句点,这样您就可以开始了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2013-05-14
    • 1970-01-01
    • 2011-11-15
    • 2016-04-24
    • 2018-09-26
    相关资源
    最近更新 更多