Подтвердить что ты не робот

Google Geocoder возвращает неверную страну, игнорируя подсказку в регионе

Я использую Google Geocoder для поиска координат lat lng для заданного адреса.

    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' должно быть достаточно, но это не так. Когда я печатаю в "Бостоне", он находит Бостон в США, и я хотел его в Великобритании.

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

Спасибо

4b9b3361

Ответ 1

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


В дополнение к тому, что уже предлагалось Pekka, вы можете связать ', 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>

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Например:

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

Ответ 5

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

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

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

он должен вернуть не адрес (вместо US Boston) и

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

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

Update:

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Я предпочитаю гибридный подход .

  • Использовать componentRestrictions, чтобы в первую очередь ограничить страну.
  • Если это не дает достаточных результатов, выполните поиск более широко (и при необходимости измените предвзятость)

    
    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 }

    код >

Ответ 10

Для объединенного королевства вы должны использовать GB для региона. Великобритания не является кодом страны ISO!

Ответ 11

Мне пришлось отфильтровывать результаты в самой стране сегодня. Я узнал, что код страны с двумя символами в компонентеРестрификации: страна: не работает. Но полное название страны.

Это полное_имя в address_components из результата.