如何将纬度或经度转换为米?
如果我有标准NMEA格式的经纬度读数,那么有一个简单的方法/公式可以将读数转换成米,然后我可以用Java(J9)来实现?
编辑:好吧,似乎我想要做的事情是不可能的,但是我真正想要做的是:
假设我有一个经纬度点,一个经纬度的用户是否有一个简单的方法来比较它们以决定何时告诉用户他们处于合理的距离点? 我意识到合理的主题,但是这是容易的还是过分的math运算?
这是一个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 }
说明:
为了近似两个坐标之间的短距离,我使用了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) );
维基百科条目规定,距离的计算在纵向100km内为0.6m,在100km的纬度上为1cm,但是我没有将其validation为接近精度的情况。
纬度和经度指定点,而不是距离,所以你的问题是有点荒谬的。 如果您询问两个(经纬度)点之间的最短距离,请参阅维基百科有关大圆距离的文章 。
假设你正在寻找一个简单的公式,这可能是最简单的方法,假设地球是一个周长为40075公里的球体。
纬度1°的米长度=总是111.32公里
cos(纬度)/ 360°的长度(以米为单位)
有很多工具可以使这个变得简单。 请参阅monjardin的答案 ,了解涉及到的更多细节。
但是,这样做并不一定困难。 这听起来像你使用的Java,所以我会build议寻找像GDAL的东西。 它为它们的例程提供了Java包装,并且具有从Lat / Lon(地理坐标)转换为UTM(投影坐标系统)或其他一些合理的地图投影所需的所有工具。
UTM很好,因为它是米,所以很容易工作。 但是,您需要获得适当的UTM区域 ,才能做好工作。 有一些简单的代码可以通过谷歌search来find经纬度/长对的适当区域。
地球是一个令人讨厌的不规则的表面,所以没有一个简单的公式来做到这一点。 你必须生活在一个近似的地球模型,并把它的坐标投影到它。 我通常使用的模型是WGS 84 。 这是GPS设备通常用来解决完全相同的问题。
诺阿有一些软件可以下载,以帮助在他们的网站上 。
基于在地球上的平均距离。
1°= 111公里;
将其转换为弧度并除以米,取RAD的一个幻数,单位为米:0.000008998719243599958;
然后:
const RAD = 0.000008998719243599958; Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;
一海里(1852米)被定义为赤道的一分之一分的经度。 但是,您需要定义一个地图投影 (另请参阅UTM ),其中您正在为转换工作确实有意义。
有很多方法来计算这个。 他们都使用半径为地球半径的球面三angular函数的近似值。
尝试http://www.movable-type.co.uk/scripts/latlong.html了解不同语言的一些方法和代码。;
以下是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 }
'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表示中转换经度和纬度,您需要确定要使用的地图投影的types。 至于我,椭圆墨卡托似乎很好。 在这里你可以find一个实现(也是Java)。
如果距离足够近,可以将它们作为平面上的坐标来处理。 如果不需要完美的准确性,这可以在街道或城市层面上工作,并且您只需要粗略猜测与任意限制相比较所涉及的距离。
您需要将坐标转换为弧度来执行球面几何。 一旦转换,那么你可以计算两点之间的距离。 那么距离可以转换为你想要的任何度量。