Google maps JS API V3, добавить несколько маркеров на карту с помощью infowindows из удаленного источника json

#javascript #google-maps-api-3

#javascript #google-maps-api-3

Вопрос:

Я хочу разместить несколько маркеров на карте Google, каждый со своим собственным infowindow. Данные, которые мне нужны для размещения этих маркеров, являются динамическими и получены из удаленного API, который предоставляет вывод json. 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.geolocation, но посмотрите на другие вещи. Теперь, что делает этот скрипт, он отмечает только последний маркер в json на карте, а остальные не отображаются. Что я делаю не так?
РЕДАКТИРОВАТЬ: Итак, я допустил ошибку в формате json, которую я сейчас исправил. Теперь проблема в том, что все infowindows отображают одни и те же данные, а не разные для каждого. Однако теперь он показывает разные маркеры.
EDIT2: теперь он работает. Следуйте инструкциям, приведенным здесь http://you.arenot.me/2010/06/29/google-maps-api-v3-0-multiple-markers-multiple-infowindows

Комментарии:

1. Итак, я допустил ошибку в формате json, которую я исправил. Теперь проблема в том, что все infowindows отображают одни и те же данные, а не разные для каждого. Однако теперь он показывает разные маркеры.

Ответ №1:

Вы проверили, что jQuery получает данные JSON в правильном формате? jQuery может быть очень строгим при проверке JS, и в этом случае я бы рекомендовал формат:

 [{object},{object},{object}]
  

вместо:

 {0:{object},1:{object},2:{object}}
  

для этого также может потребоваться указать идентификаторы:

 {"0":{object},"1":{object},"2":{object}}
  

Итак, перед первой строкой вашей функции marker добавьте:

 console.log(data);
  

и посмотрите, что из этого получится. Как только вы подтвердите правильность данных, я бы также рекомендовал выполнить цикл с помощью оператора jQuery $.each:

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

Комментарии:

1. Что ж, json проходит нормально. Однако он просто отображает его по последнему ключу. Однако он просто показывает последний повторенный маркер. Ни один из предыдущих. Почему это может быть?

2. Итак, я допустил ошибку в формате json, которую я исправил. Теперь проблема в том, что все infowindows отображают одни и те же данные, а не разные для каждого. Однако теперь он показывает разные маркеры.

3. Я бы предположил, что это связано с вашим использованием pinMarkers в качестве переменной; каждый раз, когда вы выполняете итерацию, вы присваиваете данные одному и тому же объекту, очевидно, что Google Maps сам обрабатывает создание отдельных маркеров, но объект info одинаков для всех них. Итак, объявите: pinMarkers=new Array(); Затем каждая итерация: pinMarkers[i]=new Google.maps... etc google.maps.event.addListener(pinMarkers[i], "click", (function(pinMarkers[i],