如何将经度或纬度转换为米?


126

如果我有标准NMEA格式的纬度或经度读数,是否有一种简单的方法/公式将该读数转换为米,然后可以在Java(J9)中实现?

编辑:好的,似乎我想做的事并不容易,但是我真正想做的是:

假设我有一个纬度和距离较长的用户,并且用户有一个纬度和较长时间,是否有一种简单的方法可以将它们进行比较,以决定何时告诉用户他们在相距合理距离内?我知道合理的科目,但这是容易实现的还是算术过度?



1
将纬度/经度转换为米是什么意思?米从哪里来?您是否正在寻找一种方法来计算沿地球表面从一个坐标到另一个坐标的距离?
巴尔的摩

2
定义“航路点”。定义“合理”。这真的是您想知道的吗:“如何根据给定的纬度和经度来计算两个点之间的距离?”
巴尔的摩

2
我偶然发现了这个要在经度和纬度上进行SQL查询的问题,发现这篇很棒的文章的底部带有一些Java代码。您可能也会对此感兴趣。
克里斯托弗·范·兰德肖特

Answers:


172

这是一个javascript函数:

function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
    var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}

说明:https : //en.wikipedia.org/wiki/Haversine_formula

Haversine公式根据给定的经度和纬度确定球体上两个点之间的大圆距离。


2
对于那些正在寻找在wgs和utm之间转换的库的人:github.com/urbanetic/utm-converter
Aram Kocharyan

3
如果有人可以在上面的代码中添加一些解释性注释,将不胜感激。提前致谢!
Ravindranath Akila

发现评论似乎已被采纳。该链接还表示其基于本文有关距离计算的内容。因此,任何未回答的问题都应在原始链接中找到。:)
约阿希姆(Joachim)

62

考虑到您正在寻找一个简单的公式,这可能是最简单的方法,假设地球是一个周长为40075公里的球体。

以纬度1度为单位的米长度=始终为111.32 km

经度1度的米长度= 40075公里* cos(纬度)/ 360


2
经度方程如何工作?在90度的纬度下,您希望它显示在111公里附近;但改为显示0; 同样,接近它的值也接近于
0。– Reece

9
赤道的纬度为0°,极点的纬度为90°(并非相反)。对于赤道,公式为40075公里* cos(0°)/ 360 = 111公里。对于极点,公式为40075 * cos(90°)/ 360 = 0 km。

我认为这种方法很简单,特别是因为问题不是要求两个点之间的确切距离,而是它们是否“足够接近”。使用这些公式,我们可以轻松地检查用户是否位于以航点为中心的正方形内。检查正方形比检查圆形要容易得多。

29

为了近似估计两个坐标之间的短距离,我使用了来自http://en.wikipedia.org/wiki/Lat-lon的公式 :

m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );

在下面的代码中,我留下了原始数字,以显示它们与Wikipedia中公式的关系。

double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;

latMid = (Lat1+Lat2 )/2.0;  // or just use Lat1 for slightly less accurate estimate


m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );

deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);

dist_m = sqrt (  pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );

Wikipedia条目指出,纵向距离100 km的距离计算在0.6m范围内,而横向距离100 km的距离计算在1cm范围内,但我尚未对此进行验证,因为该精度范​​围适合我使用。


3
请注意,2017年,维基百科页面上还有另一个公式(似乎已经完善)。
Gorka Llona

3
是的,Wikipedia中的公式略有不同,但是其他Wikipedia公式似乎是基于这个很好的SO答案的相似结果,实际上有人在进行计算。
not2qubit

10

纬度和经度指定点,而不是距离,因此您的问题有点荒谬。如果您询问两个(纬度,经度)点之间的最短距离,请参阅有关大圆距离的Wikipedia文章


9
他谈论的是引用转换,因此您的回答不是重点(没有双关语)
Paulo Neves

1
并作为参考,指导GPS位置基准转换的转换。www.microem.ru/pages/u_blox/tech/dataconvert/GPS.G1-X-00006.pdf
Paulo Neves

2
他想知道每米多少度,以便可以找到2点之间的距离。字里行间。
theAnonymous

1
而且您的答案更加荒谬
jerinho.com

7

有许多工具可以简化这一过程。查看monjardin的答案有关所涉及内容的更多详细信息,。

但是,这样做不一定很困难。听起来您正在使用Java,所以我建议您研究一下GDAL之类的东西。它为例程提供了Java包装器,并且具有将Lat / Lon(地理坐标)转换为UTM(投影坐标系)或其他一些合理的地图投影所需的所有工具。

UTM很好,因为它是米,所以使用起来很容易。但是,您需要获得适当的UTM区域才能做好工作。通过谷歌搜索可以找到一些简单的代码,以找到适合经纬度的区域。


7

地球是一个令人讨厌的不规则表面,因此没有简单的公式可以精确地做到这一点。您必须使用地球的近似模型,并将坐标投影到该模型上。我通常使用的模型是WGS 84。这就是GPS设备通常用来解决完全相同的问题的方法。

NOAA可以在其网站上下载一些软件以帮助解决此问题


6

这是bh-函数的R版本,以防万一:

measure <- function(lon1,lat1,lon2,lat2) {
    R <- 6378.137                                # radius of earth in Km
    dLat <- (lat2-lat1)*pi/180
    dLon <- (lon2-lon1)*pi/180
    a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1-a))
    d <- R * c
    return (d * 1000)                            # distance in meters
}



1
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function

我看到链接到处都是破损的。
tshepang

1

要以x和y表示形式转换纬度和经度,您需要确定要使用的地图投影类型。对于我来说,椭圆墨卡托看起来很好。在这里,您可以找到一个实现(也使用Java)。


0

如果其足够接近,则可以将它们视为平面上的坐标。如果不需要完美的精度,这可以说是在街道或城市级别,并且您所需要做的就是粗略估算与任意限制进行比较的距离。


3
不,那行不通!对于不同的纬度值,以m为单位的x距离是不同的。在赤道,您可能会避开它,但越靠近两极,您的椭球就越极端。
RickyA 2012年

3
尽管您的评论是合理的,但它无法回答用户有关将经度/纬度差异转换为米的问题。
JivanAmara 2013年

0

根据地球上的平均降落距离。

1°= 111公里;

将其转换为弧度并除以米,以RAD为单位的魔术数,以米为单位:0.000008998719243599958;

然后:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;

3
最后,一个简单的答案:)
Ben Hutchison

如果纬度为-179而另一个为179,x距离应为2度而不是358
OMGPOP

7
不要使用此答案(由于某些原因,它已被投票赞成)。经度和距离之间没有单一的缩放比例;地球不是平坦的。
CPBL 2015年

1
我相信是111.1
Abel Callejo

6
请注意,赤道的一个经度是111公里,其他纬度则较少。有一个简单的近似公式可以找到以纬度为函数的经度1°的千米长度:经度1°= 40000 km * cos(纬度)/ 360(当然,当纬度= 90°时,则为111 km)。另请注意,经度1度几乎总是与纬度1度不同。
2016年

-1

如果您想要一个简单的解决方案,请使用其他注释所概述的Haversine公式。如果您有一个对精度要求很高的应用程序,请记住,Haversine公式不能保证精度优于0.5%,因为假设地球是一个球体。要考虑地球是扁球体,请考虑使用Vincenty公式。此外,我不确定应使用Haversine公式使用什么半径:{赤道:6,378.137公里,极地:6,356.752公里,体积:6,371.0088公里}。


it is assuming the earth is a circle^^如今有些奇怪的人在做这个……但是,您的意思可能是it is assuming the earth is a sphere;;)
derHugo

-2

您需要将坐标转换为弧度以完成球面几何。转换后,即可计算两点之间的距离。然后可以将距离转换为您想要的任何度量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.