Конвертировать широты / долготы в координаты X/Y
У меня есть значение широты / долготы в Нью-Йорке, штат Нью-Йорк; 40,7560540,-73,9869510 и плоское изображение Земли, 1000px × 446px.
Я хотел бы иметь возможность конвертировать, используя Javascript, координаты широты / долготы в координаты X,Y, где точка будет отражать местоположение.
Таким образом, координаты X,Y образуют верхний левый угол изображения; 289, 111
Что следует отметить:
- не беспокойтесь о том, какую проекцию использовать, сделайте собственное предположение или используйте то, что, как вы знаете, может сработать
- X,Y может быть в любом углу изображения
- Бонусные баллы за то же решение в PHP (но мне действительно нужен JS)
5 ответов
Основная функция преобразования в 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 - +
Используемая вами проекция изменит все, но это сработает, если проекция Меркатора:
<html>
<head>
<script language="Javascript">
var dot_size = 3;
var longitude_shift = 55; // number of pixels your map's 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>
Есть хорошая библиотека Javascript, PROJ4JS, которая позволяет вам выполнять преобразования между различными проекциями.
Я написал функцию, которая работает для карт Mercator. Особенно, если ваше изображение не охватывает весь мир, значит, оно также работает с обрезанными картами: /questions/13124107/raschet-dolgotyi-i-shirotyi-merkatora-do-x-i-y-na-obrezannoj-karte-velikobritanii/13124108#13124108
Если у вас есть изображение всей земли, проекция всегда имеет значение. Но, может быть, я просто не понимаю ваш вопрос.