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

StackOverflow https://stackoverflow.com/questions/1415375

  •  06-07-2019
  •  | 
  •  

Вопрос

Предположим, у меня есть карта, например с сайта 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 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top