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