Konwertuj długie/długie na współrzędne X/Y

Mam wartość Lat / Long New York City, NY; 40.7560540, -73.9869510 i płaski obraz Ziemi, 1000px × 446px.

Chciałbym być w stanie przekonwertować, za pomocą Javascript, Lat / Long do współrzędnej X,Y, gdzie punkt odzwierciedla położenie.

Więc współrzędna X,Y tworzą lewy górny róg obrazu będzie; 289, 111

Rzeczy do zapamiętania:

  1. nie martw się o kwestie, jakiej projekcji użyć, Stwórz własną założenie czy iść z czym wiesz może działać
  2. X, Y mogą tworzyć dowolny róg obrazu
  3. punkty bonusowe za to samo rozwiązanie w PHP (ale I really need the JS)
Author: winwaed, 2009-06-20

5 answers

Podstawową funkcją konwersji w js będzie:

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

Zwróci liczbę pikseli z lewego górnego rogu. Funkcja ta przyjmuje następujące wartości:

  1. że twój obraz jest prawidłowo wyrównany w lewym górnym rogu (0,0) / align = "left" / 90018* Zachód.
  2. że Twoje koordy są podpisane przez N bycie -, s bycie +, w bycie-i e bycie +
 8
Author: Mike Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 21:54:18

Projekcja, której używasz, zmieni wszystko, ale to zadziała zakładając projekcję Merkatora:

<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>
 18
Author: Paul A Jungwirth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-04 03:02:49

Istnieje dobra biblioteka Javascript, PROJ4JS , która pozwala na dokonywanie przekształceń między różnymi projekcjami.

 6
Author: andri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-20 01:59:30

Jeśli masz obraz całej ziemi, projekcja zawsze ma znaczenie. Ale może po prostu nie rozumiem twojego pytania.

 0
Author: hanno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 21:36:08

Napisałem funkcję, która działa na mapach Mercatora. Zwłaszcza, jeśli obraz nie obejmuje całego świata, oznacza to, że działa również z przyciętą mapą: https://stackoverflow.com/a/10401734/730823

 0
Author: Raphael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:33:21