API Карт Google: GClientGeocoder.getLatLng () - PullRequest
0 голосов
/ 13 октября 2010

Я использую плагин jQuery http://googlemaps.mayzes.org/ для Карт Google, но возникли проблемы с добавлением маркеров.

Текущая настройка:

Показать содержимое AJAX в толстой коробке, куда загружена карта. Карта загружается нормально и центрируется по геокодированному адресу.

Однако, если вы добавите маркер с геокодированным адресом, ошибки API Карт Google будут выводиться с "a is undefined"

(соответствующий код из плагина)

  if ( markers[i].geocode ) {
    var geocoder = new GClientGeocoder();
    geocoder.getLatLng(markers[i].geocode, function(center) {                    
      if (!center) 
        alert(address + " not found");
      else 
        jQuery.googleMaps.marker[i] = new GMarker(center, {draggable: markers[i].draggable, icon: gIcon});
    });
  }

Заметная часть - geocoder.getLatLng(markers[i].geocode, func..., так как это напрямую вызывает API карт, и после проверки, markers[i].geocode выходит как мой тестовый адрес ("Австралия").

Что я обнаружил, так это то, что, если я загружаю карту в первый раз, она будет центрировать карту, но будет ошибка из-за маркера (и не отображать пользовательский интерфейс). Если я закрою карту памяти и снова загрузлю ее с другим адресом / страной, карта будет нормально загружаться с пользовательским интерфейсом и центром в новом местоположении с маркером в старом адресе / стране .

Несколько раз закрывая и открывая толстый ящик, вы перемещаете центрирование, но маркер всегда будет оставаться на первом адресе / стране.

Есть идеи?

1 Ответ

1 голос
/ 07 декабря 2010

У меня есть исправление, не обязательно решение.Итератор переходит markers.length.Я понятия не имею, почему и исходя из определения цикла это не должно.Если iterator==markers.length I вычесть markers.length из итератора, чтобы сбросить его до 0 для повторного цикла по маркерам.

Я переместил вызов оверлея и в операторы широты / долготы и геокодирования if.Только когда geocoder.getLatLng находит адрес, он может добавить наложение.

Я все еще очищаю код и тестирую.Надеюсь, это поможет.

mapMarkers: function(center, markers) {
        if ( typeof(markers.length) == 'undefined' )
            // One marker only. Parse it into an array for consistency.
            markers = [markers];        
        var j = 0;
        for ( indx = 0; indx<markers.length; indx++) {
            var gIcon = null;
            if ( markers[indx].icon ) {
                gIcon = $.googleMaps.mapMarkersOptions(markers[indx].icon);
            }

            if ( markers[indx].geocode ) {
                var geocoder = new GClientGeocoder();
                geocoder.getLatLng(markers[indx].geocode, function(center) {                                        
                    if (!center) 
                        alert(address + " not found");
                    else 
                        if(true) //if(indx<markers.length || indx>markers.length)
                            {
                            if(indx==markers.length)
                                indx = indx-markers.length;

                                alert(center);
                                $.googleMaps.marker[indx] = new GMarker(center, {draggable: markers[indx].draggable, icon: gIcon});
                                $.googleMaps.gMap.addOverlay($.googleMaps.marker[indx]);
                                if ( markers[indx].info ) {
                                    // Hide Div Layer With Info Window HTML
                                    $(markers[indx].info.layer).hide();
                                    // Marker Div Layer Exists
                                    if ( markers[indx].info.popup )
                                        // Map Marker Shows an Info Box on Load
                                        $.googleMaps.marker[indx].openInfoWindowHtml($(markers[indx].info.layer).html());
                                    else
                                        $.googleMaps.marker[indx].bindInfoWindowHtml( $(markers[indx].info.layer).html().toString() );
                                }
                            }
                });

            }
            else if ( markers[indx].latitude && markers[indx].longitude ) {
                // Latitude & Longitude Center Point
                center = $.googleMaps.mapLatLong(markers[indx].latitude, markers[indx].longitude);
                $.googleMaps.marker[indx] = new GMarker(center, {draggable: markers[indx].draggable, icon: gIcon});
                $.googleMaps.gMap.addOverlay($.googleMaps.marker[indx]);
                if ( markers[indx].info ) {
                    // Hide Div Layer With Info Window HTML
                    $(markers[indx].info.layer).hide();
                    // Marker Div Layer Exists
                    if ( markers[indx].info.popup )
                        // Map Marker Shows an Info Box on Load
                        $.googleMaps.marker[indx].openInfoWindowHtml($(markers[indx].info.layer).html());
                    else
                        $.googleMaps.marker[indx].bindInfoWindowHtml( $(markers[indx].info.layer).html().toString() );
                }
            }

        }
    },
...