Преобразование Lat/Longs в координаты X/Y

У меня есть значение Lat/Long в Нью-Йорке, Нью-Йорк; 40.7560540, -73.9869510 и плоское изображение земли, 1000px × 446px.

Я хотел бы иметь возможность конвертировать, используя Javascript, Lat/Long в координату X, Y, где точка будет отражать местоположение.

Таким образом, координата X, Y будет лежать в верхнем левом углу изображения; 289, 111

Примечания:

  • не беспокойтесь о проблемах того, какую проекцию использовать, сделайте свою предположение или идти с тем, что вы знаете может работать
  • X, Y может быть любым углом изображения
  • Бонусные баллы за то же решение в PHP (но я действительно нужен JS)

Ответ 1

Базовая функция преобразования в js будет:

MAP_WIDTH = 1000;
MAP_HEIGHT = 446;

function convert(lat, lon){
    var y = ((-1 * lat) + 90) * (MAP_HEIGHT / 180);
    var x = (lon + 180) * (MAP_WIDTH / 360);
    return {x:x,y:y};
}

Это вернет число пикселей в верхнем левом углу. Эта функция предполагает следующее:

  • То, что ваше изображение правильно выровнено с верхним левым углом (0,0) выравнивание с 90 * север на 180 * Запад.
  • Чтобы ваши координаты были подписаны с N существом -, S - +, W - и E - +

Ответ 2

Проецирование, которое вы используете, изменит все, но это будет работать в предположении проекции Меркатора:

<html>
<head>
<script language="Javascript">
var dot_size = 3;
var longitude_shift = 55;   // number of pixels your map prime meridian is off-center.
var x_pos = 54;
var y_pos = 19;
var map_width = 430;
var map_height = 332;
var half_dot = Math.floor(dot_size / 2);
function draw_point(x, y) {
    dot = '<div style="position:absolute;width:' + dot_size + 'px;height:' + dot_size + 'px;top:' + y + 'px;left:' + x + 'px;background:#00ff00"></div>';
    document.body.innerHTML += dot;
}
function plot_point(lat, lng) {
    // Mercator projection

    // longitude: just scale and shift
    x = (map_width * (180 + lng) / 360) % map_width + longitude_shift;

    // latitude: using the Mercator projection
    lat = lat * Math.PI / 180;  // convert from degrees to radians
    y = Math.log(Math.tan((lat/2) + (Math.PI/4)));  // do the Mercator projection (w/ equator of 2pi units)
    y = (map_height / 2) - (map_width * y / (2 * Math.PI)) + y_pos;   // fit it to our map

    x -= x_pos;
    y -= y_pos;

    draw_point(x - half_dot, y - half_dot);
}
</script>
</head>
<body onload="plot_point(40.756, -73.986)">
    <!-- image found at http://www.math.ubc.ca/~israel/m103/mercator.png -->
    <img src="mercator.png" style="position:absolute;top:0px;left:0px">
</body>
</html>

Ответ 3

Там есть хорошая библиотека Javascript, PROJ4JS, которая позволяет делать преобразования между различными проекциями.

Ответ 4

Если у вас есть изображение всей земли, проекция всегда имеет значение. Но, может быть, я просто не понимаю ваш вопрос.

Ответ 5

Я написал функцию, которая работает для карт Меркатора. Особенно, если ваш образ не охватывает весь мир, означает, что он также работает с обрезанными картами: fooobar.com/info/95279/...