web-dev-qa-db-fra.com

Le géocodeur de Google renvoie le mauvais pays et ignore l'indicateur de région

J'utilise le géocodeur de Google pour trouver les coordonnées latérales d'une adresse donnée.

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode(
    {
        'address':  address,
        'region':   'uk'
    }, function(results, status) {
        if(status == google.maps.GeocoderStatus.OK) {
            lat: results[0].geometry.location.lat(),
            lng: results[0].geometry.location.lng()
    });

La variable address provient d'un champ de saisie.

Je souhaite rechercher des lieux uniquement au Royaume-Uni . Je pensais que spécifier 'region': 'uk' devrait suffire, mais ce n'est pas le cas. Lorsque je tape "Boston", je découvre Boston aux États-Unis et je voulais celui au Royaume-Uni.

Comment restreindre Geocoder à ne retourner que des sites d’un pays ou peut-être d’une certaine plage de latitude?

Merci

30
6bytes

UPDATE: Cette réponse n'est peut-être plus la meilleure approche. Voir les commentaires ci-dessous la réponse pour plus de détails.


En plus de ce que Pekka a déjà suggéré , vous pouvez concaténer ', UK' avec votre address, comme dans l'exemple suivant:

<!DOCTYPE html>
<html> 
<head> 
   <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
   <title>Google Maps Geocoding only in UK Demo</title> 
   <script src="http://maps.google.com/maps/api/js?sensor=false" 
           type="text/javascript"></script> 
</head> 
<body> 
   <div id="map" style="width: 400px; height: 300px"></div> 

   <script type="text/javascript"> 

   var mapOptions = { 
      mapTypeId: google.maps.MapTypeId.TERRAIN,
      center: new google.maps.LatLng(54.00, -3.00),
      zoom: 5
   };

   var map = new google.maps.Map(document.getElementById("map"), mapOptions);
   var geocoder = new google.maps.Geocoder();

   var address = 'Boston';

   geocoder.geocode({
      'address': address + ', UK'
   }, 
   function(results, status) {
      if(status == google.maps.GeocoderStatus.OK) {
         new google.maps.Marker({
            position:results[0].geometry.location,
            map: map
         });
      }
   });

   </script> 
</body> 
</html>

Capture d'écran:

Geocoding only in UK

Je trouve que c'est très fiable. D'autre part, l'exemple suivant montre que ni le paramètre region, ni le paramètre bounds, n'ont d'effet dans ce cas:

<!DOCTYPE html>
<html> 
<head> 
   <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
   <title>Google Maps Geocoding only in UK Demo with Bounds</title> 
   <script src="http://maps.google.com/maps/api/js?sensor=false" 
           type="text/javascript"></script> 
</head> 
<body> 
   <div id="map" style="width: 500px; height: 300px"></div> 

   <script type="text/javascript"> 

   var mapOptions = { 
      mapTypeId: google.maps.MapTypeId.TERRAIN,
      center: new google.maps.LatLng(50.00, -33.00),
      zoom: 3
   };

   var map = new google.maps.Map(document.getElementById("map"), mapOptions);   
   var geocoder = new google.maps.Geocoder();

   // Define north-east and south-west points of UK
   var ne = new google.maps.LatLng(60.00, 3.00);
   var sw = new google.maps.LatLng(49.00, -13.00);

   // Define bounding box for drawing
   var boundingBoxPoints = [
      ne, new google.maps.LatLng(ne.lat(), sw.lng()),
      sw, new google.maps.LatLng(sw.lat(), ne.lng()), ne
   ];

   // Draw bounding box on map    
   new google.maps.Polyline({
      path: boundingBoxPoints,
      strokeColor: '#FF0000',
      strokeOpacity: 1.0,
      strokeWeight: 2,
      map: map
   });

   // Geocode and place marker on map
   geocoder.geocode({
      'address': 'Boston',
      'region':  'uk',
      'bounds':  new google.maps.LatLngBounds(sw, ne)
   }, 
   function(results, status) {
      if(status == google.maps.GeocoderStatus.OK) {
         new google.maps.Marker({
            position:results[0].geometry.location,
            map: map
         });
      }
   });

   </script> 
</body> 
</html>
22
Daniel Vassallo

Le code suivant obtiendra la première adresse correspondante au Royaume-Uni sans qu'il soit nécessaire de modifier l'adresse.

  var geocoder = new google.maps.Geocoder();
  geocoder.geocode(
  {
    'address':  address,
    'region':   'uk'
  }, function(results, status) {
    if(status == google.maps.GeocoderStatus.OK) {
        for (var i=0; i<results.length; i++) {
            for (var j=0; j<results[i].address_components.length; j++) {
               if ($.inArray("country", results[i].address_components[j].types) >= 0) {
                    if (results[i].address_components[j].short_name == "GB") {
                        return_address = results[i].formatted_address;
                        return_lat = results[i].geometry.location.lat();
                        return_lng = results[i].geometry.location.lng();
                        ...
                        return;
                    }
                }
            }
        }
    });
27
Ivo Bosticky

Utilisez composantRestrictions attribut:

geocoder.geocode({'address': request.term, componentRestrictions: {country: 'GB'}}
26
Yenya

La bonne façon de faire est de fournir composantRestrictions

Par exemple:

var request = {
    address: address,
    componentRestrictions: {
        country: 'UK'
    }
}
geocoder.geocode(request, function(results, status){
    //...
});
16
Deminetix

J'ai rencontré des problèmes avec la mise ", Royaume-Uni", la définition de la région et la définition des limites Cependant, faire TOUT TROIS semble résoudre ce problème pour moi. Voici un extrait: -

var sw = new google.maps.LatLng(50.064192, -9.711914)
var ne = new google.maps.LatLng(61.015725, 3.691406)
var viewport = new google.maps.LatLngBounds(sw, ne);

geocoder.geocode({ 'address': postcode + ', UK', 'region': 'UK', "bounds": viewport }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
.....etc.....
5
nickthompson

J'ai essayé avec ce qui suit:

geocoder.geocode( {'address':request.term + ', USA'}

Et cela fonctionne pour moi pour une région particulière (pays américain).

2
Ankit Adlakha

J'ai toujours trouvé cela assez facile à filtrer car les résultats peuvent varier et la région ne semble pas fonctionner.

response( $.map( results, function( item ) {
 if (item.formatted_address.indexOf("GB") != -1) {
    return {
      latitude: item.geometry.location.lat(),
      longitude: item.geometry.location.lng()
    }
  }
}
1
bokor

Je trouve que pour beaucoup de questions ambiguës, les États-Unis ont toujours la priorité sur Google, même si vous essayez de lui indiquer où chercher. Vous pouvez regarder la réponse et peut-être l'ignorer si le pays de sortie = US?

C’est la raison principale pour laquelle j’ai arrêté d’utiliser Google Geocoder il ya quelque temps et qui a commencé à construire le mien il ya deux ans.

https://geocode.xyz/Boston,%20UK retournera toujours la localisation au Royaume-Uni. Vous pouvez être plus sûr en ajoutant region = UK: https://geocode.xyz/Boston,%20UK?region=UK

0
Ervin Ruci