Я бы сделал это, предполагая приближение плоской земли, и использовал бы векторную алгебру, чтобы связать углы и расстояния в широтном и пространственном положениях с пространством пикселей x, y.
Например:
Я предполагаю, что вы знаете лат, лон для нижнего левого и нижнего правого углов. Также предположим, что ваша справедливая карта не находится рядом с полюсами и имеет небольшую площадь.
Выберите систему координат, скажем, в левом нижнем углу с известной широтой и долготой 0,0 пикселей Вызывается lat1, lon2 в следующем псевдокоде
Вычислить вектор 1 от нижнего правого лат2, lon2 до нижнего левого лат1, lon1
Используя простую проекцию xl = lon, yl = lat, затем vector 1 = (lon2 - lon1) i + (lat2-lat1) j
Вычислите вектор 2 из широты и долготы человека, которого вы хотите (latp, lonp) поместить на карту в нижнюю левую точку lat1, lon1
Используйте векторное произведение точек, чтобы получить угол между вектором 1 и 2.
Вычислить расстояние в широте и долготе с помощью равносторонней проекции:
p1 = (lonp - lon1) cos ( 0.5*(latp+lat1) ) (convert lat/lon to radians)
p2 = (latp - lat1)
distance = R * sqrt( p1*p1 + p2*p2)
use R = 6371000 and your distance will be in meters
Теперь масштабируйте это расстояние до масштаба вашей карты
На данный момент у вас есть полярные координаты точки в пиксельном пространстве
теперь вы делаете полярное преобразование в прямоугольное; x = r cos (угол), y = r sin (угол)
r - это масштабированное расстояние (то есть расстояние в пиксельном пространстве), а угол - это угол между векторами 1 и 2 выше
В качестве проверки работоспособности вы могли бы вычислить угол наклона латинских векторов, созданных слева направо сверху вниз, с точками справа внизу слева внизу. Если угол не близок к 90 градусам, для ваших целей может быть слишком много искажений.