2009-08-21 24 views
11

Zastanawiam się, czy możliwe jest geokodowanie czegoś za pomocą interfejsu API googlemaps synchronicznie, więc zamiast czekać na wywołanie funkcji zwrotnej, czekałoby na zwrócenie wartości. Czy ktoś znalazł sposób na zrobienie czegoś takiego.Google Maps API Geocode Synchronously

P.S .: Używam wersji 3 API

Odpowiedz

1

geocoder nazywa swoją funkcję zwrotną z wartością. To jedyny sposób, aby to zrobić. Jeśli byłby synchroniczny, twój skrypt zawiesiłby się, czekając na przetworzenie Geokodu. Naprawdę nie ma powodu, aby to robić w ten sposób.

Co dokładnie próbujesz osiągnąć?

+1

Mam formularz, który zawiera adres. W ramach sprawdzania poprawności danych formularza rozważałem użycie geokodera Google do sprawdzenia adresu. Potrzebuję również wartości szerokości i długości geograficznej, które należy wprowadzić do mojej bazy danych. Wiem, że mogę to zrobić za pomocą funkcji wywołania zwrotnego, ale to wygląda na włamanie i byłoby bardziej skomplikowane. – giroy

+1

Geokoder jest w całości przeznaczony do użycia z funkcją wywołania zwrotnego. Nie martw się, to nie jest hack. :) To naprawdę twoja jedyna opcja. Pamiętaj jednak, że złamiesz Warunki korzystania z Map Google, jeśli korzystasz z Geokodera, nie wyświetlając wyników na Mapie Google. –

+0

Z tego co wiem, nie możesz używać google api w systemie wewnętrznym lub z wybranymi odbiorcami. Twoja strona korzystająca z Map powinna być otwarta dla całego internetu - przeczytaj warunki umowy. Good @ B Chris @Chris B –

7

Tak, to, co próbujesz osiągnąć, jest możliwe, chociaż żądanie synchroniczne nie jest potrzebne.

Spójrz na ten kod

function StoreGeo() 
{ 
     var address = $('input[name=zipcode]').val() + ', ' + $('input[name=city]').val(); 
geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     var ll = results[0].geometry.location.toString(); 

      llarr = ll.replace(/[\(\) ]/g, '').split(','); 

       for(i = 0; i < llarr.length;i++) 
       { 
        $('#form').append($('<input type="hidden" name="'+(i == 0 ? 'lat' : 'long')+'">').val(llarr[i])); 
       } 

       $('#form').submit(); 
     } 
     else 
     { 
     alert(status); 
     } 
    }); 

    $('#form').unbind('submit'); 
    return false; 
} 

$(document).ready(function() { 

    //init maps 
    geocoder = new google.maps.Geocoder(); 

    $('#form').bind('submit',function() { 
     StoreGeo(); 
    }); 

}); 

Więc dołączyć złożyć obsługi do formy, gdy zostanie złożony wniosek geo zrobić na podstawie informacji adresowej z formularza. Ale jednocześnie odkładaj przesyłanie, zwracając wartość false w programie obsługi. Program obsługi odpowiedzi utworzy 2 ukryte pola tekstowe "lat" i "długo" i zapisze odpowiedź. wreszcie formularz jest składany przez skrypt klienta, w tym dwa nowe pola. Po stronie serwera można przechowywać je w DB.

!! Zauważ, że jest to możliwe, ale prawdopodobnie jest niezgodne z warunkami Google, jak wspomniano powyżej.

+1

świetna odpowiedź! Dodam, że można wykonać żądanie geo, gdy tylko użytkownik poda potrzebne informacje (lub po jakimś czasie). Podczas gdy on kończy resztę formularza, Geocoder ma czas, aby wysłać odpowiedź. Będziesz generował więcej żądań geo takich, jeśli użytkownik zmienia zdanie. – GoTo

+0

Jeśli chodzi o warunki w google, nie sądzę, że je złamiesz, jeśli po prostu zapisujesz odpowiedzi w bazie danych. Prawie każdy rodzaj aplikacji webowej, która wykracza poza prosty przykład, będzie wymagał zapisania odpowiedzi w bazie danych. Łamiesz je, jeśli używasz odpowiedzi bez Map Google lub w zamkniętym/wewnętrznym systemie. – GoTo

1

Po prostu używam flagi podczas przesyłania formularza, aby wiedzieć, kiedy należy przesłać lub kiedy należy poczekać na geokodowanie. Po zakończeniu geokodowania ponownie prześle formularz.

var hasGeocoded = false; 

    searchFrom.on('submit', function(){ 
     //If not geocoded yet 
     if (!hasGeocoded) { 
      var geocoder = new google.maps.Geocoder(); 
      var location = locationEl.val(); 
      geocoder.geocode({'address': location}, function (results, status) { 
       hasGeocoded = true; 

       if (status == google.maps.GeocoderStatus.OK) { 
        $('#coords').val(
         results[0].geometry.location.lat() + ',' + results[0].geometry.location.lng() 
        ); 
       } 

       searchFrom.submit(); 
      }); 

      return false; //wait for geocoder to finish and re-submit the form 
     } 

     return true; 
    });