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