4 Stimmen

Wie finde ich die genauen Breiten- und Längenkoordinaten einer Vogelperspektive in Virtual Earth?

Ich versuche, den Längen- und Breitengrad der Ecken meiner Karte in der Vogelperspektive zu finden. Ich möchte Stecknadeln auf der Karte anbringen können, aber ich habe Hunderttausende von Adressen, die ich auf diejenigen beschränken möchte, die auf der Karte angezeigt werden sollen.

In der normalen Ansicht geben VEMap.GetMapView().TopLeftLatLong und .BottomRightLatLong die benötigten Koordinaten zurück, aber in der Vogelperspektive geben sie leere (oder verschlüsselte) Werte zurück. Das SDK empfiehlt die Verwendung von VEBirdseyeScene.GetBoundingRectangle(), aber dies gibt Grenzen von bis zu zwei Meilen vom Zentrum meiner Szene zurück, was in Großstädten immer noch viel zu viele Adressen ergibt.

In früheren Versionen von VE Control gab es ein undokumentiertes VEDecoder-Objekt, mit dem ich die LatLong-Werte für die Birdseye-Szenen entschlüsseln konnte, aber dieses Objekt scheint verschwunden zu sein (wahrscheinlich wurde es umbenannt). Wie kann ich diese Werte in Version 6.1 entschlüsseln?

3voto

Jason Punkte 2139

Ich habe immer den Eindruck, dass die Beispiellösungen für dieses Problem nur die Mitte der aktuellen Karte auf dem Bildschirm finden, als ob das immer die Stelle wäre, auf die man klicken würde! Wie auch immer, ich habe diese kleine Funktion geschrieben, um die tatsächliche Pixelposition zu ermitteln, auf die man auf dem Bildschirm geklickt hat, und dafür einen VELatLong zurückzugeben. Bisher scheint es ziemlich genau zu sein (auch wenn ich dies als einen großen, schrecklichen Hack sehe - aber es ist nicht so, dass wir im Moment eine Wahl haben).

Als Eingabe dient ein VEPixel, d.h. die x- und y-Koordinaten der Stelle, auf die Sie auf der Karte geklickt haben. Sie können das leicht genug auf der Maus-Ereignis an die onclick Handler für die Karte übergeben bekommen.

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

2voto

Soldarnal Punkte 7228

Aus der Dokumentation der VEMap.GetCenter-Methode:

Diese Methode gibt null zurück, wenn die Karte Stil auf VEMapStyle.Birdseye oder VEMapStyle.BirdseyeHybrid.

Ich habe jedoch Folgendes herausgefunden:

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

Das (neue _xy1) scheint genauso zu funktionieren wie das alte undokumentierte VEDecoder-Objekt.

2voto

Chris Pietschmann Punkte 28906

Hier ist der Code, um den Lat/Long-Mittelpunkt der Karte zu ermitteln. Diese Methode funktioniert sowohl in den Kartenstilen Straße/Luftbild als auch Vogelperspektive/Blickwinkel.

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();
            }
        } 

Dieser Code wurde von hier kopiert: http://pietschsoft.com/post/2008/06/Virtual-Earth-Get-Center-LatLong-When-In-Birdseye-or-Oblique-Map-Style.aspx

0voto

MartinHN Punkte 19032

Según http://dev.live.com/virtualearth/sdk/ Das sollte genügen:

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

0voto

itchi Punkte 1633

Ein interessanter Punkt in den Nutzungsbedingungen von Bing Maps http://www.microsoft.com/maps/product/terms.html

Einschränkung der Verwendung von Luftbildern aus der Vogelperspektive: Sie dürfen weder Breitengrad, Längengrad, Höhe noch andere Metadaten preisgeben;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X