4

Google Maps JavaScript API V2 を使用して、配列に保存された場所をマークしています。座標の異なるマーカーはうまく表示されますが、同じ座標でさまざまなマーカーを表示する方法がわかりません。場所の配列は同じ座標を持つことができますが、説明が異なるため、必要です。これらの異なる説明を表示する方法は何ですか?

マーカーが追加されるコードは次のとおりです。

var map;

    function loadEarth(mapdiv) {
        if (GBrowserIsCompatible()) {
            if(!mapdiv)
                return true;
            map=new GMap2(document.getElementById("map"));
            map.enableDoubleClickZoom();
            map.enableScrollWheelZoom();
            map.addControl(new GMapTypeControl());
            map.addControl(new GSmallMapControl());
            map.setCenter(new GLatLng(40.186718, -8.415994),13);
            }
    }
    function createMarker(point, number, description) {
        var marker = new GMarker(point);
        marker.value = number;
        GEvent.addListener(marker, "click", function() {
        var myHtml = "<b>#" + number + "</b><br/>" + description;
            map.openInfoWindowHtml(point, myHtml);
        });
        return marker;
    }

...

for(var i=0; i<gl_list.length; i++){
   var point = new GLatLng(gl_list[i].Latitude,gl_list[i].Longitude);
   description = "Visited place : "+gl_list[i].nome+" on : "+gl_list[i].data;
   map.addOverlay(createMarker(point, i + 1, description));
}

ご清聴ありがとうございました。

4

5 に答える 5

6

マップ上でまったく同じ問題が頻繁に発生し、同じ複数のマーカーの問題について心配していることに気付きました。どのマーカーが一番上にあるのでしょうか? ユーザーはそれらすべてをどのように見るのでしょうか? 等

最終的に、問題は実際にはマーカーに関するものではないと判断しました。マップ上の特定のポイントについてです。ユーザーの観点から見ると、マーカーやマーカー周辺のメカニズムはあまり気にしません。彼らが本当に気にかけているのは、その場所に関連付けられた情報だけです。その観点から、課題は、関連する情報を簡単な方法で表示する方法をユーザーに提供する方法を見つけることです。そこで、同じ場所を占めるすべてのマーカーを、ユーザーにとって重要なすべての情報を含む 1 つのマーカーに統合することにしました。

ステップごとに、同じ場所の問題で複数のマーカーを解決するために使用するアプローチを次に示します。

ステップ 1:マーカー データを並べ替えて、同じ位置を占めるマーカーを識別できるようにします。

gl_list.sort( function( a, b ) {
    var aLat = a.Latitude, bLat = b.Latitude;               
    if ( aLat !== bLat ) { return aLat - bLat; }
    else { return a.Longitude - b.Longitude; }
});

ステップ 2:gl_list配列の同じ場所にあるメンバーの「特別な」マーカーを作成する新しい関数を追加します

var specialMarkers = null;

function createSpecialMarker( specialMarkers ) {
    var infoWinContent = "<table class='special-infowin-table'>";

    for ( var i = 0; i < specialMarkers.length; i++ ) {
        infoWinContent +=
            "<tr>" +
            "<td class='special-table-label'>" +
                "Visited Place [" + (i+1) + "]" +
            "</td>" + 
            "<td class='special-table-cell'>" +
                specialMarkers[i].nome + " on : " + specialMarkers[i].data +
            "</td></tr>";
    }
    infoWinContent += "</table>";

    var mrkrData = specialMarkers[0];
    var point = new GLatLng( mrkrData.Latitude, mrkrData.Longitude );
    var marker = new GMarker( point );
    GEvent.addListener(marker, "click", function() {
    map.openInfoWindowHtml( point, infoWinContent );
});

    return marker;
}

ステップ 3:マーカー データを反復処理し、同じ場所にあるグループを特定し、特別なマーカーを使用してそれらをマップ上に表示し、他の場所にあるすべてのマーカー データを「通常どおり」処理します。

for ( var i = 0; i < gl_list.length; i++ ) {
    var current = gl_list[i];
    var coLocated = null;
    var j = 0, matchWasFound = false;

    if ( i < ( gl_list.length - 1 ) ) {
        do {
            var next = assetData[ i + ++j ];
            if ( next !== undefined ) {    //just to be safe
                if ( next.Latitude === current.Latitude &&
                        next.Longitude === current.Longitude ) {
                    matchWasFound = true;
                    if ( coLocated === null ) {
                        coLocated = new Array( current, next);
                    }
                    else { coLocated.push( next ); }
                }
                else { matchWasFound = false; }
            }
            else { matchWasFound = false; }
        }
        while ( matchWasFound )

        if ( coLocated != null ) {
           var coLoMarker = createSpecialMarker( coLocated );
            if ( specialMarkers === null ) {
                specialMarkers = new Array( coLoMarker );
            }
            else {
                specialMarkers.push( coLoMarker );
            }

            i += --j;
            continue;
        }

        var point = new GLatLng(gl_list[i].Latitude,gl_list[i].Longitude);
        description = "Visited place : "+gl_list[i].nome +
                        " on : " + gl_list[i].data;
        map.addOverlay( createMarker( point, i + 1, description ) );
    }
}

アイデアは、単一のマーカーを生成し、InfoWindow が重要な場所に関する複数の情報を伝達できるようにすることであり、最終的には次のようになります。

ここに画像の説明を入力

この実際のコードはまだ実行していませんが、毎日実行されるコードに基づいています。これは、少し調整とデバッグが必要になる可能性があることを理解したうえで、アプローチをかなり詳細に見て、使用可能なソリューションにかなり近づけるコード本体を共有することを目的としています。

于 2012-05-20T14:30:41.627 に答える
5

同じ座標にマーカーを表示するには、MarkerCluster または Marker Spiderfier を試すことができます

MarkerCluster :デモ

Marker Spiderfier :デモ

于 2012-05-20T08:50:35.833 に答える
2

カスタム アイコンを使用して、同じ座標を持つ複数の場所を表すことを考えたことはありますか? ボタンのように見える追加のマーカー ポイントを共通の場所 (+/- .00001 緯度) のすぐ左と右に追加するよりも、上で提案したように、すべての共通の場所を 1 つのマーカー ポイントにまとめることができます。クリック イベントをサロゲート ポイントにアタッチするよりも、マーカー ポイントをクリックすることで、共有された場所のポイント間で反復処理を行うことができます。配列に表示されている現在のマーカーに基づいて、次のマーカーと前のマーカーを非表示または無効にすることもできます。

于 2012-05-15T06:01:00.217 に答える
0

アイデアの 1 つは、一意の場所のみをプロットし、説明を場所レベルにロールアップすることです。オーバーレイの場合、その場所の場所の完全なリストを表示できます。

于 2012-05-09T00:47:55.723 に答える