Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.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 Google maps JS API V3,从远程json源添加多个标记以与infowindows进行映射_Javascript_Google Maps Api 3 - Fatal编程技术网

Javascript Google maps JS API V3,从远程json源添加多个标记以与infowindows进行映射

Javascript Google maps JS API V3,从远程json源添加多个标记以与infowindows进行映射,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我想在谷歌地图上放置多个标记,每个标记都有自己的信息窗口。我需要放置这些标记的数据是动态的,并且是从提供json输出的远程api获得的。json的格式如下: {0 : {lat:"", lng:"", description:"", .....}, 1 : {lat: "", .....}} 等等。它可以包含任意数量的值集。但是,每个集合的格式都已定义。而且,键是这样的,它们可以很容易地迭代。我写的代码如下: var map; var initPos; var marker; var pins

我想在谷歌地图上放置多个标记,每个标记都有自己的信息窗口。我需要放置这些标记的数据是动态的,并且是从提供json输出的远程api获得的。json的格式如下:

{0 : {lat:"", lng:"", description:"", .....}, 1 : {lat: "", .....}}
等等。它可以包含任意数量的值集。但是,每个集合的格式都已定义。而且,键是这样的,它们可以很容易地迭代。我写的代码如下:

var map;
var initPos;
var marker;
var pins;
var infowindow = null;

function count(obj) {
  var i = 0;
  for (var x in obj)
    if (obj.hasOwnProperty(x))
      i++;
  return i;
};

function initialize() {
    var myOptions = {
    zoom: 4,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    infowindow = new google.maps.InfoWindow();

    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
        initPos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
        map.setCenter(initPos);
        }, function() {
            initPos = new google.maps.LatLng(19.074448,72.872314);
            map.setCenter(initPos);
        });
    }
    else {
        initPos = new google.maps.LatLng(19.074448,72.872314);
        map.setCenter(initPos);
    }
    var i, pins, html, pinLatLng, pinMarkers, contentString;
    $.getJSON('/user/map/', function (data) {
        for (i = 0; i < count(data); i++) {
            pins = data[i];
            html = '<h4>'+pins['title']+'</h4>'+'<p>'+pins['description']+'</p>'+'<p><a href="'+pins['url']+'">Read More</a>'
            pinLatLng = new google.maps.LatLng(parseFloat(pins['lat']), parseFloat(pins['lng']));
            pinMarkers = new google.maps.Marker({position: pinLatLng, map: map, animation: google.maps.Animation.Drop});
            contentString = "Some content";
            google.maps.event.addListener(pinMarkers, "click", (function(pinMarkers, i) {
                return function() {
                    infowindow.setContent(html);
                    infowindow.open(map, pinMarkers);
                }
            })(pinMarkers, i));
        }
    });
};
不要关注navigator.geologication部分,而是关注其他内容。现在,这个脚本所做的是,它只在地图上标记json中的最后一个标记,其余的则不显示。我做错了什么?
编辑:所以我在json格式上犯了一个错误,我现在已经纠正了。现在的问题是,所有的信息窗口都显示相同的数据,而不是每个窗口显示不同的数据。不过现在它确实显示了不同的标记。
编辑2:现在开始工作了。按照此处给出的步骤进行操作

是否检查jQuery是否以正确的格式获取JSON数据?jQuery的JS检查非常严格,在这种情况下,我建议使用以下格式:

[{object},{object},{object}]
而不是:

{0:{object},1:{object},2:{object}}
这可能还需要您引用标识符:

{"0":{object},"1":{object},"2":{object}}
因此,在标记函数的第一行之前添加:

console.log(data);
看看结果如何。确认数据正确后,我还建议使用jQuery的$进行循环。每个运算符:

$.each(data,function(key,val){
 //stuff
});

好吧,json正在顺利通过。但它只是在最后一个键上显示。但它只显示了最后一个迭代的标记。以前的都没有。为什么会这样?所以我在修正json格式时犯了一个错误。现在的问题是,所有的信息窗口都显示相同的数据,而不是每个窗口显示不同的数据。不过现在它确实显示了不同的标记。我想这与你使用pinMarkers作为变量有关;每次迭代时,您都将数据分配给同一个对象,显然Google Maps正在处理单独的标记本身,但是对于所有标记,info对象都是相同的。所以声明:pinMarkers=新数组;然后每次迭代:pinMarkers[i]=新的Google.maps。。。等google.maps.event.addListenerpinMarkers[i],点击,functionpinMarkers[i],所以我在修正的json格式中犯了一个错误。现在的问题是,所有的信息窗口都显示相同的数据,而不是每个窗口显示不同的数据。不过现在它确实显示了不同的标记。