下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android两点距离的计算方法
最近做项目需要计算用户和商家之间的距离,并要求在Listview中显示具体距离。想了一下大致思路,首先是拿到当前用户的经纬度,在拿到具体某个商家的经纬度(服务端商家的经纬度已提供),根据用户和商家的经纬度来计算当前用户和商家的实际距离。就研究了一下具体的实现方法,计算两点距离一般有两种实现方式:
一种是使用勾股定理计算;
一种是计算两点之间的球面距离;
两种计算方式我做了一下比较,当两点的距离较近时使用两种方式计算的结果基本一致,但是当两点的距离比较远时,计算的结果就会相差甚远,比较发现两点之间计算球面距离的方式更加精确一些,更贴近实际距离。本文重点讲解两点之间球面距离的计算方式。
首先大家看一下对比结果:
测试结果:
对比结果一目了然,球面距离计算两点之间的距离更接近实际距离。
一、两点之间球面距离计算的原理
求法如下:
如右图,设若角AOB(球心角)为θ,大球的半径为R,A点维度、经度为
,B点维度、经度为
,则球面距离为Rθ
球面距离计算公式:
d(x1,y1,x2,y2)=r*arccos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2))
x1,y1是纬度、经度的弧度单位,r为地球半径
而当y1=y2时,公式就变为:
d=r*|x1-x2|
二、代码具体实现package
com.sunny.test;
public
class
TestDistance
{
static
double
DEF_PI
=
3
//
PI3.141592653589793
static
double
DEF_2PI=
6.28318530712;
//
2*PI
static
double
DEF_PI180=
0.01745329252;
//
PI/180.0
static
double
DEF_R
=6370693.5;
//
地球半径
public
static
void
main(String[]
args)
{
//乌鲁木齐87.49033,43.962242
北京116.337291,40.01116
double
distance1
=
GetLongDistance(87.49033,43.962242,
116.337291,40.01116)/1000;
double
distance2
=
GetShortDistance(87.49033,43.962242,
116.337291,40.01116)/1000
System.out.println("1.球面距离计算两点之间的距离为"+distance1);
System.out.println("2.勾股定理计算两点之间的距离为"+distance2);
}
//根据球面距离计算两点直接的距离
public
static
double
GetLongDistance(double
lon1,
double
lat1,
double
lon2,
double
lat2)
{
double
ew1,
ns1,
ew2,
ns2;
double
distance;
//
角度转换为弧度
ew1
=
lon1
*
DEF_PI180;
ns1
=
lat1
*
DEF_PI180;
ew2
=
lon2
*
DEF_PI180;
ns2
=
lat2
*
DEF_PI180;
//
求大圆劣弧与球心所夹的角(弧度)
distance
=
Math.sin(ns1)
*
Math.sin(ns2)
+
Math.cos(ns1)
*
Math.cos(ns2)
*
Math.cos(ew1
-
ew2);
//
调整到[-1
1]范围内,避免溢出
if
(distance
>
1.0)
distance
=
1.0;
else
if
(distance
<
-1.0)
distance
=
-1.0;
//
求大圆劣弧长度
distance
=
DEF_R
*
Math.acos(distance);
return
distance;
}
//根据勾股定理计算两点之间的距离
public
static
double
GetShortDistance(double
lon1,
double
lat1,
double
lon2,
double
lat2){
double
ew1,
ns1,
ew2,
ns2;
double
dx,
dy,
dew;
double
distance;
//
角度转换为弧度
ew1
=
lon1
*
DEF_PI180;
ns1
=
lat1
*
DEF_PI180;
ew2
=
lon2
*
DEF_PI180;
ns2
=
lat2
*
DEF_PI180;
//
经度差
dew
=
ew1
-
ew2;
//
若跨东经和西经180
度,进行调整
if
(dew
>
DEF_PI)
dew
=
DEF_2PI
-
dew;
else
if
(dew
<
-DEF_PI)
dew
=
DEF_2PI
+
dew;
dx
=
DEF_R
*
Math.cos(ns1)
*
dew;
//
东西方向长度(在纬度圈上的投影长度)
dy
=
DEF_R
*
(ns1
-
ns2);
//
南北方向长度(在经度圈上的投影长度)
//
勾股定理求斜边长
distance
=
Math.sqrt(dx
*
dx
+
dy
*
dy);
return
distance;
}
}
代码实现部分自己可以封装成一个工具类,然后传入要计算两点的经纬度,即可得到两点的距离。
大家看到开始的测试结果是double类型的数据小数点后有很长的小数,实际使用时我们可能不需要那么精确,一般到小数点后两位,按照以下方法处理,把距离值赋到TextView中显示即可://处理double类型的数据精确到小数点后两位
double
temp
=
GetTwoPointDistanceUtils.GetLongDistance(
mLon1,mLat1,
lon
,lat)/1000;
BigDecimal
bd
=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024专利知识产权合同
- 2024五星级酒店食品供应与采购劳务合同
- 2024外架搭设合同
- 2024软件项目委托开发合同
- 2024年度旅游景点开发合作协议
- 2024年度安置房买卖合同中的违约责任
- 2024年度新能源项目开发建设合同
- 文书模板-充电桩股份转让合同
- 2024年度货物买卖合同商品描述与支付方式详解
- 2024年幼儿园教育联盟协议
- 国开电大 可编程控制器应用实训 形考任务6实训报告
- GB/T 34120-2023电化学储能系统储能变流器技术要求
- 跨国企业中方外派人员的跨文化适应
- 《道路交叉设计》课件
- 《活着》读后感-课件
- 体检报告汇总分析中风险的防范
- 村里建群管理制度
- 【城市轨道交通运营安全管理研究5300字】
- 2024年中核汇能有限公司招聘笔试参考题库含答案解析
- 上海市2024届高三7月模拟预测历史试题(等级考)(解析版)
- 肺炎护理查房课件
评论
0/150
提交评论