Pregunta

Estoy usando Geocoder de Google para encontrar las coordenadas de latitud GNL para una dirección dada.

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

variable de address se toma de un campo de entrada.

Quiero buscar ubicaciones sólo en el Reino Unido . Pensé que 'region': 'uk' especificando debería ser suficiente, pero no lo es. Cuando escribo en "Boston" se trata de encontrar Boston, en Estados Unidos y que quería el de Reino Unido.

Cómo restringir Geocoder para volver ubicaciones sólo de un país o tal vez a partir de un cierto rango de GNL lat?

Gracias

¿Fue útil?

Solución

ACTUALIZACIÓN: Esta respuesta puede no ser el mejor enfoque más. Ver los comentarios a continuación la respuesta para más detalles.


Además de lo que Pekka ya se ha sugerido , es posible que desee ', UK' a concatenar a su address, como en el siguiente ejemplo:

<!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>

Captura:

geocodificaci&oacute;n s&oacute;lo en el Reino Unido

Me parece que esto es muy fiable. Por otro lado, el siguiente ejemplo muestra que ni el parámetro region, ni el parámetro bounds, están teniendo ningún efecto en este caso:

<!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>

Otros consejos

El siguiente código hará que la primera dirección coincidente en el Reino Unido sin la necesidad de modificar la dirección.

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

componentRestrictions atributo:

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

La forma correcta de hacerlo es proporcionando componentRestrictions

Por ejemplo:

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

De acuerdo con la docs , el parámetro región parece establecer un sesgo solamente (en lugar de un límite real a esa región). Creo que cuando la API no encuentra la dirección exacta en el lugar del Reino Unido, se expandirá que buscar no importa qué región se introduce.

He le fue bastante bien en el pasado con la especificación del código de país en la dirección (además de la región). No he tenido mucha experiencia con idénticos nombres de lugares en diferentes países todavía, sin embargo. Aún así, vale la pena un tiro. Trate

'address': '78 Austin Street, Boston, UK'

debe devolver ninguna dirección (En lugar de los EE.UU. Boston), y

'address': '78 Main Street, Boston, UK'

En caso de devolver el Boston en el Reino Unido, ya que en realidad tiene una calle principal.

Actualización:

  

Cómo restringir Geocoder para volver ubicaciones sólo de un país o tal vez a partir de un cierto rango de GNL lat?

Se puede configurar un parámetro bounds. Ver aquí

tendría que calcular un rectángulo de tamaño del Reino Unido para que, por supuesto.

He encontrado problemas con poner "Reino Unido", ajusta la región a Reino Unido y el establecimiento de límites. Sin embargo, haciendo LOS TRES parece solucionar por mí. He aquí un fragmento: -

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.....

He intentado con lo siguiente:

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

Y su trabajo para mí en particular para la región (país de Estados Unidos).

Siempre pareció que era bastante fácil de filtro a través ya que los resultados pueden variar y la región no parecen funcionar.

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

Yo prefiero un enfoque híbrido .

  1. Use componentRestrictions a limitar severamente al país en primer lugar.
  2. Si esto no da suficientes resultados, buscar un sentido más amplio (y re-introducir un sesgo si es necesario)

    function MyGeocoder(address,region)
    {
        geocoder = new google.maps.Geocoder();
        geocoder.geocode({ 'address': address, 'componentRestrictions': { 'country': region } }, function (r, s) {
            if (r.length < 10) geocoder.geocode({ 'address': address /* could also bias here */ }, function (r2, s2) {
                for (var j = 0; j < r2.length; j++) r.push(r2[j]);
                DoSomethingWithResults(r);
            });
            else DoSomethingWithResults(r);
        });
    }
    function DoSomethingWithResults(r) { // Remove Duplicates var d = {}; r = r.filter(function (e) { var h = e.formatted_address.valueOf(); var isDup = d[h]; d[h] = true; return !isDup; });

    // Do something with results }

Me parece que para una gran cantidad de consultas ambiguas, los EE.UU. siempre tiene prioridad en Google, incluso si se trata de decir que dónde buscar. Se puede ver en la respuesta y tal vez ignoran si el país de salida = EE.UU.?

Esa es la razón principal por la que se dejó de usar Google Geocoder hace un tiempo y empecé a construir mi propia hace dos años.

https://geocode.xyz/Boston,%20UK siempre devolverá la ubicación del Reino Unido . Puede hacer seguro adicional mediante la adición de región = UK: https://geocode.xyz/Boston, % 20UK? = región Reino Unido

He creado borde alrededor del Reino Unido y de verificación si mi Lat y GNL están en el rango. Durante 3 k direcciones Tengo alrededor de 10 hasta 20 direcciones en los Estados Unidos. Yo simplemente ignorarlos (Puedo hacer eso en mi caso) que utilizo lat y lng para la creación de marcadores múltiples en el mapa estático con zoom automático. Voy a compartir mi solución tal vez esto será de ayuda para alguien. También estoy feliz de escuchar diferentes soluciones para mi caso.

    private static string ReturnLatandLng(string GeocodeApiKey, string address)
    {
        string latlng = "";

        Geocoder geocoder = new Geocoder(GeocodeApiKey);

        var locations = geocoder.Geocode(address);

        foreach (var item in locations)
        {

            double longitude = item.LatLng.Longitude;
            double latitude = item.LatLng.Latitude;
            double borderSouthLatitude = 49.895878;
            double borderNorthLatitude = 62.000000;
            double borderWestLongitude = -8.207676;
            double borderEastLongitude = 2.000000;

            //Check If Geocoded Address is inside of the UK
            if (( (borderWestLongitude < longitude) && (longitude < borderEastLongitude) ) && ( (borderSouthLatitude < latitude) && (latitude < borderNorthLatitude) ) )
            {
                latlng = item.LatLng.ToString();
            }
            else
            {
                latlng = "";
                Console.WriteLine("GEOCODED ADDRESS IS NOT LOCATED IN UK ADDRESSES LIST. DELETING MARKER FROM MAP.....");
            }
        }
        return latlng;
    }

En el Reino Unido, usted tiene que utilizar GB para la región. Reino Unido no es el código de país ISO!

I tuvo que filtrar los resultados de un país a mí mismo hoy. Descubrí que el código de país de dos caracteres en componentRestrictions: País: no funciona. Sin embargo, el nombre completo del país lo hace.

Este es el FULL_NAME en los address_components de un resultado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top