2009-06-19 20 views
16

Tengo el valor Lat/Long de Nueva York, NY; 40.7560540, -73.9869510 y una imagen plana de la tierra, 1000px × 446px.Convertir Lat/Longs en X/Y Coordenadas

Me gustaría poder convertir, usando Javascript, la latitud/longitud en 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

A tener en cuenta:

  1. no se preocupe por cuestiones de lo que la proyección de usar, hacer su propio asunción o ir con lo que sabe podría funcionar
  2. X, Y puede puede formar cualquier esquina de la imagen
  3. los puntos de bonificación para la misma solución en PHP (pero realmente necesita el JS)
+0

"No se preocupe por ... qué proyección usar" ¿cómo sabemos qué es lo que se correlaciona con XY? ¿estarán? Podría haber dicho que X es Lat, Y es Long y que probablemente te habría satisfecho, ya que aparentemente el resultado no tiene por qué significar nada ni relacionarse con una proyección del mundo real. – 1owk3y

Respuesta

8

una función de conversión básico 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 de la parte superior izquierda. Esta función supone lo siguiente:

  1. que su imagen está correctamente alineado con la esquina superior izquierda (0,0) alinearse con 90 * 180 * Norte por Oeste.
  2. que sus coordenadas son firmados con el ser N -, siendo S +, siendo W - y E bienestar +
+1

Gracias, ¿cómo revertir esto? ¿De X e Y a lat/long con coordenadas de cuadro delimitador especificadas? – user3408380

0

Si tiene una imagen de toda la tierra, la proyección siempre importa. Pero tal vez simplemente no entiendo tu pregunta.

+0

Tiene razón, pero en este caso utilizaría gustosamente una imagen adecuada para que coincida con una solución funcional para una proyección específica. – donohoe

18

La proyección se utiliza va a cambiar todo, pero esto va a funcionar asumiendo 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> 
+0

Esto también funcionó para mí y es una excelente respuesta. He cambiado 'lng' a 'parseInt (lng, 10)' en esta línea: x = (map_width * (180 + lng)/360 + longitude_shift)% map_width; Funcionaría cuando llamo manualmente a la función, pongo el valor de paso de una matriz devuelta NaN para x ¡Gracias! – donohoe

+0

creo x = (map_width * (180 + lng)/360 + longitude_shift)% map_width; debe ser x = ((map_width * (180 + lng)/360)% map_width) + longitude_shift; de lo contrario, Japón y la costa este de australia (yo incluido) se "envuelven" en el medio del océano Pacífico. : P –

+0

¡Impresionante, funciona genial! ¿Lo único que no encontré fue lo que hicieron los y_pos? Esto en PHP es: PanMan

5

Hay una buena biblioteca de Javascript, PROJ4JS, que le permite realizar transformaciones entre diferentes proyecciones.

+0

Definitivamente la mejor solución para la cuestión más amplia de la re-proyección (por ejemplo, la pregunta de Dinesh planteada como respuesta). – winwaed

Cuestiones relacionadas