2012-01-10 27 views
16

tôi đã cố gắng sử dụng một số ajax để lưu vị trí địa điểm trong ứng dụng của tôi và stumbled trên đoạn mã sau vào stack overflowlấy lat/dài của vị trí sử dụng google.maps.geocoder

function getLatLong(address) 
{ 
    var geocoder = new google.maps.Geocoder(); 
    var result = ""; 
    geocoder.geocode({ 'address': address, 'region': 'uk' }, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      result[lat] = results[0].geometry.location.Pa; 
      result[lng] = results[0].geometry.location.Qa; 
     } else { 
      result = "Unable to find address: " + status; 
     } 
    }); 
    return result; 
} 

vấn đề của tôi là khi tôi gọi hàm này trả về không có gì và khi tôi gỡ lỗi và thiết lập các điểm ngắt trong chrome nó phá vỡ trên kết quả trả về đầu tiên trước khi nó phá vỡ kết quả [lat] = results [0] .geometry.location.Pa;

Tôi biết mảng nên được khai báo là kiểu mảng nhưng ngay cả khi tôi đã chỉ trả lại kết quả [0] .geometry.location đối tượng không có gì đã được trả lại

gì tôi có thể làm gì để trả lại lat/dài vị trí để tôi có thể lưu trữ trong db của tôi?

+0

có thể trùng lặp với [API Google Địa điểm tại sao nó trả về Lat và Lon dưới một biến khác nhau mỗi lần?] (Http://stackoverflow.com/questions/13505928/google-places-api-why-does -it-returns-lat-và-lon-dưới-a-khác nhau-biến-eac) – Gajus

Trả lời

16

Sự cố bạn đang gặp phải là bạn đang xử lý hàm geocoder.geocode ngay khi hoàn thành trước khi bạn thực hiện kết quả trả về. Điều thực sự xảy ra là geocoder.geocode được kích hoạt, sau đó bạn nhận được kết quả trả về ngay lập tức. Vì kết quả không đồng bộ có nhiều khả năng không được trả về, kết quả của bạn trống. Hãy nghĩ về kết quả mã hóa địa lý như một cú đẩy, không phải là một sự kéo. Hàm storeResult, không được hiển thị, là bất kỳ mã nào bạn cần làm để lưu thông tin. Bởi vì bạn đang kết hợp một kết quả với một chuỗi lỗi, bạn phải xử lý nó trong hàm storeResult của bạn. Thay vào đó, bạn có thể có một trạng thái trong kết quả cho thấy succcess hoặc thất bại.

function getLatLong(address) { 
var geocoder = new google.maps.Geocoder(); 
var result = ""; 
geocoder.geocode({ 'address': address, 'region': 'uk' }, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     result[lat] = results[0].geometry.location.Pa; 
     result[lng] = results[0].geometry.location.Qa; 
    } else { 
     result = "Unable to find address: " + status; 
    } 
    storeResult(result); 
    }); 
} 
+0

cảm ơn vì điều này- tôi đã sử dụng javascript để xác thực địa chỉ để bắt đầu, sau đó đăng nó lên máy chủ và sử dụng một yêu cầu http để lấy thông tin mã địa lý. có lẽ sẽ tái cấu trúc thêm xuống đường –

+0

Như Lee Smith nói, không sử dụng các trường nội bộ của kết quả. Tôi chỉ sử dụng chúng bởi vì OP đã làm như vậy. Google thường thay đổi tên biến nội bộ, do đó bạn không thể dựa vào chúng. Sử dụng API. –

+4

Xem câu trả lời của Lee Smith ... sử dụng hàm geometry.location.lat() và geometry.location.lng() để thay thế. – NexusRex

20

Đây không phải là câu trả lời nhưng không sử dụng Pa và Qa luôn luôn sử dụng lng() và lat() chức năng:

place.geometry.location 
{...} 
    Pa: 56.240477 
    Qa: -0.902655999999979 
    toString: function(){return"("+this.lat()+", "+this.lng()+")"} 
    equals: function(a){return!a?k:Cd(this.lat(),a.lat())&&Cd(this.lng(),a.lng())} 
    lat: function(){return this[a]} 
    lng: function(){return this[a]} 
    toUrlValue: function(a){a=Hd(a)?a:6;return $d(this.lat(),a)+","+$d(this.lng(),a)} 
+14

Để thêm rõ ràng hơn cho câu trả lời này: Bộ mã hóa địa lý của Google đôi khi trả về giá trị lat và lng là Pa và QA, lần khác là Sa và Ta ... cách duy nhất được đảm bảo là sử dụng geometry.location.lat() và hình học. location.lng() – NexusRex

2

tôi phải vật lộn với khó khăn này và tìm thấy những điều sau đây để làm việc .

  1. Vòng qua các đối tượng và đẩy vào một mảng mới:

    var newArray = []; 
    
    for (var key in latLng) { 
    
        newArray.push(key); 
    
    } 
    
  2. Gọi đối tượng của bạn với các giá trị biến với cú pháp khung vuông, phá vỡ ký hiệu dấu chấm:

    var lat = latLng[newArray[0]]; 
    
    var lng = latLng[newArray[1]]; 
    
0

Trong trường hợp của tôi, giải pháp đơn giản nhất để nhận vĩ độ và kinh độ từ đối tượng địa điểm là:

var latitude=place.geometry.location['k']; 
    var longitude=place.geometry.location['A']; 
Các vấn đề liên quan