2009-08-21 16 views
11

googlemaps api kullanarak eşzamanlı olarak bir şey geocode kodlama mümkün olup olmadığını, böylece çağrılacak bir geri çağırma işlevini beklemek yerine, bir değer iade edilmesini beklerdi merak ediyorum. Böyle bir şey yapmanın bir yolu var mı?Google Maps API Geocode Eşzamanlı olarak

P.S. .: Ben API

cevap

1

Geocoder değer ile geri arama işlevini çağırır sürümünü 3 kullanıyorum. Bunu yapmanın tek yolu bu. Senkronize olsaydı, kodunuz Geocode'un işlenmesini beklerken donuyordu. Bunu yapmak için gerçekten bir sebep yok.

Tam olarak ne yapmaya çalışıyorsunuz?

+1

Adres içeren bir formum var. Form verilerini doğrulamanın bir parçası olarak, adresi kontrol etmek için googles geocoder'ı kullanmayı düşünüyordum. Veritabanıma girmek için enlem ve boylam değerlerine de ihtiyacım var. Bunu geri arama işlevini kullanarak yapabileceğimi biliyorum, ancak bu bir kesmek gibi görünüyor ve daha karmaşık olurdu. – giroy

+1

Geocoder'ın tamamen geri arama işleviyle kullanılması amaçlanmıştır. Endişelenme, o bir hack değil. :) Bu gerçekten tek seçeneğiniz. Bununla birlikte, bir Google Haritasındaki sonuçları bir şekilde göstermeden Geocoder'ı kullanıyorsanız, Google Haritalar Hizmet Şartları'nı ihlal edeceğinizi unutmayın. –

+0

Bildiğim kadarıyla, Google api'yi dahili bir sistemde veya belirli bir kitleyle kullanamazsınız. Haritalar'ı kullanan sayfanız tüm İnternet'e açık olmalıdır - sözleşme şartlarını okuyun. İyi @B Chris @Chris B –

7

Evet, eşzamanlı bir istek gerekmediği halde, elde etmeye çalıştığınız şey mümkündür. sunumundan bu kodun

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(); 
    }); 

}); 

Yani, forma işleyicisi göndermek takmak en

Bak senin formdan adres bilgi dayalı jeo isteğini yapmak. Ancak aynı zamanda, işleyiciye yanlış göndererek gönderimi erteleyebilirsiniz. Yanıt işleyicisi 2 gizli textfields 'lat' ve 'long' yapacak ve yanıtı saklayacaktır. Son olarak, form iki yeni alan da dahil olmak üzere istemci komut dosyasıyla gönderilir. Sunucu tarafında bunları DB'de saklayabilirsiniz.

!! Bunun mümkün olduğunu unutmayın, ancak muhtemelen yukarıda belirtildiği gibi Google şartlarına aykırıdır.

+1

büyük cevap! Kullanıcı, gerekli bilgileri (veya bundan sonra biraz zaman aşımına uğradı) sağladığında coğrafi isteği yapabildiğinizi ekleyebilirim. Bu yüzden, formun geri kalanını tamamlarken, Geocoder'ın yanıtı gönderme zamanı vardır. Kullanıcı, fikrini değiştirmeye devam ederse, bunun gibi daha fazla coğrafi istekte bulunacaksınız. – GoTo

+0

Google terimleriyle ilgili olarak, yanıtları bir veritabanında depolarsanız bunları kırdığınızı düşünmüyorum. Basit bir örneğin ötesine geçen her türlü webapp, cevapları bir veritabanında saklamanızı gerektirir. Cevapları Google Haritalar olmadan veya kapalı/dahili bir sistemde kullanırsanız kırın. – GoTo

1

Yalnızca form gönderirken gönderim sırasında bayrağın kullanılması gerektiğini veya geocoding için beklemesi gerektiğini bildiririm. Coğrafi kodlama yapıldığı zaman formu tekrar gönderir.

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; 
    });