Android获取经纬度计算距离介绍
经度指示南北方向,纵向
纬度指示东西方向,横向
获取经纬度
使用gps权限:
<uses-permission android:name="android.permission.access_fine_location"></uses-permission>
android提供locationmanager和location,可以方便的获得经纬度、海拔等位置。使用locationmanager来获得位置管理类,从而可以获得历史gps信息以及位置变化的监听注册;使用location来获得具体的位置信息。代码如下:
locationm = (locationmanager) getsystemservice(location_service);
criteria criteria = new criteria();
criteria.setaccuracy(criteria.accuracy_fine);
criteria.setaltituderequired(false);
criteria.setbearingrequired(false);
criteria.setcostallowed(true);
criteria.setpowerrequirement(criteria.power_low);
string provider = locationm.getbestprovider(criteria, true);
location location = locationm.getlastknownlocation(provider);
//获得上次的记录
gps_loc(location);
locationlistener gps_listener = new locationlistener() {
//监听位置变化,实时获取位置信息
@override
public void onstatuschanged(string provider, int status,
bundle extras) {
// todo auto-generated method stub
}
@override
public void onproviderenabled(string provider) {
// todo auto-generated method stub
}
@override
public void onproviderdisabled(string provider) {
// todo auto-generated method stub
}
@override
public void onlocationchanged(location location) {
// todo auto-generated method stub
//位置发生改变时
gps_loc(location);
}
};
locationm.requestlocationupdates(provider, 1000, 0, gps_listener);
}
// 获得自己位置
private void gps_loc(location location) {
if (location != null) {
self_weidu = location.getlatitude();
self_jindu = location.getlongitude();
} else {
self_weidu = 0;
self_jindu = 0;
}
}
两点经纬度,计算距离
1.lat1 lung1 表示a点经纬度,lat2 lung2 表示b点经纬度;
2.a=lat1 – lat2 为两点纬度之差 b=lung1 -lung2 为两点经度之差;
3.6378.137为地球半径,单位为千米;
计算出来的结果单位为千米。
直接从google maps的脚本里扒了段代码。
maps的代码:计算的结果是米为单位。
// 计算两点距离
private final double earth_radius = 6378137.0;
private double gps2m(double lat_a, double lng_a, double lat_b, double lng_b) {
double radlat1 = (lat_a * math.pi / 180.0);
double radlat2 = (lat_b * math.pi / 180.0);
double a = radlat1 - radlat2;
double b = (lng_a - lng_b) * math.pi / 180.0;
double s = 2 * math.asin(math.sqrt(math.pow(math.sin(a / 2), 2)
+ math.cos(radlat1) * math.cos(radlat2)
* math.pow(math.sin(b / 2), 2)));
s = s * earth_radius;
s = math.round(s * 10000) / 10000;
return s;
}
两点经纬度,计算方位角
计算方位角pab
其中lat_a, lng_a是a的纬度和经度; lat_b, lng_b是b的纬度和经度。代码如下:
// 计算方位角pab。
private double gps2d(double lat_a, double lng_a, double lat_b, double lng_b) {
double d = 0;
lat_a=lat_a*math.pi/180;
lng_a=lng_a*math.pi/180;
lat_b=lat_b*math.pi/180;
lng_b=lng_b*math.pi/180;
d=math.sin(lat_a)*math.sin(lat_b)+math.cos(lat_a)*math.cos(lat_b)*math.cos(lng_b-lng_a);
d=math.sqrt(1-d*d);
d=math.cos(lat_b)*math.sin(lng_b-lng_a)/d;
d=math.asin(d)*180/math.pi;
// d = math.round(d*10000);
return d;
}