Предположим, у меня есть карта, например, с openstreetmaps.org. Я знаю WGS-84 lat/lon в верхнем левом и нижнем правом углу карты. Как найти другие позиции на карте из заданных координат WG/WGS-84?Получите положение карты, когда WGS-84 lat/lon, если указаны левый и правый верхние левые углы/лун
Получите положение карты, когда WGS-84 lat/lon, если указаны левый и правый верхние левые углы/лун
ответ
Если карта примерно соответствует уровню улицы/города, то используется mercator projection (как кажется openstreetmap.org) и не слишком близко к полюсам, линейная интерполяция может быть достаточно точной. Предполагая следующее:
- TL = широта/долгота левого верхнего угла
- BR = широта/долгота в правом нижнем углу
- P = широта/долгота точки вы хотите найти на карте
- (W, H) = ширина и высота карты у вас есть (пикселей?)
- происхождение изображения карты, (0,0), находится на верхнем левом углу
, мы могли бы интерполировать (x, y) positi на соответствующих Р, как:
x = w * (P.lon - TL.lon)/(BR.lon - TL.lon)
y = h * (P.lat - TL.lat)/(BR.lat - TL.lat)
Common Гоча:
Широта/долгота обозначения конвенции перечисляет широту первой и второй долготы, то есть «вертикальный» перед «горизонтальный». Это противоположно общему значению координат изображения.
Значения широты возрастают при движении в северном направлении (вверх), тогда как координаты 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))))
(! Хлоп это четыре уровня скобок) С 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
(1) Что вы имеете в виду ЛУ? это логарифм? (2) и какова окончательная формула? не может следовать потоку. – eros
ln означает Math.log (double)? – eros
Каково значение первого знака минус (-) в «y = - (Y (P.lat) - Y (TL.lat))»? – eros