您现在的位置是:首页 > 文章详情

Android 常用的地球经纬度转换公里(km)计算工具类

日期:2018-12-12点击:326

地球赤道上环绕地球一周走一圈共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; /** * 定位相关工具类 * @author summer */ 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; } /** * 注册定位回调 * @param listener */ 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; } } /** * 启动百度地图导航(Native),如果本地没有安装百度地图,调用WEBAPP * @param pt1 起点 * @param pt2 终点 */ 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(); } } /** * 启动百度地图导航(Web) */ 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; } /** * 计算距离 返回单位km * @param lat1 * @param lng1 * @param lat2 * @param lng2 * @return */ 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; } /** * 距离格式化 * * @param distance 以千米为单位 * @return */ public static String distanceKMFormat(double distance) { return distance > 1 ? (distance + "KM") : (distance * 1000 + "M"); } /** * 距离只保留两位小数 * @param distance 以米为单位 * @return */ 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不在这里介绍,自行去百度定位官方查看;


 

原文链接:https://yq.aliyun.com/articles/680603
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章