以下是详细讲解“百度地图、高德地图、Google地图等坐标系相关梳理的完整攻略”:
百度地图、高德地图、Google地图等坐标系相关梳理
在使用地图相关的应用程序时,经常需要涉及到坐标系的转换。不同的地图服务提供商使用不同的坐标系,因此需要进行坐标系的转换。本攻略将介绍百度地图、高德地图、Google地图等常用地图服务提供的坐标系,并提供坐标系转换的示例。
坐标概述
坐标系是用于描述地球表面位置的一种数学模型。常用的坐标系包括经纬度坐标系和平面坐标系。经纬度坐标系是用经度和纬度来描述地球表面位置的坐标系,常用于全球范围内的位置描述。平面坐标系是用平面坐标来描述地球表面位置的坐标系,常用于局部范围内的位置描述。
百度地图坐标系
百地图使用的是BD-09坐标系,也称为百度坐标系。BD-09坐标系是在GCJ-02坐标系的基础上进行了加密和偏移处理得到的。因此,如果需要将其他坐标系的坐标转换为百度坐标系,需要先将其转换为GCJ-02坐标系,然后再进行加密和偏移处理。
高德地图坐标系
高德地图使用的是GCJ-02坐标系,也称为火星坐标系。GCJ-02坐标系是在WGS-84坐标系的基础上进行了加密和偏移处理得到的。因此,如果需要将其他坐标系的坐标转换为高德坐标系,需要先将其转换为WGS-84坐标系,然后再进行加密和偏移处理。
Google地图坐标系
Google地图使用的是WGS-84坐标系,也称为全球卫星定位系统坐标系。WGS-84坐标系是一种全球通用的坐标系,常用于全球范围内的位置描述。
坐标系转换示例
下面是将经纬度坐标转换为百度坐标系和高德坐标系的示例:
将纬度坐标转换为百度坐标系
from math import pi, cos, sin, sqrt, atan2
def bd_encrypt(lng, lat):
x_pi = pi * 3000.0 / 180.0
x = lng
y = lat
z = sqrt(x * x + y * y) + 0.00002 * sin(y x_pi)
theta = atan2(y, x) + 0.000003 * cos(x * x_pi)
bd_lng = z * cos(theta) + 0.0065
bd_lat = z * sin(theta) + 0.006
return bd_lng, bd_lat
将经纬度标转换为高德坐标系
from math import pi, cos, sin, sqrt, atan2
def gcj_encrypt(lng, lat):
x_pi = pi * 3000.0 / 180.0
a = 6378245.0
ee = 0.00669342162296594323
d_lat = transform_lat(lng - 105.0, lat - 35.0)
d_lng = transform_lng(lng - 105.0, lat - 35.0)
rad = lat / 180.0 * pi
magic = sin(rad_lat)
magic = 1 - ee * magic * magic
sqrt_magic = sqrt(magic)
d_lat = (d_lat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * pi)
d_lng = (d_lng * 180.0) / (a / sqrt_magic * cos(rad_lat) * pi)
mg_lat = lat + d_lat
mg_lng = lng + d_lng
return mg_lng, mg_lat
def transform_lat(lng, lat):
x_pi = pi * 3000.0 / 180.0
a = 6378245.0
ee = 0.00669342162296594323
d_lat = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * sqrt(abs(lng))
d_lat += (20.0 * sin(6.0 * lng * pi) + 20.0 * sin(2.0 * lng * pi)) * 2.0 / 3.0
d_lat += (20.0 * sin(lat * pi) + 40.0 * sin(lat / 3.0 * pi)) * 2.0 / 3.0
d_lat += (160.0 * sin(lat / 12.0 * pi) + 320 * sin(lat * pi / 30.0)) * 2.0 / 3.0
return d_lat
def transform_lng(lng, lat):
x_pi = pi * 3000.0 / 180.0
a = 6378245.0
ee = 0.00669342162296594323 d_lng = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * sqrt(abs(lng))
d_lng += (20.0 * sin(6.0 * lng * pi) + 20.0 sin(2.0 * lng * pi)) * 2.0 / 3.0
d_lng += (20.0 * sin(lng * pi) + 40.0 * sin(lng / 3.0 * pi)) * .0 / 3.0
d_lng += (150.0 * sin(lng / 12.0 * pi) + 300.0 * sin(lng / 30.0 * pi)) * 2.0 / 3.0
return d_lng
示例一:将百度坐标系转换为WGS-84坐标系
from math import pi, cos, sin, sqrt, atan2
def bd_decrypt(bd_lng, bd_lat):
x_pi = pi * 3000.0 / 180.0
x = bd_lng - 0.0065
y = bd_lat - 0.006
z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi)
theta = atan2(y, x) - 0.000003 * cos(x * x_pi)
lng = z * cos(theta)
lat = z * sin(theta)
return lng, lat
示例二:将高德坐标系转换为WGS-84坐标系
from math import pi, cos, sin, sqrt, atan2
def gcj_decrypt(gcj_lng, gcj_lat):
x_pi = pi * 3000.0 / 180.0
a = 6378245.0
ee = 0.00669342162296594323
d_lat = transform_lat(gcj_lng - 105.0, gcj_lat - 35.0)
d_lng = transform_lng(gcj_lng - 105.0, gcj_lat - 35.0)
rad_lat = gcj_lat / 180.0 * pi
magic = sin(rad_lat)
magic = 1 - ee * magic * magic
sqrt_magic = sqrt(magic)
d_lat = (d_lat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * pi)
d_lng = (d_lng * 180.0) / (a / sqrt_magic * cos(rad_lat) * pi)
mg_lat = gcj_lat + d_lat
mg_lng = gcj_lng + d_lng
return mg_lng, mg_lat
总结
以上是百度地图、高德地图、Google地图等常用地图服务提商的坐标系相关梳理,以及坐标系转换的示例。在使用地图相关的应用程序时,需要根据具体的求选择合适的坐标系,并进行坐标系的转换。同时,需要注意坐标系转换的精度和稳定性,以确保转换的准确无误。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:百度地图、高德地图、google地图等坐标系相关梳理 - Python技术站