将经度和纬度转换为具有校准点的地图上的X Y坐标

33

如果我有一个大小为sizeX、sizeY的JPEG地图

以及地图上的一些标定点(X, Y, Lon, Lat)

那么,给定经度/纬度对,计算对应的XY点的算法是什么?

8个回答

25

以下方法对我有效,没有太多的废话。

int x =  (int) ((MAP_WIDTH/360.0) * (180 + lon));
int y =  (int) ((MAP_HEIGHT/180.0) * (90 - lat));

这些lat,lon坐标是由安卓设备提供的,因此它们应该符合所有Google Earth/Map产品使用的标准。


现在如何显示 x, y。意思是应该使用哪种方法来展示 x 和 y。 - naeemgik
@NaeemShah canvas.drawCircle(x, y, r, mPaint); - user529543
3
我意识到这是一个老问题,但我没有找到任何关于具有地图偏移和比例的答案。此外,MAP_WIDTH/HEIGHT是以度为单位(即经度和纬度的差值)还是像素值?缩放应该在哪里进行? - OzBarry
不是度数,而是像素。 - Robert Moore

14
如果使用等距圆柱投影类型地图,您需要执行以下操作:
  1. 在此处找到您位置的纬度和经度教程:
    http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  2. 将该信息输入以下公式:
    x =(像素中图像的总宽度)*(180 + 纬度)/ 360
    y =(像素中图像的总高度)*(90 - 经度)/ 180

    注意:当使用负经度或纬度时,请确保添加或减去负数,即+(-92)或-(-35),实际上是-92和+35

  3. 现在您已经有了要在图像上绘制的X和Y坐标

    有关此公式和地图类型的更多信息,请访问此处:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular

你能告诉我如何从X,Y计算回纬度经度吗? - colin

8
互联网上有很多关于计算两个纬度和经度对之间距离的信息。我们在公共网站上使用这些计算方法,它们不容易理解/讨论(所以我不会在这里尝试涉及)。但是,它们很容易实现。
一旦您有了一个返回距离的函数,您就应该能够根据角落之间的距离计算地图的宽度和高度。
然后,您可以计算您的点从左上角的水平和垂直距离。
现在,您可以找出地图宽度中左侧和您的点之间距离所表示的比例,将该比例应用于像素宽度,您就可以得到左侧和您的点之间的像素数。y轴重复此操作。
(从左侧像素)=(总像素宽度)*((左侧和您的点之间的地理编码距离)/(左侧和右侧之间的地理编码距离))
(从顶部像素)=(总像素高度)*((顶部和您的点之间的地理编码距离)/(顶部和底部之间的地理编码距离))
编辑:随着您进一步研究,您会注意到某些解决方案由于您正在近似球面上两点之间的距离并将其映射到平面上,因此会呈现比其他解决方案更准确的结果。随着距离的增加,精度会降低。对您最好的建议是先尝试一下,看它是否符合您的需求。

地图将我们的三维世界投影到二维表面上。由于无法完美地将正方形贴在球体上,因此存在不同的投影方法以获得近似正确的结果。给定地图上的距离是非线性的,因此您的公式只是一个近似值。 - Eric J.
近似值适用于大多数距离。但我应该在帖子中澄清这一点。 - Mayo
是的,地图缩放得越多,结果就越准确。对于城市级别的地图,你几乎看不到任何差异,但对于州级别或更大的地图,差异将会明显。 - Eric J.
我知道这有点老了,但这个答案非常好,而且非常有效。谢谢! - Rog

8
这很直接简单,让我解释一下它的可能性。
纬度和经度是在地球上绘制的虚拟线,因此您可以准确地定位世界上的任何位置。简单地说,它们是平面的X和Y坐标。纬度是一条从北到南延伸的垂直线,其90度位于北极,-90度位于南极。
另一方面,经度是一条从东到西延伸的水平线,西方为-180度,东方为180度。
您可以通过假设HTML容器的宽度是世界的宽度,高度也是如此,将latLng转换为像素坐标。
公式 - 经度 - 像素
(givenLng*widthOfContainerElement)/360

其中360是总经度(以度为单位)

公式 - 纬度 - 像素

(givenLat*heightOfContainerElement)/180

其中180是总纬度(以度为单位)

//Height is calculated from the bottom

你可以在我的网站上找到这个公式的可行实现,它仅使用JavaScript。http://www.learntby.me/javascript/latLngconversion.php 如果你还需要任何澄清,请告诉我。

我已在此处添加了所需的披露。 - Andrew Barber

5

有许多不同的地图投影方案。您需要知道您的地图使用哪种方案。

有关地图投影算法和正/反向映射的更多信息,请查看此链接。它提供了许多常见投影的公式。


我不需要太高的精度,所以下面的解决方案可能已经足够了。如果不行,那么转换应该怎么做呢?有哪些投影方案?到目前为止,我见过的有:UTM 横向墨卡托 墨卡托 经度/纬度 - Jorge
顺便说一下,我也编写了转换经纬度和UTM之间的公式。将经纬度转换为UTM并应用以下解决方案是正确的吗(至少对于UTM投影)? - Jorge
1
你的地图使用墨卡托投影吗?在选择合适的投影之前,您需要知道地图使用的编码方式。一旦您正确获取了地理编码距离,mmayo公式可以为您提供地图上的正确像素位置。 - Eric J.
我有两种地图。一种是使用纬度/经度投影的,另一种是使用UTM投影的。如果我没记错的话,对于第一种地图,我可以使用mmayo公式,而对于第二种地图,我应该在应用公式之前将纬度/经度值转换为UTM。我是正确的吗? - Jorge

2

为了制作麦卡托投影地图,请按照以下步骤进行操作:

extension UIView
{
    func addLocation(coordinate: CLLocationCoordinate2D)
    {
        // max MKMapPoint values
        let maxY = Double(267995781)
        let maxX = Double(268435456)

        let mapPoint = MKMapPointForCoordinate(coordinate)

        let normalizatePointX = CGFloat(mapPoint.x / maxX)
        let normalizatePointY = CGFloat(mapPoint.y / maxY)

        let pointView = UIView(frame: CGRectMake(0, 0, 5, 5))
        pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height)

        pointView.backgroundColor = UIColor.blueColor()

        addSubview(pointView)
    }
}

我有一个简单的项目,可以在UIView上添加坐标:https://github.com/Glechik/MapCoordinateDrawer


谢谢,知道经度和纬度的最大值是我缺失的关键信息。没有这些信息,你就无法制定公式。 - Ben Stahl

1

<!DOCTYPE html>
<html>
<head>
<style>
#point{font-face:Arial; font-size:18px; color:#FFFF00; width:12px; height:12px;text-shadow: 2px 2px #000000}
#canvas {position: absolute; top: 0px; left: 0px; z-index: -2}
        html,
        body,
        #canvas {
            width: 100%;
            height: 100%;
            overflow: hidden;
            margin: 0
        }
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script>
$(window).on("load resize",function(e){

var w = $("#canvas").width();
var h = $("#canvas").height();
// New York, NY (https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY)
               var lat = 40.91525559999999;
               var long = -73.70027209999999;


var x =  ((w/360) * (180 + long)) - 9;
var y =  ((h/180) * (90 - lat)) - 18;

$("#text").text('X:'+x+', Y:'+y);
$("#point").offset({ top: y, left: x });

});
</script>
</head>
<body>
<div id="text"></div>
<div id="point"></div>
<img id="canvas" border="0" src="http://friday.westnet.com/~crywalt/dymaxion_2003/earthmap10k.reduced.jpg">

</body>
</html>


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接