Android 自动获取经纬度,计算距离、经纬度、方位角分析

java哥 阅读:285 2021-04-01 10:04:15 评论:0

最近做一个项目需要通过GPS获取经纬度,通过计算算出两点之间的距离。通过对Google和百度的疯狂轰炸,终于找到了解决的办法。

首先声明权限:

android:name="android.permission.ACCESS_FINE_LOCATION"


java
代码如下:

/* 获取GPS定位 */

LocationManager locationManager = (LocationManager)

                       ListActivity.this.getSystemService(Context.LOCATION_SERVICE);

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new MobileLocationListener());

 

private class MobileLocationListener implements LocationListener {

 

  @Override

  public void onLocationChanged(Location location) {

    // TODO Auto-generated method stub

                      

  }

 

  @Override

  public void onProviderDisabled(String provider) {

    // TODO Auto-generated method stub

       

  }

 

  @Override

  public void onProviderEnabled(String provider) {

    // TODO Auto-generated method stub

              

  }

 

  @Override

  public void onStatusChanged(String provider, int status, Bundle extras) {

    // TODO Auto-generated method stub

  }    

}

重点的来了,两点经纬度计算距离

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;

}


 

·       Lat1 Lng1 表示A点经纬度,Lat2 Lng2 表示B点经纬度

·       a=Lat1 – Lat2 为两点纬度之差 b=Lng1 -Lng2 为两点经度之差

·       6378.137为地球半径,单位为千米;计算出来的结果单位为千米


两点经纬度,计算方位角

/* 计算方位角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;

}

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号