转换经度&在具有校准点的地图上的X Y纬度

时间:2009-09-02 18:54:30

标签: gps geocoding coordinates latitude-longitude

如果我有一个尺寸为sizeX,sizeY

的jpeg地图

和地图上的一些校准点(X,Y,Lon,Lat)

使用给定的经度/纬度对计算地图中相应XY点的算法是什么?

8 个答案:

答案 0 :(得分:18)

这对我有用,没有那么多bs。

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

Android设备向我提供了lat,lon坐标。所以它们应该与所有Google Earth / Map产品使用的标准相同。

答案 1 :(得分:11)

如果使用Equidistant Cylindrical Projection type map,您需要执行以下操作:

  1. 在此处查找您的位置教程的纬度和经度:
    http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  2. 将该信息输入以下公式:
     x =(px中图像的总宽度)*(180 +纬度)/ 360
     y =(px中图像的总高度)*(90-经度)/ 180

    注意:当使用负经度纬度时,请务必加上或减去负数,即+( - 92)或 - ( - 35)实际上是-92和+35
  3. 您现在可以在图像上绘制X和Y了解更多信息,可以在此处找到有关此公式和地图类型的详细信息:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular < / em>的

答案 2 :(得分:8)

互联网上有大量关于计算两对纬度和经度之间距离的信息。我们在公共网站上使用这些计算,并且理解/讨论并不容易(所以我不会在这里尝试覆盖它们)。也就是说,它们很容易实现。

一旦你有一个返回距离的函数,你应该能够根据角之间的距离来计算地图的宽度和高度。

然后,您可以从左上角计算点的水平和垂直距离。

现在,您可以找出左侧和点之间的距离表示地图宽度的比率,将该比率应用于像素宽度,并确定左侧和点之间的像素数。重复y轴。

(左侧像素)=(总宽度,以像素为单位)*((左侧和您的点之间的地理编码距离)/(左侧和右侧之间的地理编码距离))

(顶部像素)=(总像素高度)*((顶部和点之间的地理编码距离)/(顶部和底部之间的地理编码距离))

编辑:当你进一步研究时,你会注意到一些解决方案将提供比其他解决方案更准确的结果,因为你是近似球面上两点之间的距离并将其映射到平面上。随着距离的增加,精度会降低。对您提出的最佳建议是先尝试一下,看看它是否符合您的需求。

答案 3 :(得分:7)

这是相当直接和简单的..让我解释它是如何可能的。

纬度和经度是在地球上绘制的虚线,因此您可以准确地精确定位世界上的任何位置。简单地说它们是飞机的X和Y坐标。 纬度是一条从北向南延伸的垂直线,北极为90度,南极为90度。

另一方面,经度是一条从东到南的水平线,西面为-180度,东面为180度。

你可以将latLng转换为像素坐标,因为假设html容器的宽度是世界的宽度,同样适用于高度。

公式 - 经度 - 像素

(givenLng*widthOfContainerElement)/360

其中360是以度为单位的总经度

公式-Latitude - 像素

(givenLat*heightOfContainerElement)/180

其中180是度数的总纬度

//Height is calculated from the bottom

你可以在这里找到这个公式的工作实现,在我的网站上(它只使用JavaScript)

http://www.learntby.me/javascript/latLngconversion.php

如果您仍需要任何澄清,请与我们联系。

答案 4 :(得分:5)

有许多不同的地图投影方案。您必须知道地图使用了哪一个。

有关地图投影算法和正向/反向映射的详细信息,请查看this link。它提供了许多常见预测的公式。

答案 5 :(得分: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

答案 6 :(得分: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>

答案 7 :(得分:1)

我已经尝试过这种方法:

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

但这对我来说效果更好:https://medium.com/@suverov.dmitriy/how-to-convert-latitude-and-longitude-coordinates-into-pixel-offsets-8461093cb9f5

这是上面文章代码部分的快捷方式: https://gist.github.com/blaurt/b0ca054a7384ebfbea2d5fce69ae9bf4#file-latlontooffsets-js