2017-08-08 4 views
0

Le problème se produit lors de l'actualisation de la page, puis le navigateur est réduit ou son onglet avec une carte est inactif. La fonction de géocodage du gestionnaire de recherche tombe alors dans errorCallback. Tout fonctionne correctement, si la page avec la carte est active (visible).Microsoft Bing Maps v7 Search Manager GeoCode errorCallBack

J'ai vérifié l'objet e.request dans la fonction errorCallback et il contient le paramètre "where" correct, mais aucune latitude et longitude, ni aucune information sur l'erreur.

Le problème peut être reproduit dans les navigateurs Chrome et IE.

HTML: <div id="map" class="map" style="height:270px; width:100%"></div>

JavaScript:

<script type="text/javascript" src="https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0&s=1"></script> 

<script type="text/javascript"> 

    // global variables 
    var apiKey = 'API_KEY_HIDDEN', 
     map, 
     searchManager; 

    // sample data 
    var siteData = [ 
     {"Name":"Starbucks","Address":"8400 SW Nimbus Ave 120","City":"Beaverton","State":"OR","Zip":"97008","Latitude":0,"Longitude":0}, 
     {"Name":"Subway","Address":"12160 SW Scholls Ferry Rd","City":"Tigard","State":"OR","Zip":"97223","Latitude":0,"Longitude":0} 
    ]; 

    $(document).ready(function() { 
     GetMap(); 
     setTimeout(function() { location.reload(); }, 60000); 
    }); 

    function GetMap() {  

     // initialize the map 
     map = new Microsoft.Maps.Map(document.getElementById('map'), { 
      credentials: apiKey, 
      mapTypeId: Microsoft.Maps.MapTypeId.road, 
      zoom: 1 
     }); 

     // load search module 
     Microsoft.Maps.loadModule('Microsoft.Maps.Search', { 
      callback: function() { 
       searchManager = new Microsoft.Maps.Search.SearchManager(map); 
       $.each(siteData, function(index, clientSite) { 
        GeoCodeQuery(clientSite); 
       }); 
      } 
     }); 
    } 

    function GeoCodeQuery(clientSite) { 

     // set search parameters 
     var searchRequest = { 
      where: clientSite.Address + ', ' + clientSite.City + ', ' + clientSite.State + ' ' + clientSite.Zip, 
      callback: function (data) { 
       if (data && data.results && data.results.length > 0) { 
        clientSite.Latitude = data.results[0].location.latitude; 
        clientSite.Longitude = data.results[0].location.longitude; 
       } 
       else { 
        console.log('No results.'); 
       } 
      }, 
      errorCallback: function (e) { 
       console.log('Search error.'); 
      } 
     }; 

     // make the geocode request 
     searchManager.geocode(searchRequest);   
    } 

</script> 

Répondre

1

Quelques questions;

  • Il vous manque une virgule après votre paramètre where. Cela rendrait searchRequest un objet JSON invalide. Si vous corrigez ce problème, la première adresse est correctement géocodée. La seconde est de lancer une erreur et cela peut être pour un grand nombre de raisons, le plus probable est le point suivant.
  • Le contrôle Bing Maps V7 a été retiré en juin et sera bientôt fermé. Certains de ses services principaux sont déjà retirés et il y aura donc des problèmes. Vous devriez utiliser Bing Maps V8 qui a remplacé V7 il y a plus d'un an. Vous pouvez trouver un guide de migration ici: https://social.technet.microsoft.com/wiki/contents/articles/34563.bing-maps-v7-to-v8-migration-guide.aspx
+0

En fait, la virgule est dans mon code d'origine. Je l'ai juste raté ici, alors que j'essayais de compacter et de mettre en forme du code pour StackOverflow. Comme, je l'ai mentionné dans mon commentaire - tout fonctionne si la page (onglet) avec la carte est visible. Il échoue seulement quand un navigateur est réduit ou un onglet avec la carte est inactive. En fait, j'ai essayé ceci en v8, après avoir créé ce post, en créant une carte simple et en utilisant des exemples de données - les résultats étaient les mêmes. J'ai fini par écrire un service de géocodage personnalisé (et malheureusement plus lent) pour l'utiliser comme solution de repli pour les erreurs dans le Gestionnaire de recherche. –

+0

Je me demande aussi pourquoi le gestionnaire de recherche aurait besoin d'une carte dans son constructeur, si la requête de géocodage et les résultats sont indépendants (la carte). J'ai également essayé de remplir la propriété "bounds" à la requête de recherche de géocodage, en pensant qu'ils ne peuvent pas être calculés correctement, mais encore une fois - pas de chance. –

+0

Le gestionnaire de recherche utilise l'affichage de la carte pour influencer/pondérer les résultats. Il saisit également une clé de session de la carte. Si vous ne vous en souciez pas, vous pouvez simplement utiliser l'API de localisation REST directement: http://bingmapsv8samples.azurewebsites.net/#RestServices_JSONP – rbrundritt