博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 常用的地球经纬度转换公里(km)计算工具类 ...
阅读量:6672 次
发布时间:2019-06-25

本文共 5718 字,大约阅读时间需要 19 分钟。

地球赤道上环绕地球一周走一圈共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不在这里介绍,自行去百度定位官方查看;

 

转载地址:http://tllxo.baihongyu.com/

你可能感兴趣的文章
2016 机器学习之路:一年从无到有掌握机器学习
查看>>
红杉计越:AI、大数据、SaaS、云计算为何在中国一体迸发?
查看>>
阿里张勇:数据驱动的透明是平台治理的基础
查看>>
思科零售业解决方案助力企业提升服务与客户体验
查看>>
《哈利·波特》出版二十周年,教大家用神经网络写咒语!
查看>>
希捷发布全球首款2TB M.2 SSD固态硬盘
查看>>
《Java语言导学(原书第6版)》一一3.4 控制流语句
查看>>
银行如何通过大数据预测并防止用户流失?
查看>>
论各类BI工具的“大数据”特性
查看>>
博科15亿美元收购WLAN企业Ruckus
查看>>
EMC挑战全闪存极限
查看>>
着力大数据与大生态融合 贵阳第一个示范性公园开园
查看>>
ActiveMQ - JMS,Transport,Persistence
查看>>
互联网大数据支撑生态银行建设
查看>>
生态城年内开建智慧城市
查看>>
解密国产大数据法律应用服务平台
查看>>
打造智慧城市新风貌 嘉兴市推广应用万盏LED路灯
查看>>
工业大数据的三大挑战及大数据未来中国五大商业趋势
查看>>
苹果玩心机:取消GPU芯片商订单 打压股价再收购?
查看>>
安全是智慧城市建设的重中之重
查看>>