2011-08-24 13 views

Respuesta

28

Prueba esto:

var input = document.getElementById('searchTextField'); 
var options = { 
    types: ['(cities)'], 
    componentRestrictions: {country: 'tr'}//Turkey only 
}; 
var autocomplete = new google.maps.places.Autocomplete(input,options); 
+2

Esta es la respuesta correcta –

+4

componentRestrictions: {country: 'gb'} // restringirá a UK solo según la pregunta – geedubb

+0

debería ser 'types: ['cities']', not 'types: ['(cities) '] ' – tirdadc

4

No puede restringir estrictamente o limitar las ubicaciones que encuentra, aunque hay una solicitud de función en el sistema para hacerlo, pero puede establecer un "sesgo" en los resultados. Se pasa como argumento al método de autocompletar como un objeto de límites de google maps. Autocompletar favorecerá las ubicaciones dentro de esos límites. Sin embargo, tenga en cuenta que, dado que no se trata de un límite estricto, si hay coincidencias para la búsqueda fuera de los límites, las devolverá.

De mi uso parece un poco buggy y se puede utilizar algunas mejoras - especialmente teniendo en cuenta que cualquier cosa fuera de su límite no está marcado por la proximidad en absoluto, por lo que algo un bloque fuera de la frontera es igual de propensos a mostrar como algo 1000 millas afuera, así que asegúrese de jugar con los límites trabajando correctamente.

+1

La respuesta correcta es utilizando componentRestrictions, que le permite restringir la autocompletar a países, como se muestra en la respuesta de Ercan. –

+2

Correcto. Se agregó a API v3.9 el 25 de julio de 2012. A partir de la redacción de la respuesta anterior, la API estaba en v3.6. Esta es la respuesta de Google a la solicitud de función mencionada anteriormente. A partir de hoy, v3.12 es la versión más baja entregada, por lo que debería ser estándar en cualquier solicitud de API. –

1

La mejor manera de hacerlo es consultar personalmente la ubicación de los lugares y anexar la cadena consultada con su país. O, por supuesto, use el geo-autocomplete jQuery plugin.

2

James Alday es correcta:

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'] 
}; 

que es algo molesto como la búsqueda de Durham da Durham, Carolina del Norte como el segundo resultado, independientemente de cómo se intenta convencer al sesgo región - puede establecerlo en los límites del mapa de la vista y todavía intentará sugerir el estado NC ... La solución jQuery se puede encontrar aquí, pero no parece dar tantos resultados como la API v3. http://code.google.com/p/geo-autocomplete/

4

Puede interceptar las JSONP resultados devueltos por la funcionalidad google.maps.places.Autocomplete y utilizarlos como mejor le parezca, que se limiten por país y mostrar los resultados.

Básicamente, redefine el método appendChild en el elemento principal y luego supervisa los elementos de javascript que el código de autocompletado de Google inserta en el DOM para JSONP. A medida que se agregan los elementos de JavaScript, se anulan las devoluciones de llamada JSONP que Google define para poder acceder a los datos de autocompletar sin formato.

Es un poco de un truco, aquí va (estoy usando jQuery, pero no es necesario que este truco funcione):

//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); 
}; 
+0

Su enfoque parece muy interesante y el único que aborda los problemas inherentes al limitarse a una región utilizando los parámetros de Google. ¿Sería capaz de publicar un JSFiddle de trabajo completo o similar incorporando lo anterior, por favor? Tengo dificultades para entender cómo encaja en los ejemplos de Google y un ejemplo completo de trabajo sería de gran ayuda. Gracias –

0

intentar algo como esto.

// 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() { 
}); 
Cuestiones relacionadas