将纬度/经度转换为 X/Y 坐标

IT技术 php javascript maps coordinates proj4js
2021-02-20 14:34:52

我有纽约市的纬度/经度值;40.7560540,-73.9869510 和地球的平面图像,1000px × 446px。

我希望能够使用 Javascript 将纬度/经度转换为 X、Y 坐标,该点将反映位置。

因此,图像左上角的 X、Y 坐标为;289, 111

注意事项:

  1. 不要担心使用什么投影的问题,做出自己的假设或使用你知道可能有效的方法
  2. X,Y 可以形成图像的任何角落
  3. PHP 中相同解决方案的加分点(但我真的需要 JS)
3个回答

您使用的投影将改变一切,但假设墨卡托投影将起作用:

<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>
我认为 x = (map_width * (180 + lng) / 360 + longitude_shift) % map_width; 应该是 x = ((map_width * (180 + lng) / 360) % map_width) + longitude_shift; 否则日本和澳大利亚东海岸(包括我在内)会被“包裹”到太平洋中部。:P
2021-04-24 14:34:52
这也对我有用,是一个很好的答案。我确实在这一行将 'lng' 更改为 'parseInt(lng, 10)':x = (map_width * (180 + lng) / 360 + longitude_shift) % map_width; 当我手动调用该函数时,它会起作用,将传递的值从数组中返回 NaN for x 谢谢!
2021-05-09 14:34:52
@mat:谢谢!代码现已修复。
2021-05-09 14:34:52
太棒了,效果很好!我唯一没有发现 y_pos 做了什么?这在 PHP 中是: <? $lat = $lat * M_PI / 180; // 从度数转换为弧度 $y = log(tan(($lat/2) + (M_PI/4))); // 做墨卡托投影(带 2pi 单位的赤道) $targetY = ($h / 2) - ($w * $y / (2 * M_PI)); //+ y_pos; // 适合我们的地图 ?>
2021-05-11 14:34:52
@PanMan:y_pos 是因为代码中引用的图像具有 19 像素的顶部边框,因此您需要在到达地图之前向下移动 19 像素。
2021-05-19 14:34:52

js 中的一个基本转换函数是:

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

这将返回左上角的像素数。该函数假设如下:

  1. 您的图像与左上角 (0,0) 正确对齐,左上角 (0,0) 与 90* 北 x 180* 西对齐。
  2. 你的坐标用 N 表示 -,S 表示 +,W 表示 - 和 E 表示 +
谢谢,如何扭转这个?那么从 X 和 Y 到具有指定边界框坐标的纬度/经度?
2021-05-10 14:34:52

如果你有一张整个地球的照片,投影总是很重要。但也许我只是不明白你的问题。

你是对的,但在这种情况下,我很乐意使用适当的图像来匹配特定投影的工作解决方案。
2021-04-25 14:34:52