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

Nib*_*Pig 5 bing-maps infobox

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

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

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

我正在使用setcenter,但我发现有时会设置setcenter平底锅,这就打破了它.

Nib*_*Pig 5

经过一番疯狂的谷歌搜索后,我想出了解决方案,我将在这里分享它,以便其他人希望不要经历我所经历的悲伤。

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

如果您在 Bing 地图上调用 setCenter() 方法,它应该会立即将地图设置为您指定的坐标(令人惊讶的是)。大多数时候确实如此。但有时,它会决定在点之间平移。如果您执行 SetCenter,然后执行 ShowInfoBox,那么它将非常有效,除非它决定平移。

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

因此,我们挂钩这些事件,并尝试显示图钉形状的信息框......但什么也没有发生。为什么不?

当事件被调用时,由于未知的原因,你必须给它几毫秒的时间来喘口气。使用 10 毫秒的 setTimeout 似乎没问题。之后你的盒子就会看起来很棒。

下一个问题是,您只希望它在通过您用来使其在图钉之间滑动的任何方式平移时出现(在我的例子中,是一个带有 onclick 方法的表格)。我动态创建/销毁事件处理程序,尽管还有其他选项,例如使用全局变量来跟踪用户是否正在平移,或者系统是否响应于单击而平移。

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

我的解决方案是通过记录地图的经度/纬度来检测地图是否移动,并使用另一个 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)