Получить положение на карте, когда WGS-84 широта / долгота, когда заданы широта / долгота верхнего левого и нижнего правого углов - PullRequest
0 голосов
/ 12 сентября 2009

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

1 Ответ

4 голосов
/ 13 сентября 2009

Если карта примерно на уровне улицы / города, использует проекцию меркатора (как, кажется, 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 
...