Геокодер Google возвращает неверную страну, игнорируя подсказку региона - PullRequest
30 голосов
/ 15 апреля 2010

Я использую геокодер Google, чтобы найти координаты широты для данного адреса.

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

address переменная берется из поля ввода.

Я хочу искать местоположения только в Великобритании . Я думал, что указание 'region': 'uk' должно быть достаточно, но это не так. Когда я набираю «Бостон», он находит Бостон в США, а я хотел тот, что в Великобритании.

Как ограничить геокодером возврат местоположений только из одной страны или, возможно, из определенного диапазона широт?

Спасибо

Ответы [ 13 ]

27 голосов
/ 01 февраля 2012

Следующий код получит первый соответствующий адрес в Великобритании без необходимости изменения адреса.

  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;
                    }
                }
            }
        }
    });
26 голосов
/ 08 ноября 2013

Использовать componentRestrictions Атрибут:

geocoder.geocode({'address': request.term, componentRestrictions: {country: 'GB'}}
22 голосов
/ 15 апреля 2010

ОБНОВЛЕНИЕ: Этот ответ может быть не лучшим подходом. См. Комментарии ниже ответа для более подробной информации.


В дополнение к тому, что Пекка уже предложил , вы можете объединить ', UK' с address, как в следующем примере:

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

Скриншот:

Geocoding only in UK

Я считаю, что это очень надежно. С другой стороны, следующий пример показывает, что ни параметр region, ни параметр bounds не оказывают никакого влияния в этом случае:

<!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>
16 голосов
/ 28 февраля 2014

Правильный способ сделать это - предоставить componentRestrictions

Например:

var request = {
    address: address,
    componentRestrictions: {
        country: 'UK'
    }
}
geocoder.geocode(request, function(results, status){
    //...
});
8 голосов
/ 15 апреля 2010

Согласно документам , параметр региона, кажется, устанавливает только смещение (вместо реального предела этой области). Я думаю, что когда API не найдет точный адрес в Великобритании, он расширит поиск независимо от того, в какой регион вы входите.

В прошлом я неплохо справился с указанием кода страны в адресе (в дополнение к региону). У меня пока не было большого опыта с идентичными названиями мест в разных странах. Тем не менее, стоит попробовать. Попробуйте

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

он должен вернуть без адреса (вместо США в Бостоне) и

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

Должен вернуть Бостон в Великобританию, потому что на нем есть главная улица.

Обновление:

Как ограничить геокодером возврат местоположений только из одной страны или, возможно, из определенного диапазона широт?

Вы можете установить параметр bounds. Смотрите здесь

Для этого вам, конечно, придется рассчитать прямоугольник размером с Великобританию.

5 голосов
/ 05 января 2012

Я обнаружил проблемы с установкой ", Великобритания", установкой региона в Великобритании и установлением границ. Тем не менее, выполнение ВСЕГО ТРИ, кажется, исправило это для меня. Вот фрагмент кода: -

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.....
2 голосов
/ 27 февраля 2012

Я пробовал со следующим:

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

И это работает на меня для определенного региона (страны США).

1 голос
/ 23 апреля 2013

Я всегда находил, что это довольно легко отфильтровать, так как результаты могут отличаться и регион, похоже, не работает.

response( $.map( results, function( item ) {
 if (item.formatted_address.indexOf("GB") != -1) {
    return {
      latitude: item.geometry.location.lat(),
      longitude: item.geometry.location.lng()
    }
  }
}
0 голосов
/ 15 марта 2019

Я создал границу вокруг Великобритании и проверил, находятся ли мои Lat и Lng в диапазоне. Для 3 k адресов у меня есть от 10 до 20 адресов в США. Я просто игнорирую их (я могу сделать это в моем случае), я использую lat и lng для создания мульти маркеров на статической карте с автоматическим масштабированием. Я поделюсь своим решением, может быть, это поможет кому-то. Также я рад услышать различные решения для моего случая.

    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;
    }
0 голосов
/ 28 апреля 2018

Я считаю, что для многих неоднозначных запросов США всегда имеют приоритет в Google, даже если вы пытаетесь указать, где их искать. Вы можете посмотреть на ответ и, возможно, проигнорировать его, если страна выхода = США?

Это основная причина, по которой я перестал использовать Google Geocoder некоторое время назад и начал строить свой собственный два года назад.

https://geocode.xyz/Boston,%20UK всегда возвращает местоположение в Великобритании. Вы можете быть уверены, добавив регион = Великобритания: https://geocode.xyz/Boston,%20UK?region=UK

...