Android:GPS坐标转高德地图坐标

最近做GPS定位,并且将获得的坐标显示在高德地图上,但是实际效果跟我们期望的是有偏差的。通过查阅资料,才知道有地球坐标、火星坐标之说。


一、坐标分类

地图坐标大致分为几种:

1、GPS、WGS84,也就是原始坐标体系,这是国际公认的世界标准坐标体系;

2、GCJ-02,又称为“火星坐标”,国家测绘局在02年发布的坐标体系,在国内,至少得使用此坐标体系,比如:google、高德、腾讯地图等;

3、其他特殊坐标体系,一般都是由火星坐标通过偏移算法计算得出的,比如百度使用的是BD-09坐标,搜狗使用的是自己的搜狗坐标。


二、坐标转换

1、使用高德地图sdk转换

public AMapLocation fromGpsToAmap(Location location) {
        AMapLocation aMapLocation = new AMapLocation(location);
        CoordinateConverter converter = new CoordinateConverter(mContext);
        converter.from(CoordinateConverter.CoordType.GPS);
        try {
            converter.coord(new DPoint(location.getLatitude(), location.getLongitude()));
            DPoint desLatLng = converter.convert();
            aMapLocation.setLatitude(desLatLng.getLatitude());
            aMapLocation.setLongitude(desLatLng.getLongitude());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return aMapLocation;
    }
但是在我的项目里面,当使用上面方法的高德地图版本的jar包后,编译的时候友盟总是提示我有包冲突,但是经历无数的寻找,都没找出冲突的地方,当我把友盟统计的包引用去掉,编译正常与行了。这里我被友盟坑了,但是必须要保留友盟统计。我只能放弃新的定位包,使用老版本的,也就不能用上面这个方式了。

2、自己转换

通过在网上的搜索,找到一篇文章http://www.eoeandroid.com/forum.php?mod=viewthread&tid=332419,能很好的解决我的问题,也就是我们自己转换坐标,方法如下。

    public AMapLocation fromGpsToAmap(Location location) {
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        latLng = CoordinateUtil.transformFromWGSToGCJ(latLng);
        AMapLocation aMapLocation = new AMapLocation(location);
        aMapLocation.setLatitude(latLng.latitude);
        aMapLocation.setLongitude(latLng.longitude);

        return aMapLocation;
    }

CoordinateUtil.java

public class CoordinateUtil {
    private static double a = 6378245.0;
    private static double ee = 0.00669342162296594323;

    /**
     * 手机GPS坐标转火星坐标
     *
     * @param wgLoc
     * @return
     */
    public static LatLng transformFromWGSToGCJ(LatLng wgLoc) {

        //如果在国外,则默认不进行转换
        if (outOfChina(wgLoc.latitude, wgLoc.longitude)) {
            return new LatLng(wgLoc.latitude, wgLoc.longitude);
        }
        double dLat = transformLat(wgLoc.longitude - 105.0,
                wgLoc.latitude - 35.0);
        double dLon = transformLon(wgLoc.longitude - 105.0,
                wgLoc.latitude - 35.0);
        double radLat = wgLoc.latitude / 180.0 * Math.PI;
        double magic = Math.sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = Math.sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * Math.PI);
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * Math.PI);

        return new LatLng(wgLoc.latitude + dLat, wgLoc.longitude + dLon);
    }

    public static double transformLat(double x, double y) {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
                + 0.2 * Math.sqrt(x > 0 ? x : -x);
        ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x
                * Math.PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0
                * Math.PI)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y
                * Math.PI / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    public static double transformLon(double x, double y) {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
                * Math.sqrt(x > 0 ? x : -x);
        ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x
                * Math.PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0
                * Math.PI)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x
                / 30.0 * Math.PI)) * 2.0 / 3.0;
        return ret;
    }

    public static boolean outOfChina(double lat, double lon) {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    }

}




  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要将 Android GPS 坐标转换高德坐标,可以使用高德地图提供的 Android SDK 中的 AMapLocation 类中的方法。具体步骤如下: 1. 导入高德地图 SDK: 在项目的 build.gradle 文件中添加以下依赖: ``` implementation 'com.amap.api:maps:x.x.x' // 高德地图 SDK implementation 'com.amap.api:location:x.x.x' // 高德定位 SDK ``` 其中 `x.x.x` 为最新版本号,可以在高德开发者平台查看。 2. 获取定位信息: 使用 AMapLocationClient 类获取定位信息,例如: ``` // 创建定位客户端 val locationClient = AMapLocationClient(context) // 设置定位参数 val locationOption = AMapLocationClientOption() locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) // 开始定位 locationClient.startLocation() // 监听定位结果 locationClient.setLocationListener(object : AMapLocationListener { override fun onLocationChanged(location: AMapLocation?) { // 获取定位信息 val latitude = location?.latitude ?: 0.0 val longitude = location?.longitude ?: 0.0 // 将 GPS 坐标转换高德坐标 val amapLocation = AMapLocation("gps") amapLocation.latitude = latitude amapLocation.longitude = longitude val converter = CoordinateConverter(context) converter.from(CoordinateConverter.CoordType.GPS) converter.coord(LatLng(latitude, longitude)) val amapLatLng = converter.convert() val amapLatitude = amapLatLng.latitude val amapLongitude = amapLatLng.longitude // TODO: 处理高德坐标 } }) ``` 3. 处理高德坐标: 获取到高德坐标后,可以将其用于调用高德地图 SDK 中的相关功能,例如显示地图、搜索周边等。 ### 回答2: 要将AndroidGPS坐标转换高德地图坐标,可以按照以下步骤进行操作: 1. 首先,在你的Android项目中添加高德地图SDK的依赖。可以在build.gradle文件中添加以下代码: ``` implementation 'com.amap.api:location-sdk-core:latest-version' implementation 'com.amap.api:map:latest-version' ``` 确保将"latest-version"替换为最新版本号。 2. 在代码中,导入相关的类和包,比如AMapLocationClient、AMapLocationClientOption等。 3. 创建一个AMapLocationClient类的实例,并进行必要的配置,如: ``` AMapLocationClient locationClient = new AMapLocationClient(this); AMapLocationClientOption locationOption = new AMapLocationClientOption(); locationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); locationOption.setOnceLocationLatest(true); ``` 可以根据需求设置定位模式和定位参数。 4. 实现AMapLocationListener接口,并重写其onLocationChanged()方法。在这个方法中,可以获取到当前位置的经纬度信息。 5. 使用高德地图提供的API,将GPS坐标转换高德地图坐标。可以使用AMapUtil类的convertToGcj02()方法,如下所示: ``` LatLng latLng = new LatLng(latitude, longitude); LatLng gcj02LatLng = AMapUtil.convertToGcj02(latLng); ``` 其中,latitude和longitude是从GPS获取的经纬度信息。 6. 最后,使用换后的高德地图坐标进行其他操作,如在地图上显示标注点等。 以上就是将AndroidGPS坐标转换高德地图坐标的基本步骤。通过调用高德地图SDK提供的方法,可以轻松实现坐标换。 ### 回答3: 将Android GPS坐标转换高德坐标需要使用高德地图的开放接口。首先需要在项目中导入高德地图SDK,并在代码中调用相关的接口方法。 Android GPS坐标是使用经纬度表示的,而高德地图使用的是高德坐标系统。因此,需要进行坐标转换才能在高德地图上正确显示位置。 换的具体步骤如下: 1. 引入高德地图的SDK依赖: 通过在项目的build.gradle文件中添加以下依赖,在Android中引入高德地图的SDK: ``` implementation 'com.amap.api:location:latest_version' ``` 2. 创建LocationClient对象: 在代码中创建LocationClient对象来获取GPS坐标数据。 ``` LocationClient mLocationClient = new LocationClient(getApplicationContext()); ``` 3. 实现BDLocationListener接口: 创建一个类实现BDLocationListener接口,并在onReceiveLocation()方法中获取GPS坐标数据。 ``` public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { double longitude = location.getLongitude(); double latitude = location.getLatitude(); // 对获取到的经纬度进行换 convertCoordinate(longitude, latitude); } } ``` 4. 调用坐标转换方法: 在convertCoordinate()方法中,调用高德地图提供的坐标转换接口,将Android GPS坐标转换高德坐标。 ``` public void convertCoordinate(double longitude, double latitude) { CoordinateConverter converter = new CoordinateConverter(); converter.from(CoordinateConverter.CoordType.GPS); converter.coord(new LatLng(latitude, longitude)); LatLng desLatLng = converter.convert(); // 获取换后的高德坐标 double desLongitude = desLatLng.longitude; double desLatitude = desLatLng.latitude; // 在高德地图上显示换后的坐标 // ... } ``` 完成以上步骤后,即可将Android GPS坐标成功换为高德坐标,并在高德地图上显示位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值