Android GPS默认使用的是WGS84坐标系
【摘要】 原生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)