php - longitude - Convertir Lat/Longs en coordenadas X/Y
transform latitude and longitude to utm (5)
Tengo el valor Lat / Long de New York City, NY; 40.7560540, -73.9869510 y una imagen plana de la tierra, 1000px × 446px.
Me gustaría poder convertir, usando Javascript, Lat / Long a una coordenada X, Y donde el punto reflejaría la ubicación.
Así que la coordenada X, Y de la esquina superior izquierda de la imagen sería; 289, 111
Cosas a tener en cuenta:
- No se preocupe por las cuestiones sobre qué proyección usar, haga su propia suposición o vaya con lo que sabe que podría funcionar.
- X, Y puede formar cualquier rincón de la imagen.
- Puntos de bonificación por la misma solución en PHP (pero realmente necesito el JS)
Hay una buena biblioteca de Javascript, PROJ4JS , que te permite hacer transformaciones entre diferentes proyecciones.
He escrito una función que funciona para los mapas de Mercator. Especialmente si su imagen no cubre todo el mundo, significa que también funciona con mapas recortados: https://.com/a/10401734/730823
La proyección que utilice cambiará todo, pero esto funcionará suponiendo una proyección de Mercator:
<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>
Si tienes una imagen de toda la Tierra, la proyección siempre importa. Pero tal vez simplemente no entiendo tu pregunta.
Una función de conversión básica en js sería:
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};
}
Esto devolverá el número de píxeles desde la parte superior izquierda. Esta función asume lo siguiente:
- Que su imagen esté correctamente alineada con la esquina superior izquierda (0,0) que se alinea con 90 * North por 180 * West.
- Que sus acordes están firmados con N siendo -, S siendo +, siendo W - y E siendo +