`
萧_瑟
  • 浏览: 160542 次
社区版块
存档分类
最新评论

各地图API坐标系统比较与转换

    博客分类:
  • java
阅读更多
/**
 * 各地图API坐标系统比较与转换;
 * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,谷歌地图采用的是WGS84地理坐标系(中国范围除外);
 * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。谷歌中国地图和搜搜中国地图、高德采用的是GCJ02地理坐标系; 
 * BD09坐标系:即百度坐标系。
 */
public class PositionUtil {
	
	public static final String BAIDU_LBS_TYPE = "bd09ll";
	
	public static double pi = 3.1415926535897932384626;
	public static double a = 6378245.0;
	public static double ee = 0.00669342162296594323;

	/**
	 * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System
	 * 
	 * @param lat
	 * @param lon
	 * @return
	 */
	public static Gps gps84_To_Gcj02(double lat, double lon) {
		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);
	}

	/**
	 * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return
	 * */
	public static Gps gcj_To_Gps84(double lat, double lon) {
		Gps gps = transform(lat, lon);
		double lontitude = lon * 2 - gps.getWgLon();
		double latitude = lat * 2 - gps.getWgLat();
		return new Gps(latitude, lontitude);
	}

	/**
	 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标
	 * 
	 * @param gg_lat
	 * @param gg_lon
	 */
	public static Gps gcj02_To_Bd09(double gg_lat, double gg_lon) {
		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);
	}

	/**
	 * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param
	 * bd_lat * @param bd_lon * @return
	 */
	public static Gps bd09_To_Gcj02(double bd_lat, double bd_lon) {
		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);
	}

	/**
	 * (BD-09)-->84
	 * @param bd_lat
	 * @param bd_lon
	 * @return
	 */
	public static Gps bd09_To_Gps84(double bd_lat, double bd_lon) {

		Gps gcj02 = PositionUtil.bd09_To_Gcj02(bd_lat, bd_lon);
		Gps map84 = PositionUtil.gcj_To_Gps84(gcj02.getWgLat(),
				gcj02.getWgLon());
		return map84;

	}

	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 void main(String[] args) {
//		double lng = 113.595;
//		double lat = 22.7444444;
		double lng = 113.013832;
		double lat = 25.408752;
		// 北斗芯片获取的经纬度为WGS84地理坐标 31.426896,119.496145
		Gps gps = new Gps(lat, lng);
		System.out.println("gps :" + gps);
		Gps gcj = gps84_To_Gcj02(gps.getWgLat(), gps.getWgLon());
		System.out.println("gcj :" + gcj);
		Gps star = gcj_To_Gps84(gcj.getWgLat(), gcj.getWgLon());
		System.out.println("star:" + star);
		Gps bd = gcj02_To_Bd09(gcj.getWgLat(), gcj.getWgLon());
		System.out.println("bd  :" + bd);
		Gps gcj2 = bd09_To_Gcj02(bd.getWgLat(), bd.getWgLon());
		System.out.println("gcj :" + gcj2);
	}
}

 

 

public class Gps {

	private double wgLat;
	private double wgLon;

	public Gps(double wgLat, double wgLon) {
		setWgLat(wgLat);
		setWgLon(wgLon);
	}

	public double getWgLat() {
		return wgLat;
	}

	public void setWgLat(double wgLat) {
		this.wgLat = wgLat;
	}

	public double getWgLon() {
		return wgLon;
	}

	public void setWgLon(double wgLon) {
		this.wgLon = wgLon;
	}

	@Override
	public String toString() {
		return "wgLat:"+wgLat + ",wgLat:" + wgLon;
	}
	
}

 

分享到:
评论

相关推荐

    各地图API坐标系统比较与转换(WGS84坐标系、火星坐标系、百度坐标系、搜狗坐标系、图吧坐标系)

    * 各地图API坐标系统比较与转换; * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); ...

    地图坐标系转换

    * 各地图API坐标系统比较与转换; * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); * ...

    百度地图API地址批量转换坐标(支持Excel上传).zip

    本文将详细探讨“百度地图API地址批量转换坐标”的概念、功能以及如何利用它进行坐标转换,同时也涉及到与之相关的Excel上传和地图撒点功能。 首先,让我们了解什么是百度地图API。百度地图API是百度提供的一套接口...

    GPS坐标系转换以及经纬度距离计算

    % * 各地图API坐标系统比较与转换; % * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, % * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); ...

    各地图API坐标转换,WGS84坐标系,GCJ02坐标系,BD-09百度坐标系等等,下载即用。

    这里的主题聚焦于地图API中的坐标转换,涉及到WGS84、GCJ02和BD-09三种不同的坐标系,这些都是中国及全球范围内广泛使用的坐标系统。 首先,WGS84(World Geodetic System 1984)是全球定位系统(GPS)所采用的标准...

    代码分析Python地图坐标转换

    各地图API坐标系统比较与转换; WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, 谷歌地图采用的是WGS84地理坐标系(中国范围除外); GCJ02坐标...

    百度地图api获取坐标

    2. **反地理编码**:与地理编码相反,将坐标转换为地址的过程。当用户点击地图上的某个位置,我们可以获取到该位置的坐标,然后通过反地理编码得到具体的街道地址。 **三、创建HTML应用** 在提供的`index.html`...

    地理坐标与百度地图坐标转换代码

    在实际应用中,这两个函数可以结合使用,帮助开发者在使用百度地图API时,正确地处理从外部数据源获取的地理坐标,或是在需要将结果显示在其他支持WGS84标准的地图平台上时,将百度地图坐标转换回去。 在Matlab中,...

    js百度地图api坐标地址标注功能.zip

    在本案例中,"js百度地图api坐标地址标注功能"是指利用百度地图API来实现在地图上进行坐标定位并标注地址的功能。这个功能允许用户在地图上看到特定坐标点,并且这些标注可以具有交互性,如拖拽、改变大小、最小化、...

    GPS坐标转换为百度地图坐标(JS)

    百度地图提供了JavaScript API,其中包含了坐标转换的功能。通过引入百度地图的JS库,我们可以直接调用`BMap.Convertor.translate`方法进行坐标转换。这个方法接受一个数组参数,包含待转换的坐标点,以及一个回调...

    坐标系统及相关转换问题处理1

    在C#中,可以调用相应的API进行坐标转换,例如使用proj4sharp库来实现投影转换。转换过程可能需要结合客户提供的转换参数,确保数据准确无误地转换到目标坐标系。 三、数据格式转换 1. SHP到GeoJSON转换 SHAP...

    proj4js实现本地坐标与天地图的转换

    本篇文章将深入探讨proj4js如何帮助我们实现本地坐标与天地图坐标系统的无缝对接,以及如何利用其核心功能来完成坐标转换。 首先,我们要理解proj4js的核心概念。Proj4js基于proj4库,这是一个广泛使用的开源项目,...

    地图坐标与平面坐标的转换

    总的来说,理解和运用ArcEngine进行坐标转换,不仅需要熟悉GIS的基本概念,还要掌握C#编程和ArcEngine API的使用,这样才能有效地进行地图坐标与平面坐标的互换,并在应用中正确地显示这些坐标。

    js腾讯地图api获取坐标位置.zip

    - 接收到位置信息后,可以通过腾讯地图API的接口将这些坐标转换为腾讯地图的坐标系统,以便在腾讯地图上正确显示。 - 最后,使用转换后的坐标在地图上标记出用户的位置,或者执行其他基于位置的操作。 5. **注意...

    百度地图api实现部分功能,根据多个坐标连成轨迹、坐标拾取、实现多个标注点并带信息窗口

    在本文中,我们将深入探讨如何使用百度地图API来实现一系列关键功能,包括连接多个坐标以形成轨迹、坐标拾取、以及创建带有信息窗口的多个标注点。这些功能在Web应用开发、JavaScript工具包、企业应用以及GIS/地图/...

    ios 坐标系转化(各种坐标系互转)

    从 CLLocationManager 取出来的经纬度放到 mapView 上显示,是错误的! 从 CLLocationManager 取出来的经纬度去 Google Maps API 做逆地址解析,当然是错的! 从 MKMapView 取出来的... 灵图51ditu地图API 火星坐标

    地图坐标转换算法

    各地图工具都有坐标转换 API 可用,但是成千上万的 GPS 数据通过 API 转换是一件很消耗资源的事,所以需要提供一种离线转换的方式。 本人在项目中曾也用过 API 转换的方式,但是当设备数量一增加,在坐标转换这一个...

    百度、高德,WGS84坐标批量转换工具

    4. **API调用**:有些工具可能集成了一些地图服务商提供的API,直接通过网络请求实现坐标转换,但这种方法可能会受到API调用次数的限制。 使用"百度、高德,WGS84坐标批量转换工具",用户只需输入或导入包含待转换...

    基于Python的网络地图坐标转换方法研究.pdf

    本研究标题为“基于Python的网络地图坐标转换方法研究”,该研究涉及的关键内容和知识点主要围绕如何使用Python语言进行不同网络地图坐标系统之间的转换。由于不同国家和地区使用的地图坐标系存在差异,为了确保坐标...

    百度地图api实现运动轨迹、坐标拾取、多点标注并显示信息窗体

    百度地图API提供了`geocoding`服务,可以将地址转换为经纬度坐标。使用`Geocoder`类的`getLocation`方法,可以获取到地址对应的地理位置信息,然后创建`Marker`进行标注。如果需要显示多个地址,只需多次调用`...

Global site tag (gtag.js) - Google Analytics