2011-08-17 46 views
6

Tôi tự hỏi loại thư viện nào tồn tại (được cấp phép hay không), nơi tôi có thể tìm thấy các phương pháp để chuyển đổi giữa các tọa độ vĩ độ/kinh độ và tọa độ hệ tọa độ lưới quân sự (mgrs). Tôi không rõ ràng tìm kiếm một chuyển đổi lat/long to UTM, nó phải là mgrs. Tôi đã thực hiện một số tìm kiếm và googling và từ những gì tôi đã tìm thấy, lat/long để UTM thường xuyên xuất hiện, nhưng có vẻ như không ai có thư viện để chuyển đổi lat/long để MGRS và ngược lại.Thư viện Java có thể chuyển đổi vĩ độ/kinh độ sang tọa độ MGRS và ngược lại?

Có ai biết về bất kỳ thư viện hoặc địa điểm nào mà tôi có thể tìm thấy thư viện sẽ thực hiện việc đó không?

Cảm ơn, mọi trợ giúp đều được đánh giá cao.

tf.rz

Trả lời

6

Tôi biết đây là một bài đăng cũ, nhưng tôi sẽ thêm một số chi tiết cho hậu thế. JCoords có một chuyển đổi điểm MGRS, nhưng nó đòi hỏi một khoản phí cấp phép nhỏ. Một nguồn khác là dự án WorldWind của NASA (tương tự như Google Earth), đã chuyển đổi API GeoTrans cũ được tạo ra bởi NGA. Đây là việc thực hiện chuyển đổi MGRS: MGRSCoordConverter.java

+7

Điều này không hữu ích vì bạn thực sự cần toàn bộ thư viện World Wind (lần lượt có phụ thuộc vào AWT và libs khác) và dự án có mã đăng nhập tùy chỉnh riêng được nhúng vào một số chức năng này. Tôi tách tất cả những điều đó ra và cung cấp mã trên GitHub: https://github.com/Berico-Technologies/Geo-Coordinate-Conversion-Java. Tôi cũng nên thêm rằng đây thực sự là nguồn mở với một giấy phép thân thiện. –

+0

Bài đăng cũ, nhưng tôi nghĩ mọi người nên đọc câu trả lời của bạn trước tiên vì tôi nghĩ câu trả lời cho câu hỏi của riêng tôi rất cụ thể đối với trường hợp của riêng tôi. Cảm ơn! –

3

Tôi đã tìm thấy một thư viện gọi OpenMap trong com.bbn.openmap.proj.coords thư viện họ có một lớp được gọi là điểm MGRS. Đạo cụ cho một số câu hỏi về stackoverflow để cung cấp các câu trả lời khác nhau. Tôi đã không thể tìm thấy câu hỏi trong câu trả lời này, nhưng nó đã cho tôi câu trả lời tôi đang tìm kiếm: openmap! Tuy nhiên, kinh độ vĩ độ chuyển đổi để mgrs điểm có vẻ là bị lỗi, nhưng ngược lại hoạt động hoàn toàn tốt đẹp; và đó là những gì tôi cần.

2

Một bài đăng khác cho hậu thế, vì tìm kiếm của tôi cũng bật lên trang này. Có một lớp chuyển đổi tọa độ Java bao gồm MGRS cũng như UTM và lat/lon được mô tả và tải xuống tại đây: http://www.ibm.com/developerworks/java/library/j-coordconvert/

Một lưu ý cho biết: "Tải xuống cũng bao gồm các phương pháp MGRS, nhưng chuyển đổi từ MGRS không đúng." Có lẽ nó sẽ phục vụ như là một điểm khởi đầu và có thể sửa chữa được.

0

Tôi đã phát triển các hàm sau (được thừa nhận javascript) kết hợp các bit từ hai nguồn chính cộng với các bit khác trên internet. Tôi đã tối ưu hóa chúng cho tốc độ không hiểu!

hai nguồn chính của tôi là: http://www.movable-type.co.uk/scripts/latlong-utm-mgrs.html http://home.hiwaay.net/~taylorc/toolbox/geography/geoutm.html

Ví dụ sử dụng: MGRSString (51,172, -1,779) trả "30U WB 85.358 69.660"

function MGRSString (Lat, Long) 
{ 
if (Lat < -80) return 'Too far South' ; if (Lat > 84) return 'Too far North' ; 
var c = 1 + Math.floor ((Long+180)/6); 
var e = c*6 - 183 ; 
var k = Lat*Math.PI/180; 
var l = Long*Math.PI/180; 
var m = e*Math.PI/180; 
var n = Math.cos (k); 
var o = 0.006739496819936062*Math.pow (n,2); 
var p = 40680631590769/(6356752.314*Math.sqrt(1 + o)); 
var q = Math.tan (k); 
var r = q*q; 
var s = (r*r*r) - Math.pow (q,6); 
var t = l - m; 
var u = 1.0 - r + o; 
var v = 5.0 - r + 9*o + 4.0*(o*o); 
var w = 5.0 - 18.0*r + (r*r) + 14.0*o - 58.0*r*o; 
var x = 61.0 - 58.0*r + (r*r) + 270.0*o - 330.0*r*o; 
var y = 61.0 - 479.0*r + 179.0*(r*r) - (r*r*r); 
var z = 1385.0 - 3111.0*r + 543.0*(r*r) - (r*r*r); 
var aa = p*n*t + (p/6.0*Math.pow (n,3)*u*Math.pow (t,3)) + (p/120.0*Math.pow (n,5)*w*Math.pow (t,5)) + (p/5040.0*Math.pow (n,7)*y*Math.pow (t,7)); 
var ab = 6367449.14570093*(k - (0.00251882794504*Math.sin (2*k)) + (0.00000264354112*Math.sin (4*k)) - (0.00000000345262*Math.sin (6*k)) + (0.000000000004892*Math.sin (8*k))) + (q/2.0*p*Math.pow (n,2)*Math.pow (t,2)) + (q/24.0*p*Math.pow (n,4)*v*Math.pow (t,4)) + (q/720.0*p*Math.pow (n,6)*x*Math.pow (t,6)) + (q/40320.0*p*Math.pow (n,8)*z*Math.pow (t,8)); 
aa = aa*0.9996 + 500000.0; 
ab = ab*0.9996; if (ab < 0.0) ab += 10000000.0; 
var ad = 'CDEFGHJKLMNPQRSTUVWXX'.charAt (Math.floor (Lat/8 + 10)); 
var ae = Math.floor (aa/100000); 
var af = ['ABCDEFGH','JKLMNPQR','STUVWXYZ'][(c-1)%3].charAt (ae-1); 
var ag = Math.floor (ab/100000)%20; 
var ah = ['ABCDEFGHJKLMNPQRSTUV','FGHJKLMNPQRSTUVABCDE'][(c-1)%2].charAt (ag); 
function pad (val) {if (val < 10) {val = '0000' + val} else if (val < 100) {val = '000' + val} else if (val < 1000) {val = '00' + val} else if (val < 10000) {val = '0' + val};return val}; 
aa = Math.floor (aa%100000); aa = pad (aa); 
ab = Math.floor (ab%100000); ab = pad (ab); 
return c + ad + ' ' + af + ah + ' ' + aa + ' ' + ab; 
}; 

Để chuyển đổi trở lại từ MGRS để lat sử dụng lâu dài chức năng sau. Chuỗi đầu vào phải có độ phân giải mét (tức là 5 chữ số) và độ phân giải về phía bắc và có khoảng trắng là đầu ra theo hàm trên.

function LatLongFromMGRSstring (a) 
{ 
var b = a.trim(); 
b = b.match(/\S+/g); 
if (b == null || b.length != 4) return [false,null,null]; 
var c = (b[0].length < 3) ? b[0][0] : b[0].slice(0,2); 
var d = (b[0].length < 3) ? b[0][1] : b[0][2]; 
var e = (c*6-183)*Math.PI/180; 
var f = ["ABCDEFGH","JKLMNPQR","STUVWXYZ"][(c-1) % 3].indexOf(b[1][0]) + 1; 
var g = "CDEFGHJKLMNPQRSTUVWXX".indexOf(d); 
var h = ["ABCDEFGHJKLMNPQRSTUV","FGHJKLMNPQRSTUVABCDE"][(c-1) % 2].indexOf(b[1][1]); 
var i = [1.1,2.0,2.8,3.7,4.6,5.5,6.4,7.3,8.2,9.1,0,0.8,1.7,2.6,3.5,4.4,5.3,6.2,7.0,7.9]; 
var j = [0,2,2,2,4,4,6,6,8,8,0,0,0,2,2,4,4,6,6,6]; 
var k = i[g]; 
var l = Number(j[g]) + h/10; 
if (l < k) l += 2; 
var m = f*100000.0 + Number(b[2]); 
var n = l*1000000 + Number(b[3]); 
m -= 500000.0; 
if (d < 'N') n -= 10000000.0; 
m /= 0.9996; n /= 0.9996; 
var o = n/6367449.14570093; 
var p = o + (0.0025188266133249035*Math.sin(2.0*o)) + (0.0000037009491206268*Math.sin(4.0*o)) + (0.0000000074477705265*Math.sin(6.0*o)) + (0.0000000000170359940*Math.sin(8.0*o)); 
var q = Math.tan(p); 
var r = q*q; 
var s = r*r; 
var t = Math.cos(p); 
var u = 0.006739496819936062*Math.pow(t,2); 
var v = 40680631590769/(6356752.314*Math.sqrt(1 + u)); 
var w = v; 
var x = 1.0/(w*t); w *= v; 
var y = q/(2.0*w); w *= v; 
var z = 1.0/(6.0*w*t); w *= v; 
var aa = q/(24.0*w); w *= v; 
var ab = 1.0/(120.0*w*t); w *= v; 
var ac = q/(720.0*w); w *= v; 
var ad = 1.0/(5040.0*w*t); w *= v; 
var ae = q/(40320.0*w); 
var af = -1.0-u; 
var ag = -1.0-2*r-u; 
var ah = 5.0 + 3.0*r + 6.0*u-6.0*r*u-3.0*(u*u)-9.0*r*(u*u); 
var ai = 5.0 + 28.0*r + 24.0*s + 6.0*u + 8.0*r*u; 
var aj = -61.0-90.0*r-45.0*s-107.0*u + 162.0*r*u; 
var ak = -61.0-662.0*r-1320.0*s-720.0*(s*r); 
var al = 1385.0 + 3633.0*r + 4095.0*s + 1575*(s*r); 
var lat = p + y*af*(m*m) + aa*ah*Math.pow(m,4) + ac*aj*Math.pow(m,6) + ae*al*Math.pow(m,8); 
var lng = e + x*m + z*ag*Math.pow(m,3) + ab*ai*Math.pow(m,5) + ad*ak*Math.pow(m,7); 
lat = lat*180/Math.PI; 
lng = lng*180/Math.PI; 
return [true,lat,lng]; 
} 
Các vấn đề liên quan