5

私のコードは .pantolatlong を実行してから .showinfobox を実行します

pantolatlong を削除しない限り、情報ボックスは表示されません。それを止めているのだろう。endpan イベントに追加しようとしましたが、うまくいきませんでした。

画鋲にパンしてその情報ボックスを表示する最も簡単な方法は何ですか?

私はsetcenterを使用していましたが、setcenterがパンすることがあり、これが壊れることを発見しました。

4

2 に答える 2

4

いくつかの非常識なグーグル検索の後、私は解決策を思いつきました。他の人が私が経験した悲しみを経験しないように、ここで共有します.

SDK や iframe ソリューションを使用せずに、純粋な JavaScript を使用して bing マップを作成し、強化しました。私のコードでは、必要なすべてのピンをマップに追加する JavaScript を生成し、asp.net ラベルを使用して挿入します。

Bing Map で setCenter() メソッドを呼び出すと、指定した座標に驚きのサプライズでマップが即座に設定されるはずです。そして、そうです...ほとんどの場合。ただし、場合によっては、ポイント間でパンすることを決定します。SetCenter を実行し、続いて ShowInfoBox を実行すると、パンを決定しない限り、うまく機能します。

ソリューション?私たちは優れたプログラマーであるため、SDK に飛び込み、これらに対処するためにフックできるイベントがあることを明らかにしました。パンが完了した後にトリガーされる onendpan イベントがあります。マップがジャンプしたときにトリガーされる onchangeview イベントもあります。

そこで、これらのイベントにフックして、画鋲形状の情報ボックスを表示しようとしましたが、何も起こりません。なぜだめですか?

イベントが呼び出されたときに、理由は不明ですが、呼吸を整えるために数ミリ秒を与える必要があります。10 ミリ秒で setTimeout を使用しても問題ないようです。この後、あなたの箱は素晴らしく見えます。

次の問題は、プッシュピン間でフリックするために使用したもの (私の場合は、onclick メソッドを含むテーブル) を介してパンするときにのみ表示することです。その場でイベント ハンドラーを作成/破棄しますが、グローバル変数を使用して、ユーザーがパンしているかどうか、またはシステムがクリックに応答してパンしているかどうかを追跡するなど、他のオプションがあります。

最後に、これから発生するバグが 1 つあります。リスト内の場所をクリックして、その場所にジャンプ/パンすると、インフォボックスが正常に表示されます。ただし、ユーザーがリスト アイテムを閉じてから再度クリックすると、マップは移動しないため、イベントはトリガーされません。

これに対する私の解決策は、長さ/緯度を記録し、別の setTimeout メソッドを使用して、100 ミリ秒後に変更されたかどうかを検出することにより、マップが移動したかどうかを検出することです。そうでない場合は、インフォボックスを表示します。

他にも追跡する必要があるものがあります。イベント ハンドラにパラメータを渡す方法を確認する方法がないため、これにはグローバルな JavaScript 変数を使用します。表示している押しピンの形状を把握し、追跡する必要があります。それらが変更されたかどうかを確認する前に、以前のマップ座標。

これらすべてをつなぎ合わせるのにしばらく時間がかかりましたが、うまくいくようです。これが私のコードです。いくつかのセクションが削除されています:

// An array of our pins to allow panning to them
var myPushPins = [];

// Used by the eventhandler
var eventPinIndex;
var oldMapCenter;

// Zoom in and center on a pin, then show its information box
function ShowPushPin(pinIndex) {
    eventPinIndex = pinIndex;
    oldMapCenter = map.GetCenter();
    map.AttachEvent("onendpan", EndPanHandler);
    map.AttachEvent("onchangeview", ChangeViewHandler);
    setTimeout("DetectNoMapChange();", 200);

    map.SetZoomLevel(9);
    map.SetCenter(myPushPins[pinIndex].GetPoints()[0]);

}


function EndPanHandler(e) {
    map.DetachEvent("onendpan", EndPanHandler);

    setTimeout("map.ShowInfoBox(myPushPins[eventPinIndex]);", 10);

}

function ChangeViewHandler(e) {
    map.DetachEvent("onchangeview", ChangeViewHandler);

    setTimeout("map.ShowInfoBox(myPushPins[eventPinIndex]);", 10);

}

function DetectNoMapChange(centerofmap) {

    if (map.GetCenter().Latitude == oldMapCenter.Latitude && map.GetCenter().Longitude == oldMapCenter.Longitude) {
        map.ShowInfoBox(myPushPins[eventPinIndex]);
    }
}
于 2009-11-23T11:22:37.797 に答える
3

別の方法は次のとおりです。

    function addPushpin(lat,lon,pinNumber) {
    var pinLocation = new Microsoft.Maps.Location(lat, lon);

    var pin = new Microsoft.Maps.Pushpin(map.getCenter(), { text: pinNumber.toString() });

    pinInfobox = new Microsoft.Maps.Infobox(pinLocation,
            { title: 'Details',
                description: 'Latitude: ' + lat.toString() + ' Longitude: ' + lon.toString(),
                offset: new Microsoft.Maps.Point(0, 15)
            });


    map.entities.push(pinInfobox);
    map.entities.push(pin);

    pin.setLocation(pinLocation);
    map.setView({ center: pinLocation});
}
于 2012-11-04T06:03:19.763 に答える