У меня есть значение Lat / Long в Нью-Йорке, Нью-Йорк; 40.7560540, -73.9869510 и плоское изображение земли, 1000px × 446px.
Я хотел бы иметь возможность конвертировать, используя Javascript, Lat / Long в координату X, Y, где точка будет отражать местоположение.
Таким образом, координата X, Y будет лежать в верхнем левом углу изображения; 289, 111
Что нужно отметить:
Основной функцией преобразования в 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}; }
Это вернет число пикселей в верхнем левом углу. Эта функция предполагает следующее:
Проецирование, которое вы используете, изменит все, но это будет работать в предположении проекции Меркатора:
<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://img.ruphp.com/php/mercator.png --> <img src="mercator.png" style="position:absolute;top:0px;left:0px"> </body> </html>
Существует хорошая библиотека Javascript, PROJ4JS , которая позволяет вам делать преобразования между различными проекциями.
Если у вас есть изображение всей земли, проекция всегда имеет значение. Но, может быть, я просто не понимаю ваш вопрос.
Я написал функцию, которая работает для карт Меркатора. Особенно, если ваш образ не охватывает весь мир, означает, что он также работает с обрезанными картами: https://stackoverflow.com/a/10401734/730823