2014-10-29 7 views
7

Mam pola wyszukiwania adresu za pomocą Google Map autouzupełniania Biblioteka:Mapa Google umieszcza API getPlace() tylko powrócić atrybut name dla niektórych adresów

var autocompleter = new google.maps.places.Autocomplete(item); 

występuje dziwny okazja, że ​​adres zwraca tylko atrybut name :

Object {name: "138 Manukau Road, Pukekohe, New Zealand"} 

Ale inne adresy dają więcej danych, takich jak:

Object {address_components: Array[7], adr_address: "<span class="street-address">430 Queen St</span>, …n>, <span class="country-name">New Zealand</span>", formatted_address: "430 Queen St, Auckland, Auckland 1010, New Zealand", geometry: Object, icon: "http://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png"…}address_components: Array[7]adr_address: "<span class="street-address">430 Queen St</span>, <span class="extended-address">Auckland</span>, <span class="locality">Auckland</span> <span class="postal-code">1010</span>, <span class="country-name">New Zealand</span>"formatted_address: "430 Queen St, Auckland, Auckland 1010, New Zealand"geometry: Objecthtml_attributions: Array[0]icon: "http://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png"id: "00fce9b1c43ac960068949cbf32eecb587b0b020"name: "430 Queen St"place_id: "ChIJQfHW8OVHDW0RyHgQRLy8fKc"reference: "CqQBlgAAAIDnkWNQ4cmU624FV6l_bAxmI27czZoytmzrrEWVaXgR5LcZuFqt1cL3WIMzoWhmZNhftRzhLUVwpFjqmw3qwKIqugj02HrvU5x6PtUvepPNPV-08pin_PvRU-__mMMH3N2vILIOLM_AnYFMqNG5MArF4ChZXJxZj6vk7PI3ORJe1W6QjIXoPgesL379E4WUCjrZ0fjv3KgqzB-G4f-8A5MSEN5S47-QZqkY5sl37cIQFWQaFLg4InSVLpYGg8n1gGO958TcA4UK"scope: "GOOGLE"types: Array[1]url: "https://maps.google.com/maps/place?q=430+Queen+St,+Auckland,+Auckland+1010,+New+Zealand&ftid=0x6d0d47e5f0d6f141:0xa77cbcbc441078c8"vicinity: "Auckland"__proto__: Object 

Znalazłem numer similar issue, który został zgłoszony przez kogoś w 2012 r. I wygląda na to, że nie był w nim uczestniczyć.

+0

kod działa na 99% miejsc. Jednak konsekwentnie nie działa w pewnym podzbiorze miejsc docelowych.Silver Peak to jeden, El Paso TX to kolejny. Jeśli zrobię konsolę console.log w obiekcie Google google, oto wyniki: Obiekt {nazwa: "Silver Peak, NV, Stany Zjednoczone"} – CHawk

Odpowiedz

2

Zaskakująco, ten sam adres, który teraz zwraca poprawne dane, Google musi obserwować te błędy i naprawić je tak szybko, jak to możliwe.

1

Być może usługa google nie jest w stanie dokonać geokodowania adresu i zwraca tylko nazwę znalezionego adresu. Przyczyną może być to, że usługa nie ma żadnych dodatkowych danych, które można podać dla tego adresu. Można po prostu nie pokazują tych niepełny adres użytkownika lub spróbuj Geokodując tego adresu przez inne służby jak OSM Geocoder http://wiki.openstreetmap.org/wiki/Nominatim

+0

Google czasami zwraca dane dla tych adresów, więc wiem, że są one dostępne. Te identyfikatory miejsca pochodzą z wyniku autouzupełniania Google, w jaki sposób mogę je odfiltrować dla użytkownika? – CHawk

+0

Możesz to zrobić, modyfikując kod źródłowy, jeśli jest on dostępny lub możesz po prostu powiązać własne dane geokodera z kilkoma usługami geokodera. Możesz także utworzyć własną usługę geokodera, na przykład, korzystając z postgreSQL/postGIS. Być może przybywasz do maksymalnego żądania i nie przesyłasz wszystkich danych. –

1

Od Google Maps Autocomplete Reference:

Zwraca szczegóły wybranego przez użytkownika miejsca, jeśli szczegółów zostały pomyślnie pobrane przez . W przeciwnym razie zwraca obiekt kodu pośredniego z wartością właściwość name ustawioną na bieżącą wartość pola wejściowego.

Odpowiedź jest więc taka, że ​​metoda getPlace po prostu nie działa w określonych miejscach. Nie wiem, jak rozwiązać ten problem, ale przybliża nas do odpowiedzi.

EDYCJA: NAPRAWIONE!

Dla mojej aplikacji ładuję wiele bibliotek do map Google (geometria i miejsca). Zmiana kolejności ładowanych bibliotek naprawiła problem i nie wiem dlaczego.

Zmiana:

maps.googleapis.com/maps/api/js?v=3&key=[KEY]&libraries=geometry,places 

do

maps.googleapis.com/maps/api/js?v=3&key=[KEY]&libraries=places,geometry 
3

Ten problem dzieje się z przerwami do mnie i zwykle znikąd.

Okazało się, że jeśli otrzymasz wynik z autouzupełniania z tylko właściwością name, możesz użyć google.maps.places.AutocompleteService, aby zakończyć pracę.

Na przykład, nazwać to, jeśli można dostać tylko nazwę z powrotem (wysyłanie elementu wejściowego w el)

 function getPlace(result, el, callback) { 
      var autocompleteService = new google.maps.places.AutocompleteService(); 
      if (result.name.length > 0) { 
       var d = { input: result.name, offset: result.name.length }; 
       autocompleteService.getPlacePredictions(d, function (list, status) { 
        if (list == null || list.length == 0) callback(null); 

        var placesService = new google.maps.places.PlacesService(el); 
        var ref = { 'reference': list[0].reference } 

        placesService.getDetails(ref, function (detailsResult, placesServiceStatus) { 
         if (placesServiceStatus == google.maps.GeocoderStatus.OK) { 
          callback(detailsResult); 
         } 
         else { 
          callback(null); 
         } 
        }); 
       }); 
      } 
     } 

To bardzo mi pomogło http://plnkr.co/edit/GF3nM3XfYX9El2w11pGo?p=preview

+0

Fwiw, to działa dobrze w magazynie JS, ale jest trochę problematyczne w Maszynopisie. Dokumenty (https://developers.google.com/maps/documentation/javascript/reference#PlacesService) pokazują, że obiekt PlacesService.getDetails powinien oczekiwać obiektu PlaceDetailsRequest, ale ten interfejs nie zawiera "odwołania" do niego. Nie wiem, jak sprawić, by TS było z tego powodu szczęśliwe. – leff

+0

OK, dla Typescript można obejść fakt, że 'referencja' jako opcja' getDetails() 'jest nieudokumentowana. Nie jest świetny, ale wygląda na "const ref = {'reference': list [0] .reference}' – leff

Powiązane problemy