背景:
开发一个骑行app,页面是百度导航,演示需要模拟人骑行,位置不断移动。
位置模拟
核心是这个:
for (String provider : mockProviders) {
Location mockLocation = null;
if (location == null) {
mockLocation = new Location(provider);
} else {
mockLocation = new Location(location);
mockLocation.setProvider(provider);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
locationManager.setTestProviderLocation(provider, mockLocation);
}
可以参考下:https://m.xp.cn/b.php/108487.html
我不记得是参考哪篇文章的代码了,文末我附上我的源码,可以直接用的,增加了一些接口。
GPS坐标列表获取
因为需要模拟连续的坐标变化,所以需要整个导航路径的坐标
获取两个点之间路线经纬度数组——https://jsrun.net/9QQKp
使用方法:
步骤1:1位置输入你需要查询的地方,快速定位到地图位置
步骤2:选择起点坐标。点击2位置,然后在地图点击起点位置
步骤3:选择终点位置。同步骤2
步骤4:查询路线,就可以复制最下面的坐标数组了
GPS坐标系转换
上述查询路线地图是高德地图,使用的坐标数组是GCJ-02坐标,而百度地图使用的是BD-09坐标,直接使用会位置不对应。
在线坐标批量转换 https://toolbaba.cn/d/gps
算法转换:
public static double[] gcj2Bd09(double[] gcj) {
double x = gcj[0], y = gcj[1];
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
double ret[] = new double[2];
ret[0] = z * Math.cos(theta) + 0.0065;
ret[1] = z * Math.sin(theta) + 0.006;
return ret;
}
百度地图获取gps坐标
https://api.map.baidu.com/lbsapi/getpoint/index.html
坑记录
1、百度地图网页版的坐标和手机版不对应
百度网页版地图上获取的坐标点,输入到手机版地图上会有偏差,通过记录发现偏差是个固定值
所以获取到的百度网页版本坐标,还需要加上偏差值才能用于手机版本地图上
源码文件
免费下载
https://download.csdn.net/download/JCYAO_/87420186