2009-06-19 12 views
16

J'ai la Lat/Long valeur de New York, NY; 40.7560540, -73.9869510 et une image plate de la terre, 1000px × 446px.Lat/X/désire ardemment Y Coordonne

Je voudrais être en mesure de convertir, en utilisant Javascript, Lat/Long à X, coordonnée Y où le point refléterait l'emplacement.

Ainsi, la coordonnées X, Y forment le coin supérieur gauche de l'image serait; 289, 111

choses à noter:

  1. ne vous inquiétez pas sur les questions de ce projection à utiliser, faire votre propre hypothèse ou rendez-vous avec ce que vous savez pourrait travailler
  2. X, Y peut être former un coin de l'image
  3. points de bonus pour la même solution en PHP (mais je vraiment besoin de la JS)
+0

"Ne vous inquiétez pas de ... quelle projection utiliser" comment savons-nous ce que la cartographie XY coordonne sera? J'aurais pu juste dire que X est Lat, Y est Long et que probablement cela vous aurait satisfait car apparemment le résultat n'a pas besoin de signifier quelque chose ou de se rapporter à une projection du monde réel. – 1owk3y

Répondre

8

Une fonction de conversion de base en js serait:

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}; 
} 

Cela retourne le nombre de pixels de haut à gauche. Cette fonction suppose les conditions suivantes:

  1. que votre image est correctement aligné avec le coin supérieur gauche (0,0) alignement avec 90 * Nord de 180 * Ouest.
  2. Que vos coords sont signés avec N -, S étant +, W étant - et E étant +
+1

Merci, comment inverser cela? Donc de X et Y à lat/long avec des coordonnées de boîte de délimitation spécifiées? – user3408380

0

Si vous avez une image de la terre entière, la projection est toujours importante. Mais peut-être que je ne comprends pas votre question.

+0

Vous avez raison, mais dans ce cas, je serais heureux d'utiliser une image appropriée pour correspondre à une solution de travail pour une projection spécifique. – donohoe

18

La projection que vous utilisez va tout changer, mais cela fonctionnera en supposant une projection 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

Cela a également travaillé pour moi et est une excellente réponse. J'ai changé 'lng' en 'parseInt (lng, 10)' sur cette ligne: x = (map_width * (180 + lng)/360 + longitude_shift)% map_width; Cela fonctionnerait quand j'appelle manuellement la fonction, mettre la valeur passant d'un tableau retourné NaN pour x Merci! – donohoe

+0

je pense x = (map_width * (180 + lng)/360 + longitude_shift)% map_width; doit être x = ((map_width * (180 + lng)/360)% map_width) + longitude_shift; sinon le Japon et la côte est de l'Australie (moi inclus) se "enveloppé" au milieu de l'océan Pacifique. : P –

+0

Génial, fonctionne très bien! La seule chose que je n'ai pas trouvé ce que les y_pos ont fait? Ceci en PHP est: PanMan

5

Il existe une bonne bibliothèque Javascript, PROJ4JS, qui vous permet de faire des transformations entre différentes projections.

+0

Certainement la meilleure solution pour la question plus large de re-projection (par exemple, la question de Dinesh posé comme une réponse). – winwaed