Question

J'ai la valeur Lat / Long de New York City, NY; 40.7560540, -73.9869510 et une image plate de la terre, 1000px & # 215; 446px.

Je voudrais pouvoir convertir, en utilisant Javascript, la latitude / longitude en coordonnées X, Y où le point refléterait l'emplacement.

Ainsi, la coordonnée X, Y du coin supérieur gauche de l'image serait; 289, 111

Choses à noter:

  1. ne vous inquiétez pas de la question de savoir quelle projection utiliser, faites votre propre hypothèse ou aller avec ce que vous savez pourrait fonctionner
  2. X, Y peuvent être n'importe quel coin de l'image
  3. Points bonus pour la même solution en PHP (mais je vraiment besoin du JS)
Était-ce utile?

La solution

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

Ceci renverra le nombre de pixels en haut à gauche. Cette fonction suppose ce qui suit:

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

Autres conseils

La projection que vous utilisez va tout changer, mais cela fonctionnera dans l'hypothèse d'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>

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

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

J'ai écrit une fonction qui fonctionne pour les cartes Mercator. Surtout si votre image ne couvre pas le monde entier, cela signifie également qu'elle fonctionne avec des cartes recadrées: https://stackoverflow.com/a/ 10401734/730823

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top