@Jhonnyman

Как соотнести реальные координаты с координатами карты?

Есть ряд точек с реальными координатами, которые нужно отобразить на карте, и наоборот, получить реальные координаты по точкам на карте.
Я использую d3js, и тут есть функция scaleLinear, которая ожидает два диапазона, после чего я могу ввести любое число из первого диапазона, и получить соответствующее число из второго.
И вроде как все просто, но с учетом инверсии оси игрек (чтоб как на реальных картах), и прямоугольности карты - точки рисуются неправильно, не в масштабе и вытянуты.
Может есть какая-то формула или общий алгоритм действий?

Вот как делаю сейчас
map: {
    width: 1000,
    height: 500,
},
real: {
    minX: 50000,
    maxX: 100000,
    minY: 50000,
    maxY: 100000,
},
// ...

var mapCoef = this.map.height / this.map.width;
this.mapX = d3.scaleLinear().domain([this.real.minX, this.real.maxX]).range([0, this.map.width]);
this.mapY = d3.scaleLinear().domain([this.real.minX * mapCoef, this.real.maxX * mapCoef]).range([this.map.height, 0]);

// this.mapX, this.mapY - функции получения карточных координат по реальным координатам
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 2
hint000
@hint000
у админа три руки
Если сложности с готовой функцией, то и ну её нафиг, быстрее руками сделать, чем мучиться, формулы-то простейшие:
// map.minX=0;
// map.maxX=map.width;
// map.minY=0;
// map.maxY=map.height;
// realX=...
// realY=...
// mapX=...
// mapY=...
realX=real.minX+(real.maxX-real.minX)*(mapX-map.minX)/(map.maxX-map.minX);
mapX=map.minX+(map.maxX-map.minX)*(realX-real.minX)/(real.maxX-real.minX);
realY=real.minY+(real.maxY-real.minY)*(map.maxY-mapY)/(map.maxY-map.minY);
mapY=map.minY+(map.maxY-map.minY)*(real.maxY-realY)/(real.maxY-real.minY);

Не вникаю в конкретный ЯП, так что убедитесь, что операции вещественные, а не целочисленные.
Ответ написан
Комментировать
@alekseiami
Координаты точки на местности — это широта и долгота. Угловые величины. Пусть будут phi и lambda.
Координаты точки на карте — это линейные величины. Условно говоря, x и y.
x = f1(phi, lambda)
y = f2(phi, lambda).

Наборов функций может быть много...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы