如何在bing地图中居和显示信息框?

时间:2009-11-17 13:53:39

标签: bing-maps infobox

我的代码执行.pantolatlong然后是.showinfobox

除非我删除pantolatlong,否则不会出现信息框。我想它正在阻止它。我尝试将它添加到endpan事件中但是没有用。

平移图钉并显示信息框的最简单方法是什么?

我正在使用setcenter,但我发现有时会设置中心盘,这会破坏它。

2 个答案:

答案 0 :(得分:4)

经过一些疯狂的谷歌搜索,我想出了解决方案,我将在这里分享,以便其他人可以希望不会有我经历的悲痛。

我创建并使用纯javascript,没有sdk或iframe解决方案为我的bing地图供电。在我的代码中,我生成了javascript以将我想要的所有引脚添加到地图中,并使用asp.net标签注入它。

如果您在Bing地图上调用setCenter()方法,则应该立即将地图设置为您指定的坐标。它确实......大部分时间。有时候,它决定在点之间平移。如果你做一个SetCenter,然后是一个ShowInfoBox,它会很好用,除非它决定平移。

解决方案?作为优秀的程序员,我们深入了解sdk,它揭示了我们可以用来处理这些事件的事件。有一个onendpan事件,在pan完成后触发。还有一个onchangeview事件,在地图跳转时触发。

所以我们勾结这些事件,并试图为我们的图钉形状显示信息框...但没有任何反应。为什么不呢?

当事件被调用时,你必须给它几毫秒才能屏住呼吸,原因不明。使用10毫秒的setTimeout似乎没问题。在此之后,你的盒子会很棒。

接下来的问题是,你只希望它通过你用来在你的图钉之间轻弹的任何东西进行平移(在我的例子中,是带有onclick方法的表格)。我动态创建/销毁事件处理程序,尽管还有其他选项,例如使用全局变量来跟踪用户是否正在平移,或者系统是否正在平移以响应点击。

最后,你有一个由此产生的错误。如果单击列表中的某个位置,并且它跳转/平移到该位置,则信息框将显示正常。如果用户解散它,然后再次单击列表项,则地图不会移动,因此不会触发任何事件。

我的解决方法是通过记录其长/纬度,并使用另一个setTimeout方法检测地图是否移动,检测它们是否在100毫秒后改变。如果没有,请显示信息框。

还有其他事情你需要跟踪,因为我无法看到将参数传递给eventhandler所以我使用全局javascript变量 - 你必须知道你正在显示哪个图钉形状,以及在检查它们是否发生变化之前,先跟踪以前的mapcoordinates。

我花了一段时间将所有这些拼凑在一起,但似乎有效。这是我的代码,删除了一些部分:

// 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]);
    }
}

答案 1 :(得分: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});
}