2009-11-17 19 views
5

私のコードは、.pantolatlongしてから.showinfoboxビン地図にインフォボックスを配置して表示するにはどうすればよいですか?

パンタラートーンを削除しない限り、情報ボックスは表示されません。私はそれがそれを停止していると思います。私はそれをエンドパンイベントに追加しようとしましたが、うまくいかなかったのです。

プッシュピンにパンしてインフォボックスを表示する最も簡単な方法は何ですか?

私はsetcenterを使用していましたが、ときどきsetcenterがパンしてしまうことが判明しました。

答えて

4

私はいくつかの精神的なグーグルで、私は解決策を思いついたので、他の人がうまくいけば私が経験したことがないようにここで分かち合います。

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

BingマップでsetCenter()メソッドを呼び出すと、指定した座標に驚きの驚きのマップが即座に設定されます。そして、それは...ほとんどの時間です。時には、ポイント間を移動することを決定します。あなたがSetCenterを実行し、その後にShowInfoBoxを実行すると、それがパンすることを決定しない限り、それはうまくいくでしょう。

解決策はありますか?私たちはすばらしいプログラマーであり、SDDに潜入し、これらの問題に対処するためのイベントがあることが明らかになりました。 onendpanイベントがあり、パンが完了した後にトリガーされます。 onchangeviewイベントもあり、マップがジャンプしたときにトリガされます。

私たちはこれらのイベントに突き当たり、私たちの圧倒的な形の情報を表示しようとします...しかし何も起こりません。何故なの?

イベントが呼び出されたときに不明な理由により、息を止めるのに数ミリ秒かかることがあります。 10ミリ秒でsetTimeoutを使用すると問題はないようです。あなたの箱はこれの後で大きく表示されます。

次の問題は、あなただけそれはあなたがそれはあなたの画鋲の間でフリック作るために使用されるものは何でも経由でパンするとき、それを表示させたい、です(私の場合には、onclickの方法で表)。そのようなユーザーがパンされている場合、またはシステムがクリックに反応して、パンニングされた場合に追跡するために、グローバル変数を使用するなど、他のオプションがありますが、私は、作成/その場でイベントハンドラを破壊します。

最後に、これに起因する1つのバグがあります。あなたのリスト内の場所をクリックすると、その場所に移動/パンすると、infoboxは正常に表示されます。ユーザーはしかし、それを閉じる場合は、リスト項目をもう一度クリックし、その後、マップが移動しないので、何のイベントがトリガされません。これ

私の解決策は、マップが移動したりしない場合は緯度/長い記録、および他の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]); 
    } 
} 
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}); 
} 
関連する問題