Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript API v3的谷歌地图中没有显示多个标记?_Javascript_Google Maps_Google Maps Api 3 - Fatal编程技术网

使用Javascript API v3的谷歌地图中没有显示多个标记?

使用Javascript API v3的谷歌地图中没有显示多个标记?,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我想知道如何使用JavaScriptAPI v3为Google地图放置多个标记 我尝试了发布的解决方案,但由于某些原因,它对我无效: var directionDisplay; function initialize() { var myOptions = { zoom: 9, center: new google.maps.LatLng(40.81940575,-73.95647955), mapTypeId: google.maps.MapTypeId.TERRAIN

我想知道如何使用JavaScriptAPI v3为Google地图放置多个标记

我尝试了发布的解决方案,但由于某些原因,它对我无效:

var directionDisplay;

function initialize() {        
  var myOptions = { zoom: 9, center: new google.maps.LatLng(40.81940575,-73.95647955), mapTypeId: google.maps.MapTypeId.TERRAIN }
  var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  setMarkers(map, properties);

  var properties = [
    ['106 Ft Washington Avenue',40.8388485,-73.9436015,'Mjg4'],
  ];

  function setMarkers(map, buildings) {
    var image = new google.maps.MarkerImage('map_marker.png', new google.maps.Size(19,32), new google.maps.Point(0,0), new google.maps.Point(10,32));
    var shadow = new google.maps.MarkerImage('map_marker_shadow.png', new google.maps.Size(28,32), new google.maps.Point(0,0), new google.maps.Point(10,32));
    var bounds = new google.maps.LatLngBounds;
    for (var i in buildings) {
      var myLatLng = new google.maps.LatLng(buildings[i][1], buildings[i][2]);
      bounds.extend(myLatLng);
      var marker = new google.maps.Marker({ position: myLatLng, map: map, shadow: shadow, icon: image, title: buildings[i][0] });
      google.maps.event.addListener(marker, 'click', function() { window.location = ('detail?b=' + buildings[i][3]); });
    }
    map.fitBounds(bounds);  
  }
}
</script>
var方向显示;
函数初始化(){
var myOptions={zoom:9,中心:new google.maps.LatLng(40.81940575,-73.95647955),mapTypeId:google.maps.mapTypeId.TERRAIN}
var map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
设置标记(地图、属性);
变量属性=[
['106英尺华盛顿大道',40.8388485,-73.9436015,'Mjg4'],
];
功能设置标记(地图、建筑物){
var image=new google.maps.MarkerImage('map_marker.png',new google.maps.Size(19,32),new google.maps.Point(0,0),new google.maps.Point(10,32));
var shadow=new google.maps.MarkerImage('map_marker_shadow.png',new google.maps.Size(28,32),new google.maps.Point(0,0),new google.maps.Point(10,32));
var bounds=new google.maps.LatLngBounds;
用于(建筑物中的var i){
var mylatng=new google.maps.LatLng(buildings[i][1],buildings[i][2]);
扩展(myLatLng);
var marker=new google.maps.marker({position:mylatng,map:map,shadow:shadow,icon:image,title:buildings[i][0]});
google.maps.event.addListener(标记,'click',function(){window.location=('detail?b='+buildings[i][3]););
}
映射边界(bounds);
}
}

谁能解释一下为什么这对我不起作用吗?

这个问题已经有几个月了,但我注意到它仍然没有得到回答。我想OP已经找到了解决这个问题的方法,但是为了完整起见,让我尝试一个答案


我可以在上面的代码中发现几个主要问题:

  • 首先,在定义
    properties
    之前,您试图将
    properties
    数组传递给
    setMarkers()
    函数。因此,对于第二个参数,
    setMarkers()
    将接收
    undefined
    ,这就是为什么地图上没有显示任何内容

  • 然后,您将在该
    for in
    循环中使用。封闭在一个闭包中的变量共享同一个环境,因此当调用来自
    addListener
    click
    回调时,循环将已经运行,并且
    i
    变量将左指循环结束时的最后一个值

  • 此外,数组文字中还有一个悬空逗号,这可能会在某些浏览器中导致语法错误


  • 要解决第一个问题,只需在调用
    setMarkers()
    之前定义
    properties
    数组:

    然后,您可以使用函数工厂使用更多闭包来解决闭包问题:

    function makeClickCallback(buildings, i) {  
       return function() {  
          window.location = ('detail?b=' + buildings[i][3]);
       };  
    } 
    
    for (var i in buildings) {
       // ...
    
       google.maps.event.addListener(marker, 'click', 
                                     makeClickCallback(buildings, i);
    }
    
    如果您不熟悉闭包的工作方式,这可能是一个相当棘手的话题。您可以查看以下Mozilla文章以获得简要介绍:

    然后,您可能需要确保删除数组文字中的悬空逗号:

    var properties = [
      ['106 Ft Washington Avenue',40.8388485,-73.9436015,'Mjg4']  // no comma
    ];
    
    此外,请注意,由于
    properties
    数组中只有一个元素,因此在地图上只能得到一个标记。我不确定是否为了本例而删除了其他元素,但如果没有,只需添加更多类似以下的位置:

    var properties = [
      ['106 Ft Washington Avenue',40.8388485,-73.9436015,'Mjg4'],
      ['Another Location',50.505050,-75.505050,'Mjg5']
    ];
    

    欢迎来到SO。你会犯什么错误?在哪一点调用initialize()?地图根本不显示任何标记,而是在Winslow Reef中显示一个区域。没有我所期望的华盛顿。我想显示多个标记。请在主体上调用helpinitialize()
    var properties = [
      ['106 Ft Washington Avenue',40.8388485,-73.9436015,'Mjg4'],
      ['Another Location',50.505050,-75.505050,'Mjg5']
    ];