ограничение автозаполнения карт Google только адресом в Великобритании - PullRequest
13 голосов
/ 24 августа 2011

Я просматривал пример на:

http://code.google.com/apis/maps/documentation/javascript/examples/places-autocomplete.html

и решил включить его в свой сайт.

Можно ли ограничить адреса только адресами Великобритании?

Ответы [ 7 ]

30 голосов
/ 20 июля 2012

Попробуйте это:

var input = document.getElementById('searchTextField');
var options = {
   types: ['(cities)'],
   componentRestrictions: {country: 'tr'}//Turkey only
};
var autocomplete = new google.maps.places.Autocomplete(input,options);
4 голосов
/ 15 марта 2012

Вы можете перехватить результаты JSONP , возвращаемые функцией google.maps.places.Autocomplete , и использовать их по своему усмотрению, например, для ограничения по стране и отображения результаты, достижения.

По сути, вы переопределяете метод appendChild для элемента head, а затем отслеживаете элементы javascript, которые код автозаполнения Google вставляет в DOM для JSONP. По мере добавления элементов javascript вы переопределяете обратные вызовы JSONP, которые Google определяет для получения доступа к необработанным данным автозаполнения.

Это что-то вроде хака (здесь я пользуюсь (я использую jQuery, но для этого не требуется):

//The head element, where the Google Autocomplete code will insert a tag 
//for a javascript file.
var head = $('head')[0];  
//The name of the method the Autocomplete code uses to insert the tag.
var method = 'appendChild';  
//The method we will be overriding.
var originalMethod = head[method];

head[method] = function () {
  if (arguments[0] && arguments[0].src && arguments[0].src.match(/GetPredictions/)) {  //Check that the element is a javascript tag being inserted by Google.
    var callbackMatchObject = (/callback=([^&]+)&|$/).exec(arguments[0].src);  //Regex to extract the name of the callback method that the JSONP will call.
    var searchTermMatchObject = (/\?1s([^&]+)&/).exec(arguments[0].src);  //Regex to extract the search term that was entered by the user.
    var searchTerm = unescape(searchTermMatchObject[1]);
    if (callbackMatchObject && searchTermMatchObject) {
      var names = callbackMatchObject[1].split('.');  //The JSONP callback method is in the form "abc.def" and each time has a different random name.
      var originalCallback = names[0] && names[1] && window[names[0]] && window[names[0]][names[1]];  //Store the original callback method.
      if (originalCallback) {
        var newCallback = function () {  //Define your own JSONP callback
          if (arguments[0] && arguments[0][3]) {
            var data = arguments[0][4];  //Your autocomplete results
            //SUCCESS! - Limit results here and do something with them, such as displaying them in an autocomplete dropdown.
          }
        }

        //Add copy all the attributes of the old callback function to the new callback function. This prevents the autocomplete functionality from throwing an error.
        for (name in originalCallback) {  
          newCallback[name] = originalCallback[name];
        }
        window[names[0]][names[1]] = newCallback;  //Override the JSONP callback
      }
    }

  //Insert the element into the dom, regardless of whether it was being inserted by Google.
  return originalMethod.apply(this, arguments);
};
4 голосов
/ 01 сентября 2011

Вы не можете строго / жестко ограничивать места, которые он находит, хотя для этого есть запрос функции в системе, но вы можете установить «смещение» для результатов. Он передается в качестве аргумента методу автозаполнения как объект границ Google Maps. Затем автозаполнение будет отдавать предпочтение местоположениям в этих границах. Тем не менее, обратите внимание, что, поскольку это не жесткая граница, если найдены совпадения для поиска за пределами границ, они будут возвращать их.

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

2 голосов
/ 07 ноября 2011

Джеймс Олдей прав:

http://code.google.com/apis/maps/documentation/javascript/places.html#places_autocomplete

var defaultBounds = new google.maps.LatLngBounds(
  new google.maps.LatLng(49.00, -13.00),
  new google.maps.LatLng(60.00, 3.00));

var acOptions = {
  bounds: defaultBounds,
  types: ['geocode']
};

это несколько раздражает, так как поиск Дарема дает Дарем, Северная Каролина, как второй результат, независимо от того, как вы пытаетесь убедить его в смещении по регионам - вы можете установить его для границ карты просмотра, и он все равно попытается предложить NC состояние ... Решение jQuery можно найти здесь, но, похоже, оно не дает столько результатов, сколько API v3. http://code.google.com/p/geo-autocomplete/

1 голос
/ 26 сентября 2011

Лучший способ сделать это - самостоятельно запросить места и добавить запрашиваемую строку с вашей страной.Или, конечно, используйте плагин geo-autocomplete jQuery .

0 голосов
/ 13 января 2017

Попробуйте что-то вроде этого.

// Change Bangalore, India to your cities boundary.
var bangaloreBounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(12.864162, 77.438610),
    new google.maps.LatLng(13.139807, 77.711895));

var autocomplete = new google.maps.places.Autocomplete(this, {
    bounds: bangaloreBounds,
    strictBounds: true,
});

autocomplete.addListener('place_changed', function () {
});
0 голосов
/ 26 февраля 2013

Просто измените домен Google для карт на домен вашей страны, и он автоматически выполнит поиск только в вашей стране:

Итак: http://maps.google.com/maps/api/geocode/xml?address={0}&sensor=false&language=en

Для того, чтобы: http://maps.google.nl/maps/api/geocode/xml?address={0}&sensor=false&language=nl

...