2009-09-12 6 views
0

Предположим, у меня есть карта, например, с openstreetmaps.org. Я знаю WGS-84 lat/lon в верхнем левом и нижнем правом углу карты. Как найти другие позиции на карте из заданных координат WG/WGS-84?Получите положение карты, когда WGS-84 lat/lon, если указаны левый и правый верхние левые углы/лун

ответ

4

Если карта примерно соответствует уровню улицы/города, то используется mercator projection (как кажется openstreetmap.org) и не слишком близко к полюсам, линейная интерполяция может быть достаточно точной. Предполагая следующее:

  • TL = широта/долгота левого верхнего угла
  • BR = широта/долгота в правом нижнем углу
  • P = широта/долгота точки вы хотите найти на карте
  • (W, H) = ширина и высота карты у вас есть (пикселей?)
  • происхождение изображения карты, (0,0), находится на верхнем левом углу

, мы могли бы интерполировать (x, y) positi на соответствующих Р, как:

x = w * (P.lon - TL.lon)/(BR.lon - TL.lon) 
y = h * (P.lat - TL.lat)/(BR.lat - TL.lat) 

Common Гоча:

  • Широта/долгота обозначения конвенции перечисляет широту первой и второй долготы, то есть «вертикальный» перед «горизонтальный». Это противоположно общему значению координат изображения.

  • Значения широты возрастают при движении в северном направлении (вверх), тогда как координаты y на вашем изображении карты могут увеличиваться при уменьшении.

  • Если карта покрывает большую площадь, линейная интерполяция не будет такой точной для широт. Для карты, которая охватывает одну градус широты и находится в зонах обитания Земли (например, в районе залива), центральная широта будет отключена на 0,2% или около того, что, вероятно, будет меньше пикселя (в зависимости от размера)

Если это достаточно точно для ваших нужд, вы можете остановиться здесь!

Более точная математика для получения от широты P до положения пикселя y начнется с математики меркатора. Мы знаем, что для широты P.lat Y-позиция на проекции, начинающейся на экваторе, будет следующей: я буду использовать капитал Y, в отличие от значения y, которое мы ищем, Y начинается на экваторе и увеличивается к северу):

Y = k * ln((1 + sin(P.lat))/(1 - sin(P.lat))) 

константа к зависит от вертикального масштабирования карты, которую мы не знаем. К счастью, можно сделать вывод, что y (TL) - y (BR) = h. Это заставляет нас:

k = h/(ln((1 + sin(TL.lat))/(1 - sin(TL.lat))) - ln((1 + sin(BR.lat))/(1 - sin(BR.lat)))) 

(! Хлоп это четыре уровня скобок) С K известно, мы теперь имеем формулу, чтобы выяснить позицию Y любой широты. Нам просто нужно исправить: (1) наше значение y начинается с TL.lat, а не с экватором, и (2) y растет к югу, а не к северу.Это заставляет нас:

Y(TL.lat) = k * ln((1 + sin(TL.lat))/(1 - sin(TL.lat))) 
Y(P.lat) = k * ln((1 + sin(P.lat))/(1 - sin(P.lat))) 
y(P.lat) = -(Y(P.lat) - Y(TL.lat)) 

Так что это получает Вас:

x = w * (P.lon - TL.lon)/(BR.lon - TL.lon) // like before 
y = -(Y(P.lat) - Y(TL.lat))     // where Y(anything) depends just on h, TL.lat and BR.lat 
+0

(1) Что вы имеете в виду ЛУ? это логарифм? (2) и какова окончательная формула? не может следовать потоку. – eros

+0

ln означает Math.log (double)? – eros

+0

Каково значение первого знака минус (-) в «y = - (Y (P.lat) - Y (TL.lat))»? – eros

 Смежные вопросы

  • Нет связанных вопросов^_^