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;
/**
* 定位相关工具类
* @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不在这里介绍,自行去百度定位官方查看;

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android动画深度详解
前言 Android动画也是Android系统中一个很重要的模块, 在平时开发中, 为了做出炫酷的效果, 动画可以说是必不可少的; 本文将总结Android中与动画相关的部分, 文中部分内容整理自文末参考链接, 权作笔记~ 需要声明的是文章不会详细通过源码去讲解各种动画的实现细节, 因为相对来说, 动画的熟练使用更为重要, 所以本文只是提一下关键的动画源码部分 正文 一. 概述 Android中动画分为三大类:View动画,Transition(过渡动画), 属性动画; 下文也将从这三个方面进行总结和讲解 动画的本质实际上就是将作用对象的属性值在一段时间内缓慢的改变, 将每一个小的时间片段对应的属性值改变作用到对象并进行不断重绘, 造成肉眼看起来的的动画效果~ 二. View动画 2.1 基本使用总结 View动画分为四种, 如下表: 名称 标签 子类 效果 平移动画 <translate> TranslateAnimation 移动 缩放动画 <scale> ScaleAnimation 缩放 旋转动画 <rotate> RotateAnimati...
-
下一篇
揭秘Android开发效率提升多倍的利器;Gradle
Gradle是什么? Gradle是一种构建语言,目前是Android的默认构建工具,我们编写的编译脚本,其实就是玩Gradle的API,所以从它更底层的意义上看,是一个编程框架。 因为涉及的内容很多没法一两篇文章就介绍详细清楚,方便起见我用PPT图片的形式简单介绍一下。如果需要更详细了解学习的朋友可以看文末。 一.Gradle介绍 二.Gradle 之语言基础 Groovy ; 三.Gradle的重要概念; 1.Gradle Wrapper介绍; 2.Closure; 3.带有闭包的方法调用; 4.闭包重要知识点; 5.Gradle tasts 6.Gradle 插件 四.多维度打包 五.Gradle 的工作流程 详细的讲解介绍; 上面截图中的视频可以免费分享,加Android高级开发群;701740775 备注csdn领取Gradle教程
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合Redis,开启缓存,提高访问速度
- 设置Eclipse缩进为4个空格,增强代码规范
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能