проекция Ламберта 2008 - PullRequest
1 голос
/ 27 июля 2011

Мне нужно написать функцию, которая может проецировать некоторое местоположение, определенное широтой / долготой, в координаты x, y на карте (изображение).

Кажется, что в самой карте в качестве типа проекции используется "бельгийский Ламберт".

Я нашел некоторую официальную информацию об этой проекции и ее конфигурации: http://ign.be/FR/FR2-1-4.shtm и http://ign.be/Common/Lambert2008/Transformation_Geographic_Lambert_FR.pdf (на французском я переведу, если необходимо).

По сути, я пришел к выводу, что было бы легче использовать какую-то библиотеку (хотя здесь это не является обязательным требованием). После некоторых исследований кажется, что OpenMap должен быть в состоянии выполнить эту работу.

Итак, вот что я получил:

private Point mapCoordinatesToPoint(LatLonPoint latLonPoint) {
    LatLonPoint centerLatLonPoint = new LatLonPoint(50.797815, 4.3592158333333333333333333333333);
    Proj proj = new LambertConformal(centerLatLonPoint, 1, 1000, 1000, 4.3592158333333333333333333333333, 49.833333333333333333333333333333, 51.166666666666666666666666666667, 50.797815, 649328.0, 665262.0, Ellipsoid.GRS_1980);
    return proj.forward(latLonPoint);
}

(зная, что мой gif - 1000x1000)

JavaDoc для конструктора LamberConformal: http://openmap.bbn.com/doc/api/com/bbn/openmap/proj/LambertConformal.html#LambertConformal%28com.bbn.openmap.LatLonPoint,%20float,%20int,%20int,%20double,%20double,%20double,%20double,%20double,%20double,%20com.bbn.openmap.proj.Ellipsoid%29

Полагаю, я неправильно настроил: некоторая точка, которая должна быть на карте, ххх, дает такой результат:

x=-1766051.0; y=-1.6355546E7;

Задание "центральной точки" (?) В качестве параметра дает

x=500.0; y=500.0;

(середина карты, которая выглядит нормально)

Кто-нибудь знаком с этим или способен определить конфигурацию по ссылкам?

EDIT:

попытался заменить последнюю строку метода следующим образом:

    return proj.forward(latLonPoint.getLatitude(), latLonPoint.getLongitude(), new Point(), false);

но не лучше.

1 Ответ

0 голосов
/ 31 июля 2011

Для тех, кто заинтересован, вот как я это сделал.

Это для карты Бельгии (похоже, использует Ламберт 72 или 2008).

    Proj proj = new LambertConformal(centerLatLonPoint, scale, 1776, 1468,
            4.3592158333333333333333333333333, //centralMeridian
            49.833333333333333333333333333333, //lambert_sp_one
            51.166666666666666666666666666667, //lambert_sp_two
            50.797815, //referenceLatitude
            649328.0, //falseEasting
            665262.0, //falseNorthing
            Ellipsoid.GRS_1980);

Шкалу можно рассчитать следующим образом:

    LatLonPoint dePanneLatLonPoint = new LatLonPoint(51.0975f, 2.5855f);
    Point dePannePoint = new Point(27, 313);

    LatLonPoint mussonLatLonPoint = new LatLonPoint(49.5567f, 5.7106f);
    Point mussonPoint = new Point(1464, 1426);

    float scale = proj.getScale(dePanneLatLonPoint, mussonLatLonPoint, dePannePoint, mussonPoint);

Две точки - это произвольные точки (как nw и se, насколько это возможно), для которых вы знаете как географические координаты, так и то, где это проецируется на карту.

Мне также пришлось найти географические координаты центра карты.

Местоположение точки на карте можно найти следующим образом:

     Point point = proj.forward(latitude, longitude, new Point(), false);
...