Convierte coordenada lat / lon a píxel?

Estoy tratando de convertir un par lat / lon a una coordenada de píxel. Encontré esta proyección Mercator pero no entiendo el código. ¿Cuál es el factor, x_adj, y_adj variable? Cuando ejecuto el código sin esas constantes, mi par latitud / longitud no está en mi mapa y las coordenadas x e y no son lo que quiero.

function get_xy(lat, lng) { var mapWidth=2058; var mapHeight=1746; var factor=.404; var x_adj=-391; var y_adj=37; var x = (mapWidth*(180+lng)/360)%mapWidth+(mapWidth/2); var latRad = lat*Math.PI/180; var mercN = Math.log(Math.tan((Math.PI/4)+(latRad/2))); var y = (mapHeight/2)-(mapWidth*mercN/(2*Math.PI)); return { x: x*factor+x_adj,y: y*factor+y_adj} } 

Fuente: http://webdesignerwall.com/tutorials/interactive-world-javascript-map/comment-page-1?replytocom=103225

[2] Latitud y longitud encubiertas apuntan a píxeles (x, y) en la proyección de Mercator

¿De dónde provienen esas variables?

Estas variables se eligen para hacer coincidir las coordenadas calculadas con la imagen de fondo del mapa. Si los parámetros de proyección del mapa fueran conocidos, podrían ser calculados. Pero creo que es mucho más probable que se obtuvieran por ensayo y error.

Cómo calcular una proyección de Mercator

Si desea un método más general para describir la sección del mundo que muestra un mapa Mercator dado (no transversal), puede usar este código:

 // This map would show Germany: $south = deg2rad(47.2); $north = deg2rad(55.2); $west = deg2rad(5.8); $east = deg2rad(15.2); // This also controls the aspect ratio of the projection $width = 1000; $height = 1500; // Formula for mercator projection y coordinate: function mercY($lat) { return log(tan($lat/2 + M_PI/4)); } // Some constants to relate chosen area to screen coordinates $ymin = mercY($south); $ymax = mercY($north); $xFactor = $width/($east - $west); $yFactor = $height/($ymax - $ymin); function mapProject($lat, $lon) { // both in radians, use deg2rad if neccessary global $xFactor, $yFactor, $west, $ymax; $x = $lon; $y = mercY($lat); $x = ($x - $west)*$xFactor; $y = ($ymax - $y)*$yFactor; // y points south return array($x, $y); } 

Hay una versión demo de este código disponible en http://ideone.com/05OhG6 .

En cuanto a la relación de aspecto

Una configuración con $xFactor != $yFactor produce un tipo de proyección de Mercator alargada. Esto ya no es conforme (mantiene el ángulo). Si uno quiere una verdadera proyección de Mercator, puede omitir cualquiera de las primeras seis asignaciones de variables, es decir, las que definen el recuadro delimitador o las que describen el tamaño del mapa resultante, y luego usar algún cálculo también, elija que satisfaga $xFactor == $yFactor . Pero dado que la opción de omitir es algo arbitraria, creo que el código anterior es la forma más simétrica de describir las cosas.

A continuación, le mostramos cómo obtener las variables X e Y devueltas de la función que ha encontrado …

 var xy=get_xy(56,34); var X=xy.x; var Y=xy.y; 

Ahora X e Y contienen las coordenadas.