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

Math 如何将纬度或经度转换为米?,math,geolocation,geo,Math,Geolocation,Geo,如果我有一个标准NMEA格式的纬度或经度读数,是否有一个简单的方法/公式将该读数转换为米,然后用Java(J9)实现 编辑: 好吧,看来我想做的不容易,但我真正想做的是: 假设我有一个路点的lat和long以及一个用户的lat和long,有没有一种简单的方法来比较它们,以决定何时告诉用户他们在路点的合理距离之内?我意识到这是一个合理的主题,但这是很容易做到的还是过于数学化了?一海里(1852米)被定义为赤道经度之一。但是,您需要定义一个(另请参见)转换,以使转换真正有意义。纬度和经度指定的是点,

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

编辑: 好吧,看来我想做的不容易,但我真正想做的是:


假设我有一个路点的lat和long以及一个用户的lat和long,有没有一种简单的方法来比较它们,以决定何时告诉用户他们在路点的合理距离之内?我意识到这是一个合理的主题,但这是很容易做到的还是过于数学化了?

一海里(1852米)被定义为赤道经度之一。但是,您需要定义一个(另请参见)转换,以使转换真正有意义。

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

有许多工具可以使这一过程变得简单。有关所涉及内容的更多详细信息,请参阅

然而,这样做并不一定困难。听起来您正在使用Java,所以我建议您研究以下内容。它为它们的例程提供java包装器,并且它们拥有从Lat/Lon(地理坐标)转换为UTM(投影坐标系)或其他一些合理的地图投影所需的所有工具


UTM很好,因为它是米,很容易使用。但是,您需要获得适当的解决方案,以便将其做好。有一些简单的代码可以通过谷歌搜索找到一个合适的lat/long对区域。

有很多方法可以计算。它们都使用球面三角近似,其中半径是地球的半径

    '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

尝试用不同的语言编写一些方法和代码。

地球是一个令人烦恼的不规则表面,因此没有简单的公式可以精确地做到这一点。你必须生活在一个近似的地球模型中,并将你的坐标投射到上面。我通常看到的用于此的模型是。这是GPS设备通常用来解决完全相同的问题


美国国家海洋和大气管理局有一些软件可供下载,以帮助您完成这项工作。

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

如果距离足够近,可以将它们视为平面上的坐标。比如说,如果不需要精确到完美,那么这在街道或城市层面上是可行的,而你所需要的只是粗略地猜测所涉及的距离,以与任意限制进行比较

下面是一个javascript函数:

功能测量(lat1、lon1、lat2、lon2){//常用的地理测量功能
var R=6378.137;//地球半径,单位为KM
var dLat=lat2*Math.PI/180-lat1*Math.PI/180;
var dLon=lon2*Math.PI/180-lon1*Math.PI/180;
变量a=Math.sin(dLat/2)*Math.sin(dLat/2)+
Math.cos(lat1*Math.PI/180)*Math.cos(lat2*Math.PI/180)*
数学单(dLon/2)*数学单(dLon/2);
var c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));
var d=R*c;
返回d*1000;//米
}
说明:

哈弗森公式确定了给定经度和纬度的球体上两点之间的大圆距离


要在x和y表示中转换纬度和经度,您需要决定使用哪种类型的地图投影。至于我,椭圆墨卡托似乎很好。您可以找到一个实现(也可以用Java实现)。

基于地球上度数的平均距离

1°=111km

将其转换为弧度并除以米,取一个神奇的弧度数字,单位为米:0.000008998719243599958

然后:


为了近似两个坐标之间的短距离,我使用了 :

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

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公里的距离计算值在0.6米范围内,横向100公里的距离计算值在1厘米范围内,但我没有验证这一点,因为我可以使用接近该精度的任何地方。

以下是R版本,以防万一:


measure假设你在寻找一个简单的公式,假设地球是一个周长为40075公里的球体,这可能是最简单的方法

纬度为1°的长度(米)=始终为111.32公里


1°经度的长度(米)=40075 km*cos(纬度)/360

如果您想要一个简单的解决方案,请使用其他注释中概述的。如果您有一个精度敏感的应用程序,请记住哈弗森公式不能保证精度优于0.5%,因为它假设地球是一个球体。考虑地球是一个扁圆球体考虑使用。
此外,我不确定哈弗森公式应该使用什么半径:{赤道:6378.137公里,极地:6356.752公里,体积:6371.0088公里。

这里有一个MySQL函数:

SET@radius\u of_earth=6378.137;——以公里为单位
如果存在措施,则下降功能;
分隔符//
创建函数度量值(lat1 REAL、lon1 REAL、lat2 REAL、lon2 REAL)返回REAL
开始
--乘以1000将毫米转换为米
返回2*@地球半径*1000*ASIN(SQRT(
功率(SIN((lat2-lat1)/2*PI()/180),2)+
COS(lat1*PI()/180)*
COS(lat2*PI()/180)*
功率(SIN((lon2-lon1)/2*PI()/180),2)
));
结束//
定界符;

您的意思是UTM吗?你把纬度/经度转换成米是什么意思?离哪里几米?您是否在寻找一种方法来计算沿地球表面从一个坐标到另一个坐标的距离?定义“航路点”。定义“合理”。这真的是什么
m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );
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) );