Получить положение карты, когда широта / долгота WGS-84, когда заданы широта / долгота верхнего левого и нижнего правого углов

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


person Community    schedule 12.09.2009    source источник


Ответы (1)


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

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

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

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

Общие ошибки:

  • В условных обозначениях широты и долготы сначала указывается широта, а затем - долгота, то есть «по вертикали» перед «по горизонтали». Это противоположно обычному обозначению координат изображения x, y.

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

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

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

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

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

Константа k зависит от вертикального масштабирования карты, о котором мы можем не знать. К счастью, это можно вывести, наблюдая, что 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 
person Oren Trutner    schedule 12.09.2009
comment
(1) что вы имеете в виду под ln? это логарифм? (2) и какова окончательная формула? не могу следовать за потоком. - person eros; 27.09.2011
comment
что означает первый знак минус (-) в y = - (Y (P.lat) - Y (TL.lat))? - person eros; 27.09.2011
comment
Относительно ln: да, это натуральный логарифм. В JavaScript это действительно Math.log (). - person Oren Trutner; 28.09.2011
comment
Что касается окончательной формулы: это последний блок кода, где x = ... и y = ... - person Oren Trutner; 28.09.2011
comment
А что касается знака минус: Y растет с юга на север. P.lat по определению южнее TL.lat. Я выбрал TL как сокращение от Top-Left, но с таким же успехом я мог бы назвать его NW для северо-западного угла вашего обзора на карте. Поскольку P находится к югу от TL и поскольку Y сохраняет знак, Y (P.Lat) -Y (TL.lat) является отрицательной величиной. Дополнительный знак минус превращает его в положительный знак и позволяет использовать его во многих распространенных системах координат, где значение y начинается с 0 вверху и увеличивается при спуске. - person Oren Trutner; 28.09.2011