android 高德地图按照经纬度导航出现路线偏差 原因:坐标系不一致
发布日期:2021-07-01 00:00:03 浏览次数:2 分类:技术文章

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

前言

项目集成了三家加油站的数据 其中两家的导航没有问题 最后一家的导航出现了路线偏差

而且偏差有点严重 不修改是不行的

分析原因

可能是三家加油站用的坐标系不一样导致路线偏差

看了一下接口文档 果然是第三家用的是百度坐标系 而高德用的火星坐标系

1、GCJ-02火星坐标系,国测局02年发布的坐标体系,它是一种对经纬度数据的加密算法,即加入随机的偏差。高德、腾讯、Google中国地图使用。国内最广泛使用的坐标体系;

2、其他坐标体系:一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度的BD-09坐标、搜狗坐标等

解决方法

把百度坐标系转换成高德坐标系就可以了

封装的Utils代码如下

/** * @author lyudony * @date 2020/7/21. * description:坐标系转换工具 */public class GPSUtils {    // 将百度地图经纬度转换为腾讯/高德地图经纬度    @NonNull    public static double[] bd2gd(double lat, double lon) {        try {            if (lat != 0 && lon != 0) {                double var4 = 0.006401062D;                double var6 = 0.0060424805D;                double[] var2 = null;                for (int var3 = 0; var3 < 2; ++var3) {                    var2 = new double[2];                    double var16 = lon - var4;                    double var18 = lat - var6;                    double[] var29 = new double[2];                    double var24 = Math.cos(b(var16) + Math.atan2(var18, var16))                     * (a(var18) + Math.sqrt(var16 * var16 + var18 * var18)) + 0.0065D;                    double var26 = Math.sin(b(var16) + Math.atan2(var18, var16))                     * (a(var18) + Math.sqrt(var16 * var16 + var18 * var18)) + 0.006D;                    var29[1] = (c(var24));                    var29[0] = (c(var26));                    var2[1] = (c(lon + var16 - var29[1]));                    var2[0] = (c(lat + var18 - var29[0]));                    var4 = lon - var2[1];                    var6 = lat - var2[0];                }                return var2;            }        } catch (Throwable var28) {            // ll.a(var28, "OffsetUtil", "B2G");        }        return new double[]{lat, lon};    }    private static double a = 3.141592653589793D;    private static double a(double var0) {        return Math.sin(var0 * 3000.0D * (a / 180.0D)) * 2.0E-5D;    }    private static double b(double var0) {        return Math.cos(var0 * 3000.0D * (a / 180.0D)) * 3.0E-6D;    }    private static double c(double var0) {        return (new BigDecimal(var0)).setScale(8, 4).doubleValue();    }}

使用方法:

double[] dou = GPSUtils.bd2gd(model.getGasAddressLongitude(),  model.getGasAddressLatitude());            sb.append("androidamap://navi?sourceApplication=").append("amap");            sb.append("&name=").append(model.getGasName());            sb.append("&lon=").append(dou[0]) //经度                    .append("&lat=").append(dou[1])//纬度                    .append("&dev=").append("0")                    .append("&stype=").append("0");

如此就可以导航成功了! 如果导航还是出现偏差 请查看我的另一篇博文:

共勉

我要一步一步往上爬

在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天
在这里插入图片描述

转载地址:https://lvshichunqiu.blog.csdn.net/article/details/107494685 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android使用SharedPreferences保存List列表数据
下一篇:java 如何从给定的URL中提取参数 一键封装 方便效率

发表评论

最新留言

很好
[***.229.124.182]2024年04月10日 13时06分19秒