2011-08-24 14 views

risposta

28

Prova questo:

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

Questa è la risposta corretta –

+4

componentRestrictions: {country: 'gb'} // restringerà al Regno Unito solo come per la domanda – geedubb

+0

dovrebbe essere 'types: ['cities']', non 'types: ['(città) '] ' – tirdadc

4

Non è possibile limitare rigorosamente/rigorosamente le posizioni rilevate, sebbene nel sistema sia richiesta una funzione, ma è possibile impostare un 'bias' sui risultati. Viene passato come argomento al metodo di completamento automatico come oggetto di limiti di google maps. Il completamento automatico favorirà quindi le posizioni all'interno di quei confini. Si noti, tuttavia, che poiché questo non è un limite rigido, se ci sono corrispondenze per la ricerca al di fuori dei confini, le restituiranno.

Dal mio utilizzo sembra un po 'buggato e può essere migliorato, soprattutto considerando che qualsiasi cosa al di fuori del tuo limite non è contrassegnata dalla prossimità, quindi qualcosa a un isolato dal confine è altrettanto probabile che mostri qualcosa come 1000 miglia fuori, quindi assicurati di giocare con i limiti che funzionano correttamente.

+1

La risposta corretta è utilizzando componentRestrictions, che consente di limitare il completamento automatico ai paesi, come mostrato nella risposta di Ercan. –

+2

corretto. È stato aggiunto all'API v3.9 il 25 luglio 2012. Al momento della stesura della risposta di cui sopra, l'API era alla v3.6. Questa è la risposta di Google alla richiesta di funzionalità sopra menzionata. Ad oggi, v3.12 è la versione più bassa consegnata, quindi dovrebbe essere standard in tutte le richieste API. –

1

Il modo migliore per farlo è quello di interrogare personalmente i luoghi e aggiungere la stringa interrogata al proprio paese. O, ovviamente, utilizzare lo geo-autocomplete jQuery plugin.

2

James Alday è corretto:

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

è un po 'fastidioso come la ricerca di Durham dà Durham, North Carolina come il secondo risultato, a prescindere da come si tenta di convincerlo a regione pregiudizi - è possibile impostarlo sui limiti della mappa della vista e tenterà comunque di suggerire lo stato NC ... La soluzione jQuery può essere trovata qui, ma non sembra dare tanti risultati come l'API v3. http://code.google.com/p/geo-autocomplete/

4

È possibile intercettare i JSONP risultati restituiti dalla funzionalità google.maps.places.Autocomplete e usarli come meglio credi, tale da limitare per paese e visualizzare i risultati.

Fondamentalmente si ridefinisce il metodo appendChild sull'elemento head e quindi si monitorano gli elementi javascript che il codice di completamento automatico di Google inserisce nel DOM per JSONP. Quando vengono aggiunti elementi javascript, si sostituiscono i callback JSONP definiti da Google per ottenere l'accesso ai dati grezzi di completamento automatico.

E 'un po' di hack, qui va (sto usando jQuery ma non è necessario che questo hack al lavoro):

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

Il tuo approccio sembra molto interessante e l'unico ad affrontare i problemi inerenti alla limitazione a una regione utilizzando i parametri di Google. Sareste in grado di pubblicare un JSFiddle completo o simile incorporando quanto sopra per favore? Ho difficoltà a capire come si inseriscono negli esempi di Google e un esempio operativo completo sarebbe di grande aiuto. Grazie –

0

provare qualcosa di simile.

// 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() { 
}); 
Problemi correlati