0

Google マップ用の jQuery プラグインhttp://googlemaps.mayzes.org/を使用していますが、マーカーの追加に問題がありました。

現在のセットアップ:

AJAX コンテンツを、マップが読み込まれるシックボックスに表示します。マップは正常に読み込まれ、ジオコーディングされた住所に適切に集中します。

ただし、ジオコーディングされた住所を含むマーカーを追加すると、Google Maps API は「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すると、私のテスト アドレス (「オーストラリア」) として出てきます。

私が見つけたのは、初めてマップをロードすると、マップが中央に配置されますが、マーカーが原因でエラーが発生することです (UI も表示されません)。シックボックスを閉じて、別の住所/国で再度ロードすると、マップが正常にロードされ、UI が表示され、古い住所/国にマーカーが付いた新しい場所が中央に配置されます。

この後、thickbox を複数回閉じて開くと、センタリングが移動しますが、マーカーは常に最初の住所/国に留まります。

何か案は?

4

1 に答える 1

1

必ずしも解決策ではありません。イテレータは を超えmarkers.lengthます。理由はわかりませんが、そうすべきではないループ定義に基づいています。iterator==markers.lengthI をイテレータから減算して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() );
                }
            }

        }
    },
于 2010-12-07T17:03:34.397 に答える