Sistema de coordenadas de la Tierra WGS84, sistema de coordenadas de Marte GCJ02, introducción del sistema de coordenadas Baidu BD09 y recopilación de datos de conversión

Introducción a Wildfire ATGM332D

GPS de alto rendimiento y bajo consumo  , módulo de posicionamiento de modo dual Beidou

Posicionamiento GPS STM32_Para mantener la paz mundial_blog-CSDN Blog

¡Computadora host asistente de depuración multifuncional de Binghuo de código abierto! Un total de seis software, aprende a escupir..., - PC PC- Foro de Wildfire Electronics- ¡Desarrollado por Discuz!
https://www.firebbs.cn/forum.php?mod=viewthread&tid=11985&fromuid=64Baidu

Map API Small Application Ejemplo_Escenario de uso del mapa de Baidu 100 caracteres Blog-CSDN de Student_Haizhimu Blog  Manejar problemas prácticos según la API de Baidu

Cálculo de coordenadas Fórmula de distancia Sistema de coordenadas de Marte_Conversión de coordenadas de mapa: Coordenadas de Marte y coordenadas GPS_Noche oscura Blog de Hunter Vayne-Blog de CSDN

Comparación de sistemas de coordenadas API de mapas nacionales - Rover.Tang - Blog Park
https://www.cnblogs.com/Tangf/archive/2012/03/15/2398397.html

Análisis de protocolo de comunicación y posicionamiento GPS_análisis de protocolo gps_Blog de red neuronal convolucional-Blog CSDN

4. Software de prueba del módulo GPS

El módulo gps se puede probar con el software de prueba u-center, que admite puertos serie y puertos de red.

 

5. Descarga de software relacionado
Dirección de descarga del software Digital Earth: https://download.csdn.net/download/xipengbozai/19774250

Dirección de descarga del software de prueba de GPS: https://download.csdn.net/download/xipengbozai/19774233

Herramienta de conversión de datos GPS: https://download.csdn.net/download/xipengbozai/19774213

Introducción y conversión del sistema de coordenadas de la Tierra WGS84, el sistema de coordenadas de Marte GCJ02, el sistema de coordenadas de Baidu BD09_el sistema de coordenadas wgs84 y el sistema de coordenadas de Baidu_Blog de ThinkWon-Blog de CSDN

Antecedentes: Los datos de posicionamiento obtenidos del GPS y el posicionamiento por satélite Beidou utilizan el sistema de coordenadas WGS84, es decir, el sistema de coordenadas terrestres. Sin embargo, ya sea el mapa de Gaode o el mapa de Baidu en China, el sistema de coordenadas WGS84 no se utiliza, por lo que Debe convertirse antes de poder usarse. , La velocidad de conversión del método front-end proporcionado por la API de Baidu es relativamente lenta. Recopile información a través de la búsqueda en línea y luego escriba el código de prueba usted mismo, resuma el conocimiento sobre la introducción y conversión del sistema de coordenadas y compártalo con todos.
Catálogo de artículos
1. Introducción a cada sistema de coordenadas
2. Conversión de cada sistema de coordenadas
2.1 Clase de entidad de punto de coordenadas
2.2 Clase de herramienta de conversión de cada sistema de coordenadas
3. Prueba
1. Introducción a cada sistema de coordenadas El
sistema de coordenadas WGS84
es el sistema de coordenadas terrestres, un sistema de coordenadas común sistema de coordenadas del mundo.
El dispositivo generalmente contiene un chip GPS o un chip Beidou para obtener la latitud y longitud como el sistema de coordenadas geográficas WGS84. Google Maps utiliza el sistema de coordenadas geográficas WGS84 (a excepción de China, Google China Map utiliza el sistema de coordenadas geográficas GCJ02).

El sistema de coordenadas GCJ02
es el sistema de coordenadas de Marte y el sistema de coordenadas cifrado del sistema de coordenadas WGS84.
Por consideraciones de seguridad nacional, todos los mapas electrónicos de navegación nacional deben utilizar el sistema de coordenadas cifradas formulado por la Oficina Estatal de Topografía y Cartografía, es decir, cifrar una coordenada de latitud y longitud real en una coordenada de latitud y longitud incorrecta.

El sistema de coordenadas BD09
es el sistema de coordenadas cifrado del sistema de coordenadas Baidu y el sistema de coordenadas GCJ02. Se estima que el sistema de coordenadas Sogou, el sistema de coordenadas Tuba, etc. están cifrados sobre la base de GCJ02.

Sistemas de coordenadas utilizados por las principales API de mapas
AutoNavi MapABC API de mapas Coordenadas de Marte
API de mapas de Tencent Soso Coordenadas de Marte
API de mapas de Alibaba Cloud Coordenadas de Marte
Lingtu 51ditu API de mapas de mapas Coordenadas de Marte

API de mapas de Baidu Coordenadas de Baidu
API de mapas de Sohu Sogou Coordenadas de Sogou
MapBar API de mapas de MapBar Coordenadas de MapBar

Aquí hay algunas herramientas de coordenadas en línea de uso común.
Plataforma abierta Gaode
. Baidu elige el sistema de coordenadas.

Herramienta de transformación de coordenadas en línea

2. Conversión de cada sistema de coordenadas.

2.1 Clase de entidad de punto de coordenadas

/**
 * Description: 坐标点
 * 
 * @author JourWon
 * @date Created on 2018年6月19日
 */
public class Point implements Serializable {

	private static final long serialVersionUID = 3584864663880053897L;

	/**
	 * 经度
	 */
	private double lng;

	/**
	 * 纬度
	 */
	private double lat;
	

2.2 Varias herramientas de conversión de sistemas de coordenadas

package com.jourwon.util;

import com.jourwon.pojo.Point;

/**
 * Description: 各坐标系之间的转换工具类
 * 
 * @author JourWon
 * @date Created on 2018年6月19日
 */
public class CoordinateTransformUtils {

	// 圆周率π
	private static final double PI = 3.1415926535897932384626D;
	
	// 火星坐标系与百度坐标系转换的中间量
	private static final double X_PI = 3.14159265358979324 * 3000.0 / 180.0D;

	// Krasovsky 1940
	// 长半轴a = 6378245.0, 1/f = 298.3
	// b = a * (1 - f)
	// 扁率ee = (a^2 - b^2) / a^2;
	
	// 长半轴
	private static final double SEMI_MAJOR = 6378245.0D;
	
	// 扁率
	private static final double FLATTENING = 0.00669342162296594323D;
	
	// WGS84=>GCJ02 地球坐标系=>火星坐标系
	public static Point wgs84ToGcj02(double lng, double lat) {
		if (outOfChina(lng, lat)) {
			return new Point(lng, lat);
		}

		double[] offset = offset(lng, lat);
		double mglng = lng + offset[0];
		double mglat = lat + offset[1];

		return new Point(mglng, mglat);
	}

	// GCJ02=>WGS84 火星坐标系=>地球坐标系(粗略)
	public static Point gcj02ToWgs84(double lng, double lat) {
		if (outOfChina(lng, lat)) {
			return new Point(lng, lat);
		}

		double[] offset = offset(lng, lat);
		double mglng = lng - offset[0];
		double mglat = lat - offset[1];

		return new Point(mglng, mglat);
	}

	// GCJ02=>WGS84 火星坐标系=>地球坐标系(精确)
	public static Point gcj02ToWgs84Exactly(double lng, double lat) {
		if (outOfChina(lng, lat)) {
			return new Point(lng, lat);
		}
		
		double initDelta = 0.01;
		double threshold = 0.000000001;
		double dLat = initDelta, dLon = initDelta;
		double mLat = lat - dLat, mLon = lng - dLon;
		double pLat = lat + dLat, pLon = lng + dLon;
		double wgsLat, wgsLng, i = 0;
		while (true) {
			wgsLat = (mLat + pLat) / 2;
			wgsLng = (mLon + pLon) / 2;
			Point point = wgs84ToGcj02(wgsLng, wgsLat);
			dLon = point.getLng() - lng;
			dLat = point.getLat() - lat;
			if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold))
				break;

			if (dLat > 0)
				pLat = wgsLat;
			else
				mLat = wgsLat;
			if (dLon > 0)
				pLon = wgsLng;
			else
				mLon = wgsLng;

			if (++i > 10000)
				break;
		}

		return new Point(wgsLng, wgsLat);
	}

	// GCJ-02=>BD09 火星坐标系=>百度坐标系
	public static Point gcj02ToBd09(double lng, double lat) {
		double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * X_PI);
		double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * X_PI);
		double bd_lng = z * Math.cos(theta) + 0.0065;
		double bd_lat = z * Math.sin(theta) + 0.006;
		return new Point(bd_lng, bd_lat);
	}

	// BD09=>GCJ-02 百度坐标系=>火星坐标系
	public static Point bd09ToGcj02(double lng, double lat) {
		double x = lng - 0.0065;
		double y = lat - 0.006;
		double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * X_PI);
		double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * X_PI);
		double gcj_lng = z * Math.cos(theta);
		double gcj_lat = z * Math.sin(theta);
		return new Point(gcj_lng, gcj_lat);
	}
	
	// WGS84=>BD09 地球坐标系=>百度坐标系
	public static Point wgs84ToBd09(double lng, double lat) {
		Point point = wgs84ToGcj02(lng, lat);
		return gcj02ToBd09(point.getLng(), point.getLat());
	}

	// BD09=>WGS84 百度坐标系=>地球坐标系
	public static Point bd09ToWgs84(double lng, double lat) {
		Point point = bd09ToGcj02(lng, lat);
		return gcj02ToWgs84(point.getLng(), point.getLat());
	}

	/**
	 * Description: 中国境外返回true,境内返回false
	 * @param lng 	经度
	 * @param lat	纬度
	 * @return
	 */
	public static boolean outOfChina(double lng, double lat) {
		if (lng < 72.004 || lng > 137.8347)
			return true;
		if (lat < 0.8293 || lat > 55.8271)
			return true;
		return false;
	}

	// 经度偏移量
	private static double transformLng(double lng, double lat) {
		double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
		ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
		ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
		ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
		return ret;
	}
	
	// 纬度偏移量
	private static double transformLat(double lng, double lat) {
		double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat
				+ 0.2 * Math.sqrt(Math.abs(lng));
		ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
		ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
		ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
		return ret;
	}
	
	// 偏移量
	public static double[] offset(double lng, double lat) {
		double[] lngLat = new double[2];
		double dlng = transformLng(lng - 105.0, lat - 35.0);
		double dlat = transformLat(lng - 105.0, lat - 35.0);
		double radlat = lat / 180.0 * PI;
		double magic = Math.sin(radlat);
		magic = 1 - FLATTENING * magic * magic;
		double sqrtmagic = Math.sqrt(magic);
		dlng = (dlng * 180.0) / (SEMI_MAJOR / sqrtmagic * Math.cos(radlat) * PI);
		dlat = (dlat * 180.0) / ((SEMI_MAJOR * (1 - FLATTENING)) / (magic * sqrtmagic) * PI);
		lngLat[0] = dlng;
		lngLat[1] = dlat;
		return lngLat;
	}

}

3. Prueba

/**
 * Description: 坐标系转换工具测试类
 * 
 * @author JourWon
 * @date Created on 2018年6月19日
 */
public class CoordinateTransformUtilsTest {

	/**
	 * Description: 地球坐标系 =>火星坐标系、百度坐标系
	 */
	@Test
	public void test01() {
		// 广州市中大地铁站
		Point point = new Point(113.28749670783887D, 23.094783676708065D);
		System.out.println("地球坐标系 : " + point);

		Point wgs84ToGcj02 = CoordinateTransformUtils.wgs84ToGcj02(point.getLng(), point.getLat());
		System.out.println("火星坐标系 : " + wgs84ToGcj02);

		Point wgs84ToBd09 = CoordinateTransformUtils.wgs84ToBd09(point.getLng(), point.getLat());
		System.out.println("百度坐标系 : " + wgs84ToBd09);
	}

	/**
	 * Description: 火星坐标系=>地球坐标系、百度坐标系
	 */
	@Test
	public void test02() {
		// 广州市珠江新城地铁站
		Point point = new Point(113.321171D, 23.119285D);
		System.out.println("火星坐标系 : " + point);

		Point wgs84ToGcj02 = CoordinateTransformUtils.gcj02ToWgs84(point.getLng(), point.getLat());
		System.out.println("地球坐标系 : " + wgs84ToGcj02);

		Point wgs84ToBd09 = CoordinateTransformUtils.gcj02ToBd09(point.getLng(), point.getLat());
		System.out.println("百度坐标系 : " + wgs84ToBd09);
	}

	/**
	 * Description: 百度坐标系=>地球坐标系、火星坐标系
	 */
	@Test
	public void test03() {
		// 广州市体育西路地铁站
		Point point = new Point(113.328035D, 23.136929D);
		System.out.println("百度坐标系 : " + point);

		Point wgs84ToGcj02 = CoordinateTransformUtils.bd09ToWgs84(point.getLng(), point.getLat());
		System.out.println("地球坐标系 : " + wgs84ToGcj02);

		Point wgs84ToBd09 = CoordinateTransformUtils.bd09ToGcj02(point.getLng(), point.getLat());
		System.out.println("火星坐标系 : " + wgs84ToBd09);
	}

}

Enlace de descarga del código completo

Las coordenadas de Baidu deben transferirse primero a GCJ-02 y luego a WGS84.

(1) WGS84: indica las coordenadas obtenidas por GPS;

(2) GCJ02: El sistema de coordenadas del sistema de información geográfica formulado por la Oficina Estatal de Topografía y Cartografía de China . El sistema de coordenadas cifrado por el sistema de coordenadas WGS84;

(3) BD09: sistema de coordenadas Baidu, nuevamente cifrado sobre la base del sistema de coordenadas GCJ02. Entre ellos, BD09II representa las coordenadas de longitud y latitud de Baidu, y BD09MC representa las coordenadas métricas de Baidu Mercator.

public class Transform {
    double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
    double PI = 3.1415926535897932384626;
    double a = 6378245.0;
    double ee = 0.00669342162296594323;
 
    /**
     * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
     * 即 百度 转 谷歌、高德
     * @param bd_lon
     * @param bd_lat
     * @returns {*[]}
     */
    public Point bd09togcj02(double bd_lon, double bd_lat){
        double x = bd_lon - 0.0065;
        double y = bd_lat - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
        double gg_lng = z * Math.cos(theta);
        double gg_lat = z * Math.sin(theta);
        Point point=new Point(gg_lng, gg_lat);
        return point;
    }
 
    /**
     * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
     * 即谷歌、高德 转 百度
     * @param lng
     * @param lat
     * @returns {*[]}
     */
    public Point gcj02tobd09(double lng, double lat){
        double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
        double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
        double bd_lng = z * Math.cos(theta) + 0.0065;
        double bd_lat = z * Math.sin(theta) + 0.006;
        Point point=new Point(bd_lng, bd_lat);
        return point;
    };
 
    /**
     * WGS84转GCj02
     * @param lng
     * @param lat
     * @returns {*[]}
     */
    public Point wgs84togcj02(double lng, double lat){
        double dlat = transformlat(lng - 105.0, lat - 35.0);
        double dlng = transformlng(lng - 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);
        dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
        double mglat = lat + dlat;
        double mglng = lng + dlng;
        Point point=new Point(mglng, mglat);
        return point;
    };
 
    /**
     * GCJ02 转换为 WGS84
     * @param lng
     * @param lat
     * @returns {*[]}
     */
    public Point gcj02towgs84(double lng, double lat){
        double dlat = transformlat(lng - 105.0, lat - 35.0);
        double dlng = transformlng(lng - 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);
        dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
        double mglat = lat + dlat;
        double mglng = lng + dlng;
        Point point=new Point(mglng, mglat);
        return point;
    };
 
 
    private double transformlat(double lng,double lat){
        double ret= -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
        return ret;
    }
 
    private double transformlng(double lng,double lat){
        double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
        return ret;
    }
 
}

Supongo que te gusta

Origin blog.csdn.net/m0_37777700/article/details/132421014
Recomendado
Clasificación