Android獲取經緯度、計算距離、方位角

最近在Android上作GPS的東西,獲取經緯度、計算距離、方位角,感受在搞GIS樣。固然,玩笑了,玩玩而已,稍微總結一下。html

經度指示南北方向,縱向。android

緯度指示東西方向,橫向.git

獲取經緯度

         使用GPS權限:ide

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>工具

Android 提供LocationManagerLocation,能夠方便的得到經緯度、海拔等位置。使用LocationManager來得到位置管理類,從而能夠得到歷史GPS信息以及位置變化的監聽註冊;使用Location來得到具體的位置信息。代碼以下:ui

 

       locationm = (LocationManager) getSystemService(LOCATION_SERVICE);google

       Criteria criteria = new Criteria();spa

       criteria.setAccuracy(Criteria.ACCURACY_FINE);excel

       criteria.setAltitudeRequired(false);htm

       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;

       }

    }

兩點經緯度,計算距離

這種公式我必然是不知道的,谷歌翻了翻,有人(http://xxyyyboy.blog.163.com/blog/static/765832620110410457662/)說是

1.Lat1 Lung1 表示A點經緯度,Lat2 Lung2 表示B點經緯度;

2.a=Lat1  Lat2 爲兩點緯度之差  b=Lung1 -Lung2 爲兩點經度之差;

3.6378.137爲地球半徑,單位爲公里;

計算出來的結果單位爲公里。

也有人(http://panyee.cnblogs.com/archive/2006/07/04/442771.html )說直接從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;

    }

兩點經緯度,計算方位角

         方位角這個玩意更加是不知道計算公式,在谷歌上搜了兩個鐘頭也沒找到公式。在一個移動通訊論壇有工具,只是下不了,非得邀請碼才註冊,和那個什麼社區同樣了。最後在http://bbs.godeyes.cn/Upload/2006/12/06/205631.rar 下了一個excel,用它的計算公式寫了一個。

計算方位角pab

其中lat_a, lng_aA的緯度和經度; lat_b, lng_bB的緯度和經度。代碼以下:

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

}

相關文章
相關標籤/搜索