0

だから私は閉鎖の問題についてたくさん読んだことがあります。それがこれだと思いますが、修正方法がわかりません。

問題:基本的に、1 つのマーカーしか取得できません。これは、同じ「マーカー」変数を使用しているためだと思いますか? しかし、よくわかりませんし、それを修正する簡単な解決策もわかりません。明らかな何かがあると確信しており、必要な結果が得られるまでただそれを台無しにする私とは対照的に、実際に Javascript を知っている人から手を借りたいと思っています。

ありがとう!

<script>
var geocoder;
var map;
var markersArray = [];
var plocation = [];

function initialize() {
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(39.50, -98.35);
var myOptions = {
    zoom: 4,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
}

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

function codeAddress() {
    //Delete Existing Markers
    clearOverlays();
    deleteOverlays();
    //Geocode and Add the New One + Results.
    var address = document.getElementById("address").value;
    geocoder.geocode( { 'address': address}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        map.setCenter(results[0].geometry.location);
        //add the center marker
        var patientslocation =results[0].geometry.location;
        addMarker(patientslocation, "Patient");
        //Zoom in on the Region.
        map.setZoom(10);
        //Call to Our API
        $.getJSON("map/search", { provider_type: "01", loc: '"'+patientslocation+'"' },function(data) {
            //Parse Results
            var htmlstring = "";
            var arraylength = data.length-1;
            console.log("Result Count (base 0): "+arraylength)
            $(data).each(function(i,val){

                //Build HTML String for Side Bar
                if (val.name){
                    htmlstring = htmlstring + "<h3>"+val.name+"</h3>";
                }
                if (val.address){
                    htmlstring = htmlstring + val.address +"<br/>";
                }
                if (val.phone){
                    htmlstring = htmlstring +val.phone +"<br/>";
                }
                //Build HTML Strings for Each Marker Hover

                //Load the Array of Markers
                plocation[i] = new google.maps.LatLng(val.lat, val.lng);
                console.log(i +" : " +plocation[i]);

                if(i === arraylength){
                    console.log("Load plocations called")
                    load_plocations();
                }
            });
            $('#prov_list').html(htmlstring);

        });

} else {
    alert("Geocode was not successful for the following reason: " + status);
}
});
}

function load_plocations(){
    $(plocation).each(function(k,v){
        console.log("Calling AddMarker: "+v)
        addMarker(v,k);
    });
}

function addMarker(location, name) {
   console.log("Adding Marker: "+location)
    marker = new google.maps.Marker({
        position: location,
        map: map
    });
    markersArray.push(marker);
}
//Clears the Markers from the map.
function clearOverlays() {
    console.log("Clearing Overlays");
    if (markersArray) {
        for (i in markersArray) {
            markersArray[i].setMap(null);
        }
    }
}

// Deletes all markers in the array by removing references to them
function deleteOverlays() {
    console.log("Deleting Overlays");
    if (markersArray) {
        for (i in markersArray) {
            markersArray[i].setMap(null);
        }
        markersArray.length = 0;
    }
}

4

2 に答える 2

2

varを使用してマーカーを宣言してみてください:

var marker = new google.maps.Marker({

これにより、ローカルスコープのオブジェクトになり、反復ごとに新しいオブジェクトが作成されます。

varがないと、グローバルになります(つまり、ウィンドウオブジェクトにスコープされます)。100%確信はありませんが、これは、あなたが書いたように、新しいマーカーを作成するのではなく、各反復で同じマーカーを上書きする可能性があると思います。

于 2012-07-05T21:56:09.473 に答える
1

ジオコーダーは、レート制限とクォータの対象となります。Web ページを表示するために「その場で」複数のポイントをジオコーディングすることは決して良い考えではありませんでした。これは、ループで実行しようとしているものであり、少数のマーカーに対してのみ機能します。以下は、 AJAX 経由で転送された xml からアドレスのリストをジオコーディングする(v2 API を使用した) 例です。

これは、ジオコーディング戦略について説明している google maps API v3 ドキュメントの一部である記事です。

最善の解決策は、ポイントが事前にわかっている場合、それらをオフラインでジオコーディングし、ページの読み込み時に使用するために座標を保存することです。ユーザーが入力する場合は、API に組み込まれているクライアント側のジオコーダーを使用します。

于 2012-07-06T00:00:36.890 に答える