Библиотека Java, которая преобразует широту / долготу в координаты MGRS и наоборот? - PullRequest
6 голосов
/ 17 августа 2011

Мне интересно, какие существуют библиотеки (лицензированные или нет), где я могу найти методы для преобразования между координатами широты / долготы и координатами системы координат военной сетки (mgrs). Я не ищу явно конвертер широты и долготы в UTM, это должен быть mgrs. Я провел некоторый поиск и поиск в Google, и из того, что я обнаружил, часто появляется lat / long в UTM, но кажется, что ни у кого нет библиотеки для преобразования lat / long в MGRS и наоборот.

Кто-нибудь знает какие-нибудь библиотеки или места, где я могу найти библиотеки, которые будут делать такие вещи?

Спасибо, любая помощь приветствуется.

tf.rz

Ответы [ 5 ]

7 голосов
/ 17 июля 2012

Я знаю, что это старый пост, но я добавлю еще немного для потомков. JCoords имеет конвертацию MGRS, но требует небольшого лицензионного сбора. Другим источником является проект WorldWind НАСА (аналог Google Earth), который преобразовал старый API GeoTrans, созданный NGA. Это реализация преобразования MGRS: MGRSCoordConverter.java

3 голосов
/ 20 августа 2011

Я нашел библиотеку с именем OpenMap в библиотеке com.bbn.openmap.proj.coords, у них есть класс с именем mgrs point.Перейдем к нескольким вопросам о stackoverflow для предоставления различных ответов.Я не смог найти вопрос в этом ответе, но он получил ответ, который я искал: openmap!Тем не менее, преобразование широты и долготы в точки мгрс кажется неправильным, но обратная работа работает отлично;и это то, что мне было нужно.

2 голосов
/ 23 августа 2012

Еще один пост для потомков, так как мой поиск также нашел эту страницу.Существует класс преобразования Java-координат, который включает в себя MGRS, а также UTM и lat / lon, который описан и доступен для скачивания здесь: http://www.ibm.com/developerworks/java/library/j-coordconvert/

В примечании говорится: «Загрузка также включает методы MGRS, но преобразование из MGRS является неправильным."Возможно, это послужит отправной точкой и будет исправимо.

0 голосов
/ 12 октября 2017

Я разработал следующие (по общему признанию javascript) функции, объединяющие биты из двух основных источников плюс другие в Интернете. Я оптимизировал их для скорости, не понимая!

Моими двумя первоисточниками были: http://www.movable -type.co.uk / скрипты / LatLong-UTM-mgrs.html http://home.hiwaay.net/~taylorc/toolbox/geography/geoutm.html

Пример использования: MGRSString (51.172, -1.779) возвращает "30U WB 85358 69660"

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

Чтобы преобразовать обратно из mgrs в lat long, используйте следующую функцию. Входная строка должна иметь разрешение на ускорение и на север (то есть 5 цифр) и иметь пробелы в качестве выходных данных с помощью указанной выше функции.

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];
}
0 голосов
/ 16 марта 2017

Я поддерживаю ответ @Richard Clayton о библиотеке NASA WorldWind.Для тех, кто не хочет всей библиотеки, взгляните на минимизированную версию Berico Technologies, которая извлекла преобразование MGRS.https://github.com/Berico-Technologies/Geo-Coordinate-Conversion-Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...