Android GPS默认使用的是WGS84坐标系

举报
福州司马懿 发表于 2024/11/29 15:53:24 2024/11/29
【摘要】 原生GPSAndroid GPS默认使用的是WGS84坐标系。WGS84是全球定位系统(GPS)的标准坐标系,也是国际上广泛使用的地理坐标系统。在Android开发中,通过android.location接口获取的经纬度数据通常是以WGS84坐标系为基础 坐标系转换由于不同的地图服务使用不同的坐标系,因此在不同平台之间进行位置数据共享时需要进行坐标转换。例如:WGS84(GPS坐标):国际...

原生GPS

Android GPS默认使用的是WGS84坐标系。WGS84是全球定位系统(GPS)的标准坐标系,也是国际上广泛使用的地理坐标系统。在Android开发中,通过android.location接口获取的经纬度数据通常是以WGS84坐标系为基础

坐标系转换

由于不同的地图服务使用不同的坐标系,因此在不同平台之间进行位置数据共享时需要进行坐标转换。例如:

  • WGS84(GPS坐标):国际公认的世界标准坐标系。
  • GCJ02(国测局坐标):由中国国家测绘局制订的地理信息系统坐标系,由WGS84坐标系经过加密。
  • BD09(百度坐标):百度地图特有的坐标系,在GCJ02基础上再次加密。

在Android开发中,可以通过高德地图API的CoordinateConverter类或自定义算法来实现不同坐标系之间的转换,以确保位置数据的准确

相互转换

几种坐标系之间相互转换的代码如下


import com.tool.android.util.LogUtil;

import java.util.List;

/**
 * WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系(Google Earth使用、或者GPS模块)
 * GCJ02:又称火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系(Google Map、高德、腾讯使用)
 * BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll【L的小写】表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。
 */
public class LocationUtil {
    private static final String TAG = "LocationUtil";
    public static double pi = 3.1415926535897932384626;  
    public static double a = 6378245.0;  
    public static double ee = 0.00669342162296594323;  

    public static Gps wgs84_To_Gcj02(double lat, double lon) {
        LogUtil.i(TAG, "wgs84_To_Gcj02");
        if (outOfChina(lat, lon)) {  
            return null;  
        }  
        double dLat = transformLat(lon - 105.0, lat - 35.0);  
        double dLon = transformLon(lon - 105.0, lat - 35.0);  
        double radLat = lat / 180.0 * 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) * pi);  
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  
        double mgLat = lat + dLat;  
        double mgLon = lon + dLon;  
        return new Gps(mgLat, mgLon);  
    }  

    public static Gps gcj02_To_Wgs84(double lat, double lon) {
        LogUtil.i(TAG, "gcj02_To_Wgs84");
        Gps gps = transform(lat, lon);  
        double lontitude = lon * 2 - gps.getLongitude();
        double latitude = lat * 2 - gps.getLatitude();
        return new Gps(latitude, lontitude);  
    }  

    public static Gps gcj02_To_Bd09(double gg_lat, double gg_lon) {
        LogUtil.i(TAG, "gcj02_To_Bd09");
        double x = gg_lon, y = gg_lat;  
        double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);  
        double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);  
        double bd_lon = z * Math.cos(theta) + 0.0065;  
        double bd_lat = z * Math.sin(theta) + 0.006;  
        return new Gps(bd_lat, bd_lon);  
    }  

    public static Gps bd09_To_Gcj02(double bd_lat, double bd_lon) {
        LogUtil.i(TAG, "bd09_To_Gcj02");
        double x = bd_lon - 0.0065, y = bd_lat - 0.006;  
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);  
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);  
        double gg_lon = z * Math.cos(theta);  
        double gg_lat = z * Math.sin(theta);  
        return new Gps(gg_lat, gg_lon);  
    }

    public static Gps bd09_To_Wgs84(double bd_lat, double bd_lon) {
        LogUtil.i(TAG, "bd09_To_Wgs84");
        Gps gcj02 = LocationUtil.bd09_To_Gcj02(bd_lat, bd_lon);
        Gps map84 = LocationUtil.gcj02_To_Wgs84(gcj02.getLatitude(), gcj02.getLongitude());
        return map84;
    }

    public static Gps wgs84_To_Bd09(double lat, double lon) {
        LogUtil.i(TAG, "wgs84_To_Bd09");
        Gps gcj02 = LocationUtil.wgs84_To_Gcj02(lat, lon);
        Gps bd09 = LocationUtil.gcj02_To_Bd09(gcj02.getLatitude(), gcj02.getLongitude());
        return bd09;
    }
  
    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;  
    }  
  
    public static Gps transform(double lat, double lon) {  
        if (outOfChina(lat, lon)) {  
            return new Gps(lat, lon);  
        }  
        double dLat = transformLat(lon - 105.0, lat - 35.0);  
        double dLon = transformLon(lon - 105.0, lat - 35.0);  
        double radLat = lat / 180.0 * 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) * pi);  
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  
        double mgLat = lat + dLat;  
        double mgLon = lon + dLon;  
        return new Gps(mgLat, mgLon);  
    }  
  
    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(Math.abs(x));  
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;  
        ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;  
        ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * 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(Math.abs(x));  
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;  
        ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;  
        ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0  
                * pi)) * 2.0 / 3.0;  
        return ret;  
    }

    /**
     * 出差记录绘制地图相关方法
     * 经纬度数据格式化
     */
    public static String formatData(String data){
        StringBuilder buffer = new StringBuilder(data.toLowerCase());
        for(int i = 0; i < buffer.length(); i++) {
            if(buffer.charAt(i) == 'l') {
                buffer.setCharAt(i, 'L');
            }
        }
        return buffer.toString();
    }

    /**
     * 根据两点的经纬度计算距离 单位:米
     */
    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        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)));
        double EARTH_RADIUS = 6378.137;
        s = s * EARTH_RADIUS;
        s = Math.round(s * 10000d) / 10000d;
        s = s * 1000;
        return s;
    }

    /**
     * 计算总距离
     */
    public static double countDistance(List<Double> longList, List<Double> latiList) {
        double distance = 0;

        if(longList.size() >= 2){
            for(int i = 0; i < latiList.size() - 1; i++){
                distance = distance + getDistance(latiList.get(i),longList.get(i),latiList.get(i + 1),longList.get(i + 1));
            }

        }

        return distance;
    }

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }
}  
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。