3

Googleマップにカスタムマーカーを配置するためにjsでループされている配列があります。マーカーごとに非表示の情報ウィンドウを追加して、クリックしたときに関連する情報ウィンドウが表示されるようにする必要があります。現在、私は次のことを行っています:

for(var i=0; i<google_map_item.length; i++)
    {
        latlon = new google.maps.LatLng(google_map_item[i].lat, google_map_item[i].lon)
        bounds.extend(latlon);
        var iconcolor = google_map_item[i].iconColor;
        marker = new google.maps.Marker({
            map: map,
            position: latlon,
            icon: "https://chart.googleapis.com/chart?chst=d_map_pin_letter_withshadow&chld=" + (i + 1) + "|"+iconcolor+"|000000",
            type: 'flat',
            icon_color: '#ff0000', 
            label_color: '#ffffff', 
            width: '20', 
            height: '20', 
            label_size: '11',
                            clickable: true
        });

        marker.info = new google.maps.InfoWindow({
                        content: '<b>Speed:</b> knots'
                    });

                    google.maps.event.addListener(marker, 'click', function() {
                        marker.info.open(map, marker);
                    });

        map.fitBounds(bounds);
    }

ただし、これにより、どのポイントをクリックしても表示される情報ボックスが 1 つだけ作成されます。

助けてくれてありがとう

4

4 に答える 4

8

このブログ投稿をチェックしてください:

http://you.arenot.me/2010/06/29/google-maps-api-v3-0-multiple-markers-multiple-infowindows/

基本的に、各マーカー オブジェクトを新しいマーカー オブジェクトで上書きします。を使用して、各マーカーをコンテキスト固有にする必要がありますthis

イベント リスナーは次のようになります。

google.maps.event.addListener(marker, 'click', function() {
    marker.info.open(map, this);
});

反復ごとに新しいオブジェクトを確実に作成するために、さらに変更を加える必要がある場合があります。これを試して、私たちに知らせてください!

于 2012-07-16T15:19:45.057 に答える
1

右側の提案から: 各マーカーに InfoWindow を追加する Google Maps API v3

あなたが探している答えのようです(関数クロージャを使用)。

実際の例、xml からの情報ウィンドウのコンテンツ

于 2012-07-16T15:20:55.337 に答える
1

ああ、この問題…… 。

何を求めているのかわからない場合、それは難しいものです。私は数か月前にこれを経験しましたが、StackOverflow であれ、Google マップのドキュメントであれ、正しい答えを見つけるのは恐ろしく困難でした。

このコードが次の人よりも機能する理由を知るつもりはありませんが、私には機能し、プロジェクトに合わせて少し調整すれば、あなたにも機能するはずです.

これが私が使用したコードです。変数名に関しては、私のプロジェクトからいくつかのアーティファクトがありますが、できる限りそのほとんどを取り除き、必要のない部分や変更できる部分をコメントアウトしようとしました。 InfoWindows の望ましい動作。

function initMap(){

    bldgNo =     new Object();  // YOU CAN GET
    bldgName =   new Object();  // RID OF ANY
    bldgAddr =   new Object();  // OF THESE...
    bldgGfx =    new Object();  // 
    mainMeter =  new Object();  // JUST REPLACE
    alarmCount = new Object();  // THEM WITH
    latitude =   new Object();  // WHAT YOU'LL
    longitude =  new Object();  // NEED INSTEAD.
    markersArray = [];

    google.maps.Map.prototype.clearOverlays = function() {
        if (markersArray) {
            for (i in markersArray) {
                markersArray[i].setMap(null);
            }
            markersArray.length = 0;
        }
    }

    location1 = new google.maps.LatLng(22.413543,-137.075743);  // IN CASE YOU'LL NEED MORE
    location2 = new google.maps.LatLng(22.628202,-137.426432);  // THAN ONE LOCATION? I DID.
    myOptions = {
        zoom:15,            // BEST IS BETWEEN 12-15
        scrollwheel:false,  // EITHER TRUE OR FALSE
        center:location1,   // ONE OF THE ABOVE LAT/LNG LOCATIONS
        mapTypeId: google.maps.MapTypeId.HYBRID // ROADMAP, SATELLITE, HYBRID, or TERRAIN (all-caps)
    };
    map =       new google.maps.Map(document.getElementById("map_canvas"),myOptions);
    icon =      new google.maps.MarkerImage('images/YOUR-IMAGE-HERE.png',new google.maps.Size(20,34),new google.maps.Point(0,0),new google.maps.Point(10,34));
    shadow =    new google.maps.MarkerImage('images/YOUR-SHADOW-IMG.png',new google.maps.Size(37,34),new google.maps.Point(0,0),new google.maps.Point(10,34));

    infowindow=new google.maps.InfoWindow();

    var i=1;

    $(".building").each(function(i){

        bldgNo[i] =     $(this).children(".bldg-no").html();        // YOU CAN GET
        bldgName[i] =   $(this).children(".bldg-name").html();      // RID OF ANY
        bldgAddr[i] =   $(this).children(".bldg-address").html();   // OF THESE...
        bldgGfx[i] =    $(this).children(".bldg-graphic").html();   // 
        mainMeter[i] =  $(this).children(".main-meter").html(); // JUST REPLACE
        alarmCount[i] = $(this).children(".alarm-count").html();    // THEM WITH
        latitude[i] =   $(this).children(".latitude").html();       // WHAT YOU'LL 
        longitude[i] =  $(this).children(".longitude").html();      // NEED INSTEAD.

        marker=new google.maps.Marker({
            position:new google.maps.LatLng(
                latitude[i],                        // (DEFINED ABOVE)
                longitude[i]                        // (DEFINED ABOVE)
            ),
            map:map,                                // THE DEFAULT
            shadow:shadow,                          // JUST MY NAME FOR IT (DEFINED ABOVE)
            icon:icon,                              // JUST MY NAME FOR IT (DEFINED ABOVE)
            title:bldgName[i]+" \n"+bldgAddr[i],    // FEEL FREE TO CHANGE THIS BASED ON WHAT YOU NEED
            optimized:false                         // YOU MAY OR MAY NOT NEED THIS
        });
        marker.setAnimation(google.maps.Animation.NULL); // NULL, DROP, or BOUNCE (all-caps)

        markersArray.push(marker);

        google.maps.event.addListener(marker,'click',(function(marker,i){
            return function(){
                infowindow.setContent('

                    //
                    // INSERT INFOWINDOW CONTENT HERE
                    //

                ');infowindow.open(map,marker);
            }
        })(marker,i));

        i++;

    });

}
function updateMap(){

    map.clearOverlays();
    infowindow=new google.maps.InfoWindow();
    var i=1;
    $(".building").each(function(i){

        bldgNo[i] =     $(this).children(".bldg-no").html();        // YOU CAN GET
        bldgName[i] =   $(this).children(".bldg-name").html();      // RID OF ANY
        bldgAddr[i] =   $(this).children(".bldg-address").html();   // OF THESE...
        bldgGfx[i] =    $(this).children(".bldg-graphic").html();   // 
        mainMeter[i] =  $(this).children(".main-meter").html(); // JUST REPLACE
        alarmCount[i] = $(this).children(".alarm-count").html();    // THEM WITH
        latitude[i] =   $(this).children(".latitude").html();       // WHAT YOU'LL 
        longitude[i] =  $(this).children(".longitude").html();      // NEED INSTEAD.

        marker=new google.maps.Marker({
            position:new google.maps.LatLng(
                latitude[i],                        // (DEFINED ABOVE)
                longitude[i]                        // (DEFINED ABOVE)
            ),
            map:map,                                // THE DEFAULT
            shadow:shadow,                          // JUST MY NAME FOR IT (DEFINED ABOVE)
            icon:icon,                              // JUST MY NAME FOR IT (DEFINED ABOVE)
            title:bldgName[i]+" \n"+bldgAddr[i],    // FEEL FREE TO CHANGE THIS BASED ON WHAT YOU NEED
            optimized:false                         // YOU MAY OR MAY NOT NEED THIS
        });
        marker.setAnimation(google.maps.Animation.NULL); // NULL, DROP, or BOUNCE (all-caps)

        markersArray.push(marker);
        google.maps.event.addListener(marker,'click',(function(marker,i){
            return function(){
                infowindow.setContent('

                    //
                    // INSERT UPDATED INFOWINDOW CONTENT HERE
                    //

                ');infowindow.open(map,marker);
            }
        })(marker,i));

        i++;

    });

}

そこからいくつかのねじれを解決する必要があると確信していますが、私のコンピューターにあるコード (あなたの利益のために編集されていないバージョン) は魅力的に機能します。使いやすくするためにコードをコピーして編集するときに誤ってコードを中断した場合は、お知らせください。回答を更新します。

乾杯!



編集:ところで、このコードは非表示の情報ウィンドウ (関数) を作成し、非表示の情報ウィンドウ (initMap関数) を更新しますupdateMapupdateMap設定した間隔で関数を呼び出すと、マップ内の情報が更新されます。これは私のプロジェクトに必要でした。

そのため、ページの InfoWindows が更新されるたびに、非表示のブロックを削除して新しいブロックを作成する必要があったため、非常に似ている/重複しているコード ブロックがあります。

で操作するためだけに作成されたupdateMap関数とアーティファクトを削除することで、必要に応じて非常に簡単に単純化できます。次に、関数を呼び出すだけで準備完了です!initMapupdateMapinitMap

于 2012-07-16T22:56:28.040 に答える
0

インフォウィンドウを扱うときの一般的な方法は、マーカーごとに1つ作成するのではなく、グローバルウィンドウを作成し、それをマーカーごとにクリックイベントにバインドすることだと思います。私はグーグルマーカーで簡単なアプリを作るために作りました、そしてこれは私が使ったものです。お役に立てれば!

    var globalInfoWindow = new google.maps.InfoWindow();
    var offset = new google.maps.Size(17,-10);
    globalInfoWindow.setOptions({pixelOffset: offset});

    .
    .
    .        

    for(var i in data.locations)
    {
      var latlng = data.locations[i];

      var lat = Number(latlng[0]);
      var lng = Number(latlng[1]);

      var marker_latlng = new google.maps.LatLng(lat, lng);
      var marker = new google.maps.Marker({
        position: marker_latlng,
        icon: markerImg,
        map: map
      });


    // binds the showing of infowindow with click event.

      google.maps.event.addListener(marker, 'click', viewLocPic);
    }

    .
    .
    .
    // 'this' in the function refers to the marker itself.
    function viewLocPic()
    {
      console.log("this refers to " + this);
      globalInfoWindow.setPosition(this.getPosition());
      globalInfoWindow.setContent("<img src='cycling.png'/>");
      globalInfoWindow.open(map, this);
    }
于 2012-07-16T15:41:26.443 に答える