Конвертировать WGS84 в OSGB36 - PullRequest
       27

Конвертировать WGS84 в OSGB36

0 голосов
/ 18 декабря 2011

Существует ли какая-либо известная библиотека java, которая позволяет конвертировать шнуры WGS 84 в OSGB36 или есть хорошая формула, которую я могу использовать?В настоящее время я использую этот, но он не очень точный, поэтому мне интересно, есть ли лучший, который я могу использовать.

private static double[] Wgs84ToBNG(double inLat, double inLon) {

    double lat = inLat * Math.PI / 180.0;
    double lon = inLon * Math.PI / 180.0;
    double a = 6377563.396; // Airy 1830 major & minor semi-axes
    double b = 6356256.910;
    double F0 = 0.9996012717; // NatGrid scale factor on central meridian
    double lat0 = 49 * Math.PI / 180.0; // NatGrid true origin
    double lon0 = -2 * Math.PI / 180.0;
    double N0 = -100000; // northing & easting of true origin, metres
    double E0 = 400000;
    double e2 = 1 - (b * b) / (a * a); // eccentricity squared
    double n = (a - b) / (a + b), n2 = n * n, n3 = n * n * n;
    double cosLat = Math.cos(lat), sinLat = Math.sin(lat);
    double nu = a * F0 / Math.sqrt(1 - e2 * sinLat * sinLat); // transverse
                                                                // radius of
                                                                // curvature
    double rho = a * F0 * (1 - e2)
            / Math.pow(1 - e2 * sinLat * sinLat, 1.5); // meridional radius
                                                        // of curvature
    double eta2 = nu / rho - 1;
    double Ma = (1 + n + (5 / 4) * n2 + (5 / 4) * n3) * (lat - lat0);
    double Mb = (3 * n + 3 * n * n + (21 / 8) * n3) * Math.sin(lat - lat0)
            * Math.cos(lat + lat0);
    double Mc = ((15 / 8) * n2 + (15 / 8) * n3)
            * Math.sin(2 * (lat - lat0)) * Math.cos(2 * (lat + lat0));
    double Md = (35 / 24) * n3 * Math.sin(3 * (lat - lat0))
            * Math.cos(3 * (lat + lat0));
    double M = b * F0 * (Ma - Mb + Mc - Md); // meridional arc
    double cos3lat = cosLat * cosLat * cosLat;
    double cos5lat = cos3lat * cosLat * cosLat;
    double tan2lat = Math.tan(lat) * Math.tan(lat);
    double tan4lat = tan2lat * tan2lat;
    double I = M + N0;
    double II = (nu / 2) * sinLat * cosLat;
    double III = (nu / 24) * sinLat * cos3lat * (5 - tan2lat + 9 * eta2);
    double IIIA = (nu / 720) * sinLat * cos5lat
            * (61 - 58 * tan2lat + tan4lat);
    double IV = nu * cosLat;
    double V = (nu / 6) * cos3lat * (nu / rho - tan2lat);
    double VI = (nu / 120)
            * cos5lat
            * (5 - 18 * tan2lat + tan4lat + 14 * eta2 - 58 * tan2lat * eta2);
    double dLon = lon - lon0;
    double dLon2 = dLon * dLon;
    double dLon3 = dLon2 * dLon;
    double dLon4 = dLon3 * dLon;
    double dLon5 = dLon4 * dLon;
    double dLon6 = dLon5 * dLon;
    double N = I + II * dLon2 + III * dLon4 + IIIA * dLon6;
    double E = E0 + IV * dLon + V * dLon3 + VI * dLon5;
    double[] returnValue = { E, N };
    return returnValue;
} 

Ответы [ 4 ]

2 голосов
/ 18 декабря 2011

Посмотрите на эту страницу

В разделе «Программы / Исходный код» вы найдете подраздел «WGS84 Lat / Long <=> OSGB36 Grid References». В этом подразделе есть несколько ссылок на утилиты, предоставляющие эту функциональность.

В этом другом посте вы можете найти исходный код такой задачи с пояснениями.

1 голос
/ 18 декабря 2011

Я немного поработал над этим и использовал документ Руководство по системам координат в Великобритании В нем рассказывается все, что вам нужно знать, если вы внимательно его прочитаете.Судя по именам переменных, используемых в вашей формуле, вы, возможно, хорошо изучили тот же документ.Я думаю, что самый важный абзац во всем документе, касающийся преобразования между системами координат, заключается в следующем (из нижней части страницы 30)

Подводя итог: Для простого изменения исходных координат координат широты и долготы от исходных данныхОт A к базовому значению B, сначала преобразуется в декартовы координаты (формулы в приложении B), принимая все высоты эллипсоида за ноль и используя параметры эллипсоида базовых данных A;, затем применить преобразование Гельмерта от точки A к точке B, используя уравнение (3); наконец преобразование обратно в широту и долготу с использованием параметров эллипсоида базовых данных B (формулы в приложении C) без учета высоты эллипсоидов базовых данных B.

В нем описываются 3 шага, которые у вас естьпринять.Приведенная вами формула преобразует широту / долготу в восток / север в том же диапазоне .Это не преобразование

Из названия вашего метода вы передаете WGS84 широта / долгота, поэтому вы должны:

1) Поместить все мысли о системе координат сетки (и связанных истинных источниках)и т.д.) до тех пор, пока вы не конвертируете широту / долготу из одного значения в другое

2) Преобразуйте этот широту / долг WGS84 в трехмерные декарты (это x, y и z) для WGS84с использованием формул от B1 до B5 в Руководстве по ОС.Убедитесь, что вы используете параметры (большие / второстепенные оси) для базовых данных WGS84

3) Используя приведенное выше преобразование Гельмерта, преобразуйте только что вычисленные декарты в декартовы относительно эллипсоида Эйри 1830.Вы найдете 7 параметров, которые вам нужны для получения новых декартов, в разделе 6.6

Новые координаты xGB, yGB, zGB:

double xGB = tx + (x * (1 + s)) + (-rz * y) + (ry * z);
double yGB = ty + (rz * x) + (y * (1 + s)) + (-rx * z);
double zGB = tz + (-ry * x) + (rx * y) + (z * (1 + s));

На самом деле это не прописано., они просто предполагают, что вы помните математику своей матрицы

4) Теперь преобразуйте эти новые декартовы (которые относятся к данным OSGB36) в широту / долготу относительно этих данных OSGB36, используя формулы B6 - B8

Отсюда вы можете приступить к расчету восточных и северных координат сетки, используя ту формулу, которую вы указали

1 голос
/ 18 декабря 2011

Если вы не уверены в правильности других библиотек, я бы сравнил результаты с PROJ.4. Если вы не хотите использовать нативную библиотеку, существует также чистый порт Java для PROJ.4.

Использование PROJ.4 для WGS84 Lat / Long <=> OSGB36 обсуждалось здесь:
Библиотека PROJ.4 и OSGB36

Использование cs2cs:
http://trac.osgeo.org/proj/wiki/man_cs2cs
Строка OSGB36:
http://spatialreference.org/ref/epsg/27700/proj4/
Строка WGS84:
http://spatialreference.org/ref/epsg/4326/proj4/

Порт Java:
http://sourceforge.net/projects/jmapprojlib/

0 голосов
/ 23 января 2013

Я использовал jcoord .Очень полезный и простой в реализации.

...