2009-08-21 5 views
11

Tôi đã tự hỏi liệu có thể mã hóa địa lý một cái gì đó bằng cách sử dụng googlemaps api đồng bộ như vậy thay vì chờ một hàm gọi lại được gọi, nó sẽ chờ một giá trị được trả về. Có ai tìm thấy cách để làm một cái gì đó như thế này.Google Maps API Geocode Đồng bộ

P .: Tôi đang sử dụng phiên bản 3 của api

Trả lời

1

Bộ mã hóa địa lý gọi hàm gọi lại của bạn bằng giá trị. Đó là cách duy nhất để làm điều đó. Nếu nó đã được đồng bộ, kịch bản của bạn sẽ đóng băng trong khi nó chờ Geocode để xử lý. Thực sự không có lý do gì để làm như vậy.

Chính xác thì bạn đang cố gắng hoàn thành điều gì?

+1

Tôi có một biểu mẫu bao gồm địa chỉ. Là một phần của việc xác thực dữ liệu biểu mẫu, tôi đã nghĩ đến việc sử dụng gocgles geocoder để kiểm tra địa chỉ. Tôi cũng cần các giá trị vĩ độ, kinh độ để nhập vào cơ sở dữ liệu của tôi. Tôi biết tôi có thể làm điều này bằng cách sử dụng chức năng gọi lại, nhưng điều đó có vẻ như một hack và sẽ phức tạp hơn. – giroy

+1

Bộ mã hóa địa lý được thiết kế hoàn toàn để sử dụng với chức năng gọi lại. Đừng lo lắng, nó không phải là một hack. :) Nó thực sự là lựa chọn duy nhất của bạn. Tuy nhiên, hãy nhớ rằng bạn sẽ vi phạm Điều khoản dịch vụ của Google Maps nếu bạn đang sử dụng Trình mã hoá địa lý mà không hiển thị kết quả trên Google Map bằng cách nào đó. –

+0

xa như tôi biết, bạn không thể sử dụng api google trong một hệ thống nội bộ hoặc với một đối tượng được chọn. Trang của bạn sử dụng Bản đồ phải mở cho toàn bộ internet - đọc các điều khoản của hợp đồng. Tốt @B Chris @Chris B –

7

Có, những gì bạn đang cố gắng đạt được là có thể, mặc dù yêu cầu đồng bộ là không cần thiết.

Nhìn vào mã này

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

}); 

Vì vậy, đính kèm nộp xử lý với hình thức, khi nó được gửi làm theo yêu cầu geo dựa trên các thông tin địa chỉ từ hình thức của bạn. Nhưng đồng thời trì hoãn việc gửi bằng cách trả về false trong trình xử lý. Trình xử lý phản hồi sẽ tạo 2 vùng văn bản ẩn 'lat' và 'long' và lưu trữ phản hồi. cuối cùng biểu mẫu được gửi bởi kịch bản lệnh khách, bao gồm cả hai trường mới. Ở phía máy chủ, bạn có thể lưu trữ chúng trong DB.

!! Lưu ý rằng điều này là có thể, nhưng có lẽ là chống lại các điều khoản google, như đã nói ở trên.

+1

câu trả lời tuyệt vời! Tôi sẽ thêm rằng bạn có thể thực hiện yêu cầu địa lý ngay sau khi người dùng cung cấp thông tin cần thiết (hoặc một thời gian sau đó). Vì vậy, trong khi anh ta hoàn thành phần còn lại của biểu mẫu, Geocoder có thời gian để gửi trả lời. Bạn sẽ thực hiện nhiều yêu cầu địa lý như thế này, nếu người dùng tiếp tục thay đổi ý định của mình. – GoTo

+0

Đối với thuật ngữ google, tôi không nghĩ rằng bạn phá vỡ chúng nếu bạn chỉ cần lưu trữ các câu trả lời trong cơ sở dữ liệu. Khá nhiều loại webapp vượt xa một ví dụ đơn giản sẽ yêu cầu bạn lưu trữ các câu trả lời trong cơ sở dữ liệu. Bạn phá vỡ chúng nếu bạn sử dụng câu trả lời mà không có Google Maps, hoặc trong một hệ thống khép kín/nội bộ. – GoTo

1

Tôi chỉ cần sử dụng cờ trong khi gửi biểu mẫu để biết thời điểm gửi nên qua hoặc khi nào cần phải mã hóa địa lý. Khi mã hóa địa lý được thực hiện, sau đó nó sẽ gửi lại biểu mẫu.

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