2008-08-28 5 views
3

J'essaie de trouver la latitude et la longitude des coins de ma carte en mode birdseye. Je veux être capable de tracer des épingles sur la carte, mais j'ai des centaines de milliers d'adresses que je veux pouvoir limiter à celles qui doivent apparaître sur la carte.Comment trouver les coordonnées lat/lng exactes d'une scène birdseye dans Virtual Earth?

En mode normal, VEMap.GetMapView(). TopLeftLatLong et .BottomRightLatLong renvoient les coordonnées dont j'ai besoin; mais dans Birdseye view ils retournent des espaces vides (ou des valeurs cryptées). Le SDK recommande d'utiliser VEBirdseyeScene.GetBoundingRectangle(), mais cela renvoie des limites allant jusqu'à deux miles du centre de ma scène qui, dans les grandes villes, renvoie encore trop d'adresses.

Dans les versions précédentes du contrôle VE, il y avait un objet VEDecoder non documenté que je pouvais utiliser pour déchiffrer les valeurs LatLong pour les scènes birdseye, mais cet objet semble avoir disparu (probablement été renommé). Comment puis-je décoder ces valeurs dans la version 6.1?

Répondre

2

Voici le code pour obtenir le point Centre Lat/Long de la carte. Cette méthode fonctionne à la fois dans les styles Carte/Aérien et 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(); 
      } 
     } 

Ce code a été copié à partir d'ici: http://pietschsoft.com/post/2008/06/Virtual-Earth-Get-Center-LatLong-When-In-Birdseye-or-Oblique-Map-Style.aspx

1

De la documentation Méthode VEMap.GetCenter:

Cette méthode retourne null lorsque le style carte est réglé sur VEMapStyle.Birdseye ou VEMapStyle.BirdseyeHybrid.

Voici ce que j'ai trouvé, cependant:

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

Le (nouveau _xy1) semble fonctionner le même que l'ancien objet VEDecoder sans papier.

2

Il me semble toujours que les exemples de solutions pour ce problème ne trouvent que le centre de la carte actuelle sur l'écran, comme si cela est toujours le endroit où vous allez cliquer! Quoi qu'il en soit, j'ai écrit cette petite fonction pour obtenir l'emplacement du pixel que vous avez cliqué sur l'écran et retourner un VELatLong pour cela. Jusqu'à présent, il semble assez précis (même si je vois cela comme un grand, horrible hack - mais ce n'est pas comme si nous avions un choix pour le moment).

Il prend un VEPixel comme entrée, qui est les coordonnées x et y de l'endroit où vous avez cliqué sur la carte. Vous pouvez obtenir cela assez facilement sur l'événement souris transmis au gestionnaire onclick pour la carte.

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

Un point intéressant dans les cartes Bing Conditions d'utilisation .. http://www.microsoft.com/maps/product/terms.html

Restriction sur l'utilisation de l'imagerie aérienne des yeux d'oiseau: Vous ne pouvez pas révéler la latitude, la longitude, l'altitude ou d'autres métadonnées;

Questions connexes