Преобразование широты / долготы в координаты x / y изображения (цилиндрическая проекция Миллера) - PullRequest
3 голосов
/ 17 февраля 2012

Как уже говорилось в заголовке, мне нужна помощь с преобразованием координат широта / долгота в координаты х / у в цилиндрической проекции Миллера. Сейчас я пишу приложение (на Java), которое получает список городов в качестве входных данных, а затем получает широту / долготу для каждого города из Yahoo Placefinder. Я использовал эти формулы в своем коде. Вот пример того, что я получаю. (изображение только для справки, а не тот, который я использую). Как вы можете видеть, позиции X расположены всего в нескольких пикселях (2-3), это может быть проблемой с моими вычислениями смещения основного меридиана (CENTRAL_MERIDIAN_OFFSET) на этой карте. Но главная проблема - неправильные координаты Y.

Вот мой код (обновлено - компенсация в 34 пикселя для смещения экватора):

public final double W = 6343;
public final double H = 4767 - 34;

protected Point toMillerXY(double lon, double lat)
{
    double x, y;

    lon = Utils.degToRad(lon);
    lat = Utils.degToRad(lat);

    x = lon - CENTRAL_MERIDIAN_OFFSET;
    y = 1.25 * Math.log( Math.tan( 0.25 * Math.PI + 0.4 * lat ) );

    x = ( W / 2 ) + ( W / (2 * Math.PI) ) * x;
    y = ( H / 2 ) - ( H / ( 2 * 2.303412543 ) ) * y;

    y += 34;

    return new Point(x, y);
}

Output:  
Fetching data with: http://where.yahooapis.com/geocode?location=Buenos+Aires,Argentina
Latitude: -34.608521, longitude: -58.373539
---
Fetching data with: http://where.yahooapis.com/geocode?location=Tokyo,Japan
Latitude: 35.670479, longitude: 139.740921
---
Fetching data with: http://where.yahooapis.com/geocode?location=Cape+Town,CAR
Latitude: -33.919060, longitude: 18.421961
---
Fetching data with: http://where.yahooapis.com/geocode?location=Rome,Italy
Latitude: 41.903110, longitude: 12.495760
---
Total cities: 4
Result for Buenos Aires: 1964.598428, 3046.740995
Result for Tokyo: 5455.265150, 1732.669551
Result for Cape Town: 3317.692474, 3032.814395
Result for Rome: 3213.276105, 1602.176163

Очевидно, что что-то не так с вычислением Y-координат. Я не уверен, должно ли 5,6 действительно быть правильным значением, но вертикальный диапазон проекции Миллера, как говорили, составлял -2,3 .. + 2,3 в одной из ссылок, которые я прочитал, поэтому я использовал ее.

1 Ответ

2 голосов
/ 17 февраля 2012

Millers projection was said to be -2.3..+2.3 это приближение.В зависимости от размера изображения вам может потребоваться более точное значение, например 2.303412543

. Для широты Москвы 55,7522222 это даст y = 1.089472895 и, исходя из высоты изображения, которое я использовал, y' = 1499/2 - (1499/ (2 * 2.303412543)) * 1.089472895 = 395 пикселей сверху, что правильно (мне было плевать на x).

Проверьте, я поставил красную точку на карте.http://img7.imageshack.us/img7/9892/mapue.jpg

Так что, вероятно, ваше изображение не имеет экватора в середине.Это можно исправить математически, добавив сдвиг в формулу, но вы должны найти положение экватора.

...