Получить положение на карте, когда WGS-84 широта / долгота, когда заданы широта / долгота верхнего левого и нижнего правого углов
Предположим, у меня есть карта, например, с openstreetmaps.org. Я знаю WGS-84 lat/lon в верхнем левом и нижнем правом углу карты. Как я могу найти другие позиции на карте по заданным координатам WGS-84 широта / долгота?
1 ответ
Если карта примерно соответствует уровню улицы / города, использует проекцию Меркатора (как, кажется, http://www.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))))
(yikes! это четыре уровня скобок!) Теперь, когда известно 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