Допустим, у меня есть карта, например, с сайта openstreetmaps.org. Я знаю широту / долготу WGS-84 в верхнем левом и нижнем правом углу карты. Как я могу найти другие позиции на карте по заданным координатам широты и долготы WGS-84?
Получить положение карты, когда широта / долгота WGS-84, когда заданы широта / долгота верхнего левого и нижнего правого углов
Ответы (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