如果我有一个经度纬度或阅读的标准格式的方式是有一个简单的方法/式转换,读到米,然后我就可以实现在Java(J9)?

编辑:好似乎是我想要做的是不可能的 很容易, 但是我真正想做的是:

说我有一个纬度和长期的方式点和纬度和长期的用户是否有一个简单的方法进行比较,以决定什么时候告诉用户,他们都在 合理 近距离的方式?我知道是合理的问题,但是这个容易的做法或仍然过于数学-y?

有帮助吗?

解决方案

下面是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公式确定给定的其经度和纬度上的球两点之间的大圆距离。

其他提示

由于你正在寻找一个简单的公式,这可能是做最简单的方式,假设地球的周长40075公里一个球体。

在的纬度的1°米长度=总是111.32公里

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

有关近似两个坐标之间的短距离我使用的公式从   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 );

在下面的代码我已经离开了原始数据,以显示它们之间的关系,以从维基百科式。

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

在维基百科条目指出,距离Calcs(计算)是0.6米内100公里纵向和1厘米100公里纬度,但我还没有证实这是任何接近该精度是好的为我用。

纬度和经度指定点,没有距离,所以你的问题是有点荒谬。如果你问约两(纬度,经度)点之间的最短距离,看到这个维基百科文章 上大圆距离。

地球是一烦人不规则表面,所以不存在简单的公式来精确地做到这一点。你必须生活在地球的近似模型和项目的坐标到它。我通常会看到使用这种模型是 WGS 84 。这是GPS装置通常用于解决完全相同的问题。

诺阿有一些软件可以下载,以帮助这个在其网站上

有许多工具,这将使这很容易。请参见蒙哈丁的回答关于什么是更多详细信息参与。

但是,这样做未必困难。这听起来像您使用的是Java,所以我会建议寻找到像 GDAL 。它提供了Java包装为他们的例程,和它们所需的所有工具,以从纬度/经度(地理坐标)到UTM转换(投影坐标系)或某一其它合理地图投影。

UTM是好的,因为它是米,所以易于使用。但是,您将需要获得相应的 UTM区为它做好。有通过使用Google找到为纬度/经度对的适当的区域可用的一些简单的代码。

下面是 B-H-的功能中的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
}

一海里(1852米)被定义为一个 角分 经在赤道。然而,需要定义 地图投影 (也请参看 UTM)在其工作转化为真正意义。

有相当多的方法来计算。它们都使用球面三角的aproximations其中半径是地球的一个。

尝试 http://www.movable-type.co.uk/脚本/ latlong.html 针对位的不同语言的方法和代码。

基于在地球辈分平均距离

1°=111公里;

转换为这个弧度和除以米,Take的用于RAD一个幻数,以米为单位:0.000008998719243599958;

然后:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;
    '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

要转换经度和纬度,你需要决定使用什么类型的地图投影的X和Y表示。至于我,椭圆墨卡托似乎非常好。 这里你可以找到一个实现(在Java中太)。

如果它足够近,你可以用对待他们一平面为坐标脱身。这部作品说,街道或市级如果需要完美的准确性心不是和你需要的是在参与任意限制比较距离的粗略估计。

如果要得到一种简单溶液,然后使用半正矢式通过的其他意见所概述。如果你有一个准确敏感的应用程序记住,因为它是假设地球是圆的haversine公式并不保证精度优于0.5%。考虑到地球是一个扁球体考虑使用 Vincenty的公式的。 另外,我不知道什么半径我们应该haversine公式使用:{赤道:6,378.137公里,极坐标:6,356.752公里,体积:6,371.0088公里}。

您需要的坐标转换为弧度做球面几何。一旦转换,那么你就可以计算出两点之间的距离。距离然后可以转换成你想要的任何措施。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top