2009-07-16 5 views
20

Tôi có GPS thông tin thể hiện dưới dạng:Chuyển đổi vĩ độ và kinh độ thập phân giá trị

36 ° 57'9" N 110 ° 4'21" W

Tôi có thể sử dụng để chuyển đổi javascript functions of Chris Veness độ, phút và giây đến độ bằng số, nhưng trước tiên cần phải phân tích thông tin GPS thành các vĩ độ và kinh độ riêng lẻ (với hậu tố NSEW). Tôi đã đọc các bài viết liên quan trên stackoverflow, nhưng không phải là một chuyên gia regex (cũng không phải là một lập trình viên) và cần một số trợ giúp với chức năng phân tích cú pháp. Cách tốt nhất để phân tích chuỗi này thành vĩ độ và kinh độ để sử dụng trong hàm chuyển đổi là gì?

Kết quả của tất cả điều này sẽ là liên kết Web mà người dùng có thể nhấp vào để xem bản đồ vị trí trên bản đồ của Google.

+2

gì chính xác là định dạng của đầu ra bạn đang tìm kiếm? Có giống như: "36 57 9 N" và "110 4 21 W" cho đầu vào bạn đã đưa ra không? Đầu vào có luôn ở dạng này không? –

+0

Đối với các đầu vào tôi đã hiển thị, tôi mong đợi đầu ra là hai giá trị: 36.95250 -110.07250 Và có, đầu vào luôn ở dạng này. –

+0

Điều đó nên đọc, "hai giá trị: 36.95250 và -110.07250 (không có" và "tất nhiên). Xin lỗi –

Trả lời

41

Để phân tích đầu vào của bạn, hãy sử dụng các mục sau.

function ParseDMS(input) { 
    var parts = input.split(/[^\d\w]+/); 
    var lat = ConvertDMSToDD(parts[0], parts[1], parts[2], parts[3]); 
    var lng = ConvertDMSToDD(parts[4], parts[5], parts[6], parts[7]); 
} 

Sau đây sẽ chuyển đổi DMS của bạn sang DD

function ConvertDMSToDD(degrees, minutes, seconds, direction) { 
    var dd = degrees + minutes/60 + seconds/(60*60); 

    if (direction == "S" || direction == "W") { 
     dd = dd * -1; 
    } // Don't do anything for N or E 
    return dd; 
} 

Vì vậy, đầu vào của bạn sẽ tạo ra những điều sau đây:

36°57'9" N = 36.9525000 
110°4'21" W = -110.0725000 

tọa độ thập phân có thể được đưa vào bản đồ google để có được điểm qua GLatLng(lat, lng) (Google Maps API)

+0

Có lẽ tốt hơn một chút: var parts = input.split (/ [^ \ d \ w] + /). Điều chỉnh bù đắp bằng -1. – Inshallah

+0

@Inshalla - cảm ơn! –

+0

Điều đó sẽ có tác dụng! Tôi sẽ cố gắng tối nay. Cảm ơn tất cả những ai đã trả lời. Trang web này là tốt nhất! –

2

Joe, tập lệnh bạn đã đã đề cập đã làm những gì bạn muốn. Với nó, bạn có thể chuyển đổi lat và dài và đặt nó vào liên kết để xem vị trí trên bản đồ của Google:

var url = "http://maps.google.com/maps?f=q&source=s_q&q=&vps=3&jsv=166d&sll=" + lat.parseDeg() + "," + longt.parseDeg() 
3

Tôi có một số của NaN về chức năng này và cần phải làm điều này (đừng hỏi tôi tại sao)

function ConvertDMSToDD(days, minutes, seconds, direction) { 
    var dd = days + (minutes/60) + seconds/(60*60); 
    dd = parseFloat(dd); 
    if (direction == "S" || direction == "W") { 
     dd *= -1; 
    } // Don't do anything for N or E 
    return dd; 
} 
2

đây là quan điểm của tôi về vấn đề này:

function parse_gps(input) { 

if(input.indexOf('N') == -1 && input.indexOf('S') == -1 && 
    input.indexOf('W') == -1 && input.indexOf('E') == -1) { 
    return input.split(','); 
} 

var parts = input.split(/[°'"]+/).join(' ').split(/[^\w\S]+/); 

var directions = []; 
var coords = []; 
var dd = 0; 
var pow = 0; 

for(i in parts) { 

    // we end on a direction 
    if(isNaN(parts[i])) { 

     var _float = parseFloat(parts[i]); 

     var direction = parts[i]; 

     if(!isNaN(_float)) { 
      dd += (_float/Math.pow(60, pow++)); 
      direction = parts[i].replace(_float, ''); 
     } 

     direction = direction[0]; 

     if(direction == 'S' || direction == 'W') 
      dd *= -1; 

     directions[ directions.length ] = direction; 

     coords[ coords.length ] = dd; 
     dd = pow = 0; 

    } else { 

     dd += (parseFloat(parts[i])/Math.pow(60, pow++)); 

    } 

} 

if(directions[0] == 'W' || directions[0] == 'E') { 
    var tmp = coords[0]; 
    coords[0] = coords[1]; 
    coords[1] = tmp; 
} 

return coords; 

}

chức năng này không xử lý tất cả các loại lat/loại dài, nhưng nó xử lý các định dạng sau:

-31,2222,21.99999 
-31 13 13 13.75S, -31 13 13 13.75W 
-31 13 13 13.75S -31 13 13 13.75W 
-31 13 13 13.75W -31 13.75S 
36°57'9" N 110°4'21" W 
110°4'21" W 36°57'9"N 

Đó là những gì tôi cần.

4

Phiên bản được tinh chỉnh của tôi ràng buộc các phần chuỗi thành các số để chúng có thể được thêm vào cùng nhau thay vì được ghép nối. Nó cũng xử lý các giá trị thập phân được phổ biến cho các thành phần Giây:

function ParseDMS(input) { 
    var parts = input.split(/[^\d\w\.]+/); 
    var lat = ConvertDMSToDD(parts[0], parts[1], parts[2], parts[3]); 
    var lng = ConvertDMSToDD(parts[4], parts[5], parts[6], parts[7]); 
} 

Sau đây sẽ chuyển đổi DMS của bạn sang DD

function ConvertDMSToDD(degrees, minutes, seconds, direction) { 
    var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60); 

    if (direction == "S" || direction == "W") { 
     dd = dd * -1; 
    } // Don't do anything for N or E 
    return dd; 
} 
9

Corrected các chức năng trên và làm cho đầu ra một đối tượng.

function ParseDMS(input) { 
    var parts = input.split(/[^\d\w\.]+/);  
    var lat = ConvertDMSToDD(parts[0], parts[2], parts[3], parts[4]); 
    var lng = ConvertDMSToDD(parts[5], parts[7], parts[8], parts[9]); 

    return { 
     Latitude : lat, 
     Longitude: lng, 
     Position : lat + ',' + lng 
    } 
} 


function ConvertDMSToDD(degrees, minutes, seconds, direction) { 
    var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60); 

    if (direction == "S" || direction == "W") { 
     dd = dd * -1; 
    } // Don't do anything for N or E 
    return dd; 
} 
+0

nếu bạn biết trước rằng 60 * 60 là 3600 tại sao phải tính toán? –

0

tôi đã sử dụng \\ d + (d + (\, \ d +).\ D +) vì có thể có số float

chức năng cuối cùng của tôi:

convertDMSToDD: function (dms) { 
    let parts = dms.split(/[^\d+(\,\d+)\d+(\.\d+)?\w]+/); 
    let degrees = parseFloat(parts[0]); 
    let minutes = parseFloat(parts[1]); 
    let seconds = parseFloat(parts[2].replace(',','.')); 
    let direction = parts[3]; 

    console.log('degrees: '+degrees) 
    console.log('minutes: '+minutes) 
    console.log('seconds: '+seconds) 
    console.log('direction: '+direction) 

    let dd = degrees + minutes/60 + seconds/(60 * 60); 

    if (direction == 'S' || direction == 'W') { 
     dd = dd * -1; 
    } // Don't do anything for N or E 
    return dd; 
    }