天天看點

adroid 中公裡除時間_Android 常用的地球經緯度轉換公裡(km)計算工具類

地球赤道上環繞地球一周走一圈共40075.04公裡,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的長度計算如下:   40075.04km/360°=111.31955km

111.31955km/60=1.8553258km=1855.3m

任意兩點距離計算公式見代碼:

package org.wavefar.lib.utils;

import android.content.Context;

import com.baidu.location.BDAbstractLocationListener;

import com.baidu.location.LocationClient;

import com.baidu.location.LocationClientOption;

import com.baidu.mapapi.model.LatLng;

import com.baidu.mapapi.navi.BaiduMapAppNotSupportNaviException;

import com.baidu.mapapi.navi.BaiduMapNavigation;

import com.baidu.mapapi.navi.NaviParaOption;

import com.baidu.mapapi.utils.poi.BaiduMapPoiSearch;

import com.baidu.mapapi.utils.route.BaiduMapRoutePlan;

import com.baidu.mapsdkplatform.comapi.location.CoordinateType;

import org.wavefar.lib.utils.LogUtil;

import org.wavefar.lib.utils.StringUtil;

public class LocationUtil {

private LocationClient mLocationClient;

private BDAbstractLocationListener mlistener;

private Context context;

// 地球半徑

private final static double EARTH_RADIUS = 6378.137;

public LocationUtil(Context context) {

this.context = context;

mLocationClient = new LocationClient(context.getApplicationContext());

LocationClientOption option = initLocationOption();

mLocationClient.setLocOption(option);

LogUtil.d(LocationUtil.class.getSimpleName(), "目前定位庫版本" + mLocationClient.getVersion());

}

private LocationClientOption initLocationOption() {

LocationClientOption option = new LocationClientOption();

// 設定定位模式

option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

// 傳回的定位結果是百度經緯度,預設值gcj02

option.setCoorType(CoordinateType.BD09LL);

// 設定發起定位請求的間隔時間為5000ms

option.setScanSpan(5000);

// 傳回的定位結果包含位址資訊

option.setIsNeedAddress(true);

//可選,預設false,設定是否需要POI結果,可以在BDLocation.getPoiList裡得到

option.setIsNeedLocationPoiList(true);

// 傳回的定位結果包含手機機頭的方向

option.setNeedDeviceDirect(true);

//可選,預設false,設定是否需要位置語義化結果,可以在BDLocation.getLocationDescribe裡得到,結果類似于“在北京天安門附近”

option.setIsNeedLocationDescribe(true);

option.setOpenGps(true);

return option;

}

public void registerLocationListener(BDAbstractLocationListener listener) {

mlistener = listener;

if (mlistener != null) {

mLocationClient.registerLocationListener(mlistener);

}

}

public void start() {

if (mLocationClient.isStarted()) {

return;

}

mLocationClient.start();

}

public void reStart() {

if (mLocationClient.isStarted()) {

return;

}

mLocationClient.restart();

}

public void stop() {

if (mLocationClient.isStarted()) {

mLocationClient.stop();

}

}

public void destroy() {

if (mLocationClient != null) {

mLocationClient.unRegisterLocationListener(mlistener);

mLocationClient.stop();

mLocationClient = null;

}

}

public void startNavi(LatLng pt1, LatLng pt2) {

// 建構 導航參數

NaviParaOption para = new NaviParaOption()

.startPoint(pt1).endPoint(pt2);

try {

BaiduMapNavigation.openBaiduMapNavi(para, context);

} catch (BaiduMapAppNotSupportNaviException e) {

BaiduMapNavigation.openWebBaiduMapNavi(para, context);

e.printStackTrace();

}

}

public void startWebNavi(LatLng pt1,LatLng pt2) {

NaviParaOption para = new NaviParaOption()

.startPoint(pt1).endPoint(pt2);

BaiduMapNavigation.openWebBaiduMapNavi(para, context);

}

public void stopNavi() {

try {

BaiduMapNavigation.finish(context);

BaiduMapRoutePlan.finish(context);

BaiduMapPoiSearch.finish(context);

} catch (Exception e) {

e.printStackTrace();

}

}

private static double rad(double d) {

return d * Math.PI / 180.0;

}

public static double getDistance(double lat1, double lng1, double lat2,

double lng2) {

LogUtil.d("LocationUtil", "lat1:" + lat1 + "lng1:" + lng1 + "lat2:" + lat2 + "lng2:" + lng2);

double radLat1 = rad(lat1);

double radLat2 = rad(lat2);

// 如果有一方等于零,直接傳回0

if (radLat1 == 0 || radLat2 == 0) {

return 0;

}

double a = radLat1 - radLat2;

double b = rad(lng1) - rad(lng2);

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;

}

public static String distanceKMFormat(double distance) {

return distance > 1 ? (distance + "KM") : (distance * 1000 + "M");

}

public static String distanceFormat(double distance) {

String str;

double value = distance;

if (distance >= 1000) {

value = value / 1000;

str = "KM";

} else {

str = "M";

}

return String.format("%s%s",StringUtil.formatDecimal(value,null),str);

}

}

以上代碼定位依賴于百度定位API,是以粘貼以上代碼之前,需要引入百度定位API,引入百度定位API不在這裡介紹,自行去百度定位官方檢視;