如何在Virtual Earth中找到鸟瞰场景的确切纬度/经度坐标?

时间:2008-08-28 15:38:43

标签: javascript virtual-earth

在鸟瞰视图中,我正试图找到地图角落的纬度和经度。我希望能够在地图上绘制图钉,但我有数十万个地址,我希望能够限制到需要在地图上显示的地址。

在普通视图中,VEMap.GetMapView()。TopLeftLatLong和.BottomRightLatLong返回我需要的坐标;但在Birdseye视图中,它们返回空白(或加密值)。 SDK建议使用VEBirdseyeScene.GetBoundingRectangle(),但这会返回距离我的场景中心最多2英里的边界,在主要城市中仍会返回太多地址。

在以前版本的VE Con​​trol中,我可以使用一个未记录的VEDecoder对象来解密鸟眼场景的LatLong值,但是这个对象似乎已经消失(可能已经重命名)。如何在版本6.1中解码这些值?

5 个答案:

答案 0 :(得分:2)

以下是获取地图中心纬度/长点的代码。此方法适用于Road / Aerial和Birdseye / Oblique地图样式。

function GetCenterLatLong()
        {
            //Check if in Birdseye or Oblique Map Style
            if (map.GetMapStyle() == VEMapStyle.Birdseye || map.GetMapStyle() == VEMapStyle.BirdseyeHybrid)
            {
                //IN Birdseye or Oblique Map Style


                //Get the BirdseyeScene being displayed
                var birdseyeScene = map.GetBirdseyeScene();


                //Get approximate center coordinate of the map
                var x = birdseyeScene.GetWidth() / 2;
                var y = birdseyeScene.GetHeight() / 2;

                // Get the Lat/Long 
                var center = birdseyeScene.PixelToLatLong(new VEPixel(x,y), map.GetZoomLevel());

                // Convert the BirdseyeScene LatLong to a normal LatLong we can use
                return (new _xy1).Decode(center);
            }
            else
            {
                // NOT in Birdseye or Oblique Map Style
                return map.GetCenter();
            }
        } 

此代码是从这里复制的: http://pietschsoft.com/post/2008/06/Virtual-Earth-Get-Center-LatLong-When-In-Birdseye-or-Oblique-Map-Style.aspx

答案 1 :(得分:2)

在我看来,这个问题的示例解决方案只能在屏幕上找到当前地图的中心,就好像这总是你要点击的地方!无论如何,我写了这个小函数来获取你在屏幕上点击的实际像素位置并为此返回一个VELatLong。到目前为止它看起来非常准确(尽管我认为这是一个大而可怕的黑客 - 但它不像我们现在有选择)。

它需要一个VEPixel作为输入,它是您在地图上单击的位置的x和y坐标。您可以轻松地将鼠标事件传递给地图的onclick处理程序。

function getBirdseyeViewLatLong(vePixel)
{
    var be = map.GetBirdseyeScene();

    var centrePixel = be.LatLongToPixel(map.GetCenter(), map.GetZoomLevel());

    var currentPixelWidth = be.GetWidth();
    var currentPixelHeight = be.GetHeight();

    var mapDiv = document.getElementById("map");
    var mapDivPixelWidth = mapDiv.offsetWidth;
    var mapDivPixelHeight = mapDiv.offsetHeight;

    var xScreenPixel = centrePixel.x - (mapDivPixelWidth / 2) + vePixel.x;
    var yScreenPixel = centrePixel.y - (mapDivPixelHeight / 2) + vePixel.y;

    var position = be.PixelToLatLong(new VEPixel(xScreenPixel, yScreenPixel), map.GetZoomLevel())
    return (new _xy1).Decode(position);
}

答案 2 :(得分:1)

从VEMap.GetCenter方法文档:

  

此方法在地图时返回null   style设置为VEMapStyle.Birdseye或   VEMapStyle.BirdseyeHybrid。

这是我发现的,但是:

var northWestLL = (new _xy1).Decode(map.GetMapView().TopLeftLatLong);
var southEastLL = (new _xy1).Decode(map.GetMapView().BottomRightLatLong);

(new _xy1)似乎与旧的未记录的VEDecoder对象相同。

答案 3 :(得分:0)

根据http://dev.live.com/virtualearth/sdk/,这应该可以解决问题:

function GetInfo()         
{
  alert('The latitude,longitude at the center of the map is: '+map.GetCenter());         
}

答案 4 :(得分:0)

Bing地图使用条款中的一个有趣点 http://www.microsoft.com/maps/product/terms.html

使用鸟瞰航拍图像的限制: 您可能无法显示纬度,经度,海拔高度或其他元数据;