Как найти точные координаты широты / долготы сцены птичьего полета в Virtual Earth? - PullRequest
3 голосов
/ 28 августа 2008

Я пытаюсь найти широту и долготу углов моей карты в режиме птичьего полета. Я хочу иметь возможность наносить булавки на карту, но у меня есть сотни тысяч адресов, которые я хочу ограничить теми, которые должны отображаться на карте.

В обычном представлении VEMap.GetMapView (). TopLeftLatLong и .BottomRightLatLong возвращают нужные мне координаты; но в Birdseye они возвращают пустые (или зашифрованные значения). SDK рекомендует использовать VEBirdseyeScene.GetBoundingRectangle (), но это возвращает границы до двух миль от центра моей сцены, что в крупных городах все еще возвращает слишком много адресов.

В предыдущих версиях VE Control был недокументированный объект VEDecoder, который я мог использовать для расшифровки значений LatLong для сцен с птичьим глазом, но этот объект, похоже, исчез (вероятно, был переименован). Как я могу декодировать эти значения в версии 6.1?

Ответы [ 5 ]

2 голосов
/ 14 мая 2009

Мне всегда кажется, что примеры решений этой проблемы только находят центр текущей карты на экране, как будто это всегда то место, куда вы собираетесь щелкнуть! В любом случае, я написал эту маленькую функцию, чтобы получить фактическое местоположение пикселя, которое вы щелкнули по экрану, и вернуть для этого 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 голосов
/ 16 сентября 2008

Вот код для получения центральной широты / длинной точки карты. Этот метод работает в стилях 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 голос
/ 02 сентября 2008

Из документации по методу VEMap.GetCenter:

Этот метод возвращает ноль, когда карта стиль установлен в VEMapStyle.Birdseye или VEMapStyle.BirdseyeHybrid.

Вот что я нашел:

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

(new _xy1), кажется, работает так же, как старый недокументированный объект VEDecoder.

0 голосов
/ 07 июля 2009

Интересный момент в Условиях использования Bing Maps. http://www.microsoft.com/maps/product/terms.html

Ограничение на использование аэрофотоснимков с высоты птичьего полета: Вы не можете раскрывать широту, долготу, высоту или другие метаданные;

0 голосов
/ 28 августа 2008

Согласно http://dev.live.com/virtualearth/sdk/ это должно сработать:

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