已知两点已知经纬度求距离,怎么求两点的曼哈顿距离

37316人阅读
开发学习笔记(19)
看标题就会明白,两个经纬度之间真实距离这个一般的地图API有自带方法,直接调用便可得到结果,一般结果都是以米为单位。最近在做android版上的GoogleMap,找了半天API发现没有此类方法,看来只能自己实现了,接下来我就把如何计算两点之间(经纬度)的真实距离的算法写下来,原则上在各种地图版本上都通用,方便大家使用。
Google Map API:
【本文适用于android,ios等各种平台下的地图经纬度测距】
自己实现距离算法: /**
* 计算两点之间距离
* @param start
* @param end
* @return 米
public double getDistance(LatLng start,LatLng end){
double lat1 = (Math.PI/180)*start.
double lat2 = (Math.PI/180)*end.
double lon1 = (Math.PI/180)*start.
double lon2 = (Math.PI/180)*end.
double Lat1r = (Math.PI/180)*(gp1.getLatitudeE6()/1E6);
double Lat2r = (Math.PI/180)*(gp2.getLatitudeE6()/1E6);
double Lon1r = (Math.PI/180)*(gp1.getLongitudeE6()/1E6);
double Lon2r = (Math.PI/180)*(gp2.getLongitudeE6()/1E6);
//地球半径
double R = 6371;
//两点间距离 km,如果想要米的话,结果*1000就可以了
double d =
Math.acos(Math.sin(lat1)*Math.sin(lat2)+Math.cos(lat1)*Math.cos(lat2)*Math.cos(lon2-lon1))*R;
return d*1000;
举例:(我使用的百度地图的经纬度数据)
LatLng start = new LatLng(39.91394);
LatLng end = new LatLng(36.9574);
getDistance(start, end);
log日志结果为:402.21321(km)
害怕不准确的话,可以打开百度地图首页,使用测距工具:
看图应该知道,应该没什么问题吧。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3768698次
积分:14081
积分:14081
排名:第824名
原创:95篇
转载:24篇
评论:686条
(1)(1)(1)(1)(3)(2)(11)(6)(1)(7)(1)(1)(3)(2)(1)(10)(4)(6)(9)(4)(10)(1)(5)(4)(1)(3)(2)(9)(5)(1)(6)关于已知两点经纬度求球面最短距离的公式推导
我的图书馆
关于已知两点经纬度求球面最短距离的公式推导
3009人阅读
已知两点经纬度计算球面距离的公式,一搜一大堆,形式如下: 可是至于这个公式为什么是这样的,今天推导了一下,详细推导过程如下。首先画个图(图1),要不然空间想象能力差的话容易犯糊涂。首先对图1做个大致的说明,红色的半圆表示赤道,蓝色的圆弧表示本初子午线(也就是经度为0的子午线)。球最上方是北极点,点A和点B分别为要计算的两个点,坐标分别为A(jA,wA)和B(jB,wB)。图1 示意图 再开始推导之前,我们需要在图中绘制一些辅助线,便于后面的描述和推导。如图1所示,A(jA,wA),B(jB,wB)两点分别为球面上的两点,坐标为经纬度表示。延A、B两点分别做垂直于赤道平面的垂线交赤道面为C、D两点。连接C、D两点,然后过A做CD的平行线交BD与点E。至此,所有的辅助线绘制完毕。假设地球为一个规则的圆球,半径为R(其实地球是一个椭球体,赤道的半径比极地的半径稍微大一点点)。 第一步:确定已知条件, 第二步:在直角和直角中有: 第三步:在平面ABCD中,有: 第四步:在直角中,使用勾股定理可以得到AB的直线长度。如下: 第五步:这里需要引入一个公式(5),就是大名鼎鼎的余弦定理,假设三角形的三个角为A,B,C,则有: 把上面的公式(1)、(2)、(3)、(5)带入(4)中,然后整理可以得到: 最后,通过整理得到AB之间的直线距离为: 第六步:我们已经知道AB的直线距离,那么AB的弧长距离可以先通过计算中对应的圆心角,然后用弧长公式计算出来。这里在依旧使用余弦定理公式(5),经过变形可以得到: 把式(6)带入式(7),化简得到: 最终,我们得到了一个关于圆心角的余弦值的公式: 第七步:知道圆心角,计算弧长的公式很简单,使用半径乘以圆心角(弧度单位)即可: 所以最后我们就得到了球面上AB的距离应该是: 最后使用公式(10)就可以编写代码来计算球面上任意两点间的最短距离了。这里使用的是一个规则的球来代替的椭球的,肯定会有误差的,一般都用这个公式来进行计算。代码就不写了,也就一两句话就出来了。最后需要注意的就是,需要把经纬度都化成弧度单位。…………………………………………………华丽的分割线……………………………………………………………………………………以下内容更新于日………………………………………… 昨天使用立体几何的知识推导了一下球面两点的距离公式,发现比较复杂,今天想到一个简单的方法,使用空间直角坐标系来推导,很方便。首先我们需要建立一个空间坐标系:在赤道平面内,X轴由球心O指向本初子午线,Y轴在赤道平面内垂直于X轴,Z轴垂直于赤道平面朝向北极。还是假设AB两点的经纬度坐标为:A(jA,wA),B(jB,wB)。由该坐标系的定义以及经纬度的定义可以把上面的AB两点的坐标转换为该坐标系中的坐标如下: 由两点距离公式可以得到AB的直线距离为: 对于球面上的任意一个点(X,Y,Z),都有: 把上面的公式整理就可以得到(下面用到了一个积化和差公式): 好了,大功告成,是不是比用立体几何要简单的多。接下来就是用上面的弦长和弧长的关系来计算AB的弧长就可以了。
馆藏&22140
TA的推荐TA的最新馆藏[转]&[转]&[转]&已知经纬度求两点间地理距离 (更新日期 )
已有 14009 次阅读
|个人分类:|系统分类:|关键词:经度,纬度,地理,距离,R语言
已知经纬度计算两点间距离张金龙 例题:已知巴黎的地理位置为 东经2°20'14'',北纬 48°50'11',华盛顿的地理位置为 西经 77°03'56'',北纬 38°55'17''求两城市之间的距离。解答:用低精度和高精度两种方法解答,两种方法的区别在于,低精度将地球看作球形,高精度将地球看作椭球。首先将经纬度转换成十进制的度。定义函数deg2dec,用来完成这一转换deg2dec
functionh,m,s & &ifh
s & & & &res
s3600 & &returnres ##巴黎L1
deg2dec2,20,14phi1
deg2dec48, 50, 11##华盛顿L2
deg2dec77,03,56phi2
deg2dec38,55,17
## 第一种低精度方案,## 由于地球可以的扁率较小,可以近似看作一个球体,利用球面三角学公式可以快速的求出两点之间的距离。写成计算机程序,如下所示: #低精度公式geodist
functionL1, phi1, L2, phi2 & Ri
acossinphi1pi180sinphi2pi180
cosphi1pi180cosphi2pi180cosL1
L2pi180 & res
roundd, 3 & returnres #低精度geodistL1, phi1, L2, phi2答案:华盛顿和巴黎之间的距离是 km ##第二种 高精度方案,高精度的方案的误差低于+_50m.## 采用较为精密的公式,考虑到地球是一个椭球,a是地球的长轴,f是扁率,用如下公式计算
functionL1, phi1, L2, phi2 & &a
6378.14 & &f
1298.257 & &F
phi1phi22 & &G
phi22 & &ramda
L22 & & & &S
sinGpi1802cosramdapi1802
cosFpi1802sinramdapi1802 & &C cosGpi1802cosramdapi1802
sinFpi1802sinramdapi1802 & & & &omega
atansqrtSC & &R
sqrtSComega & &D
2omegaa & & & &H1
3R12C & &H2
3R12S & & & &res
fH1sinFpi1802cosGpi1802
fH2cosFpi1802sinGpi1802 returnroundres,3 hageodistL1, phi1, L2, phi2答案:华盛顿和巴黎之间的距离是km.在计算这一距离时,高精度和低精度算法给出的结果之间差距达16km。可见在天文计算中,低精度是远远不能满足要求的。注意: Meeus的天文算法中,东经为负, 西经为正, 南纬为负, 北纬为正。
例题和公式参考 Jean Meeus 的 Astronomical Algorithms以下是其他程序包的运行结果。 其中spaa程序包完全遵照本文上面的算法。 deg2dec
& functionh,m,s & ifh 0 & & m
m & & s s & &
m60 s3600 & returnres
deg2dec2,20,14phi1
deg2dec48, 50, 11 ##华盛顿L2
deg2dec77,03,56phi2
deg2dec38,55,17 xy rbindparis cL1, phi1, washington cL2,phi2 #### Results from Geospherelibrarygeospheredistmxy #### Fieldslibraryfieldsdists
rdist.earthx1
xy, miles FALSE #### High accuracy fromGeospheredistMeeuscL1, phi1, cL2,phi2
libraryncfgcdistL1, phi1, L2, phi2
libraryspaageodistL1, phi1, L2, phi2
libraryspdistGeop1 cL1, phi1, p2 cL2, phi2, a6378137, f1298.
转载本文请联系原作者获取授权,同时请注明本文来自张金龙科学网博客。链接地址:
上一篇:下一篇:
当前推荐数:3
评论 ( 个评论)
扫一扫,分享此博文
作者的其他最新博文
热门博文导读
Powered by
Copyright &1191人阅读
/// &summary&
/// 根据经纬度值计算出点与直线的距离
/// &/summary&
/// &param name="x"&点的x坐标&/param&
/// &param name="y"&点的y坐标&/param&
/// &param name="x1"&线的第一个端点的x坐标&/param&
/// &param name="y1"&线的第一个端点的y坐标&/param&
/// &param name="x2"&线的第二个端点的x坐标&/param&
/// &param name="y2"&线的第二个端点的y坐标&/param&
/// &returns&返回点与直线的距离&/returns&
public static double DistancePointToLine(double x, double y, double x1, double y1, double x2, double y2)
if (y1 == y2)//线段为平行于X轴
if (Math.Min(x1, x2) & x && Math.Max(x1, x2) & x)//垂足在线段内
return Math.Abs(ComputeD(y1, x, y, x));//点与该线的距离为TempP与P的的距离
return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));//返回到某个端点的距离
if (x1 == x2)//线段为平行于Y轴
if (Math.Min(y1, y2) & y && Math.Max(y1, y2) & y)//垂足在线段内
return ComputeD(y, x1, y, x);//点与该线的距离为TempP与P的的距离
return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));//返回到某个端点的距离
else//该线段不平行于X轴也不平行于Y轴
double k = (y2 - y1) / (x2 - x1); //线段的斜率
double TempX, TempY;
TempX = (Math.Pow(k, 2.0) * x1 + k * (y - y1) + x) / (Math.Pow(k, 2.0) + 1.0);
TempY = k * (TempX - x1) + y1;
if (TempX & -180 || TempX & 180 || TempY & -90 || TempY & 90)
return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));//返回到某个端点的距离
double TempDis1=(ComputeD(TempY, TempX, y1, x1) + ComputeD(TempY, TempX, y2, x2));
double TempDis2=ComputeD(y1,x1,y2,x2);
if((TempDis1 - TempDis2)&0.001) //垂足在线内
return (ComputeD(TempY, TempX, y, x));//点与该线的距离为TempP与P的的距离
return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));//返回到某个端点的距离
ComputeD函数参看
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3226次
排名:千里之外2197人阅读
A(α1,β1,h1),B(α2,β2,h2)|AB|=Sqrt((h1+h2)2+(R*arccos(cosβ1*cosβ2*cos(α1-α2)+sinβ1*sinβ2))2)
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:30653次
排名:千里之外
原创:18篇
评论:12条
(2)(4)(1)(1)(2)(3)(2)(4)}

我要回帖

更多关于 已知两点经纬度求距离 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信