【移动应用开发技术】Android 两点距离的计算方法_第1页
【移动应用开发技术】Android 两点距离的计算方法_第2页
【移动应用开发技术】Android 两点距离的计算方法_第3页
【移动应用开发技术】Android 两点距离的计算方法_第4页
【移动应用开发技术】Android 两点距离的计算方法_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论