1.常用坐标类型

BD09-百度坐标
GCJ-02-火星坐标/国测局坐标/国内坐标/投影坐标
WGS84-国际坐标/GPS坐标/地球坐标/地理坐标

2.坐标常识(自己补充的知识,不想看的跳过)

BD09等时地图厂商通过自己的加密算法再次加密的GCJ-02坐标,和真实坐标约相差百米
GCJ-02是国际加密WGS84坐标,原用于纸质平面地图
WGS84是真实坐标,一般不会直接使用,但所有地图坐标都能与之直接转换。

3.坐标对应地图

  • BD09
    百度地图
  • GCJ-02
    谷歌地图,soso地图,腾讯地图,高德地图,阿里云地图,灵图地图
  • 搜狗坐标
    搜狐搜狗地图
  • 图吧坐标
    图吧地图

4.转换(坐标系转换)

注意,WGS84是真实坐标,此坐标不会被直接使用。

火星坐标和百度坐标的相互转换

以下摘自:​​https://www.2cto.com/kf/201608/537533.html​

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

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

//Gps类
public static class Gps

public double lat;
public double lon;

public Gps(double lon, double lat) {
this.lat = lat;
this.lon = lon;
}

public void print() {
System.out.println(this.lon + "," + this.lat);
}
}

搜狗坐标转换真实坐标(这方面资料比较少,只找到一个网页端的代码,有兴趣的参考一下,我这里就不贴了) ​

图吧坐标和gps坐标的转换没有找到

百度坐标,火星坐标转真实坐标
这是商业机密,有其他人推导的算法,只在知乎上找到了一段python代码,因为不是博客,时效比较短,所以贴一下。可以作为参考:
​​​https://www.zhihu.com/question/55755503/answer/163519277​

import math
import json
#椭球体参数设置
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626 # π
a = 6378245.0 # 长半轴
ee = 0.00669342162296594323 # 扁率
def bd09togcj02(bd_lon, bd_lat):
"""
百度坐标系(BD-09)转火星坐标系(GCJ-02)
:param bd_lat:百度坐标纬度
:param bd_lon:百度坐标经度
:return:转换后的坐标列表形式
"""
x = bd_lon - 0.0065
y = bd_lat - 0.006
z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
gg_lng = z * math.cos(theta)
gg_lat = z * math.sin(theta)
return [gg_lng, gg_lat]

def gcj02towgs84(lng, lat):
"""
GCJ02(火星坐标系)转GPS84
:param lng:火星坐标系的经度
:param lat:火星坐标系纬度
:return:
"""
#if out_of_china(lng, lat):
# return lng, lat
dlat = transformlat(lng - 105.0, lat - 35.0)
dlng = transformlng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * pi
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
mglat = lat + dlat
mglng = lng + dlng
return [lng * 2 - mglng, lat * 2 - mglat]def transformlat(lng, lat):
ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(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 retdef transformlng(lng, lat):
ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(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

lng = 128.543
lat = 37.065
result2 = bd09togcj02(lng, lat)
print result2
#读取位置数据
import xlrdalldata= xlrd.open_workbook(r'C:\Users\Administrator\Desktop\20170321.xlsx')

table = alldata.sheets()[0]
lngall=table.col_values(20)[1:len(table.col_values(20))]
latall=table.col_values(21)[1:len(table.col_values(21))]
#百度坐标转火星坐标
lngcj02=[]
latcj02=[]
for i in range(0,len(lngall)):
temp=bd09togcj02(lngall[i],latall[i])
lngcj02.append(temp[0])
latcj02.append(temp[1])
#火星坐标转WGS84
lng84=[]
lat84=[]
for i in range(0,len(lngcj02)):
temp=gcj02towgs84(lngcj02[i],latcj02[i])
lng84.append(temp[0])
lat84.append(temp[1])
#保存文件
import csv
csvfile=file('C:\Users\Administrator\Desktop\location.csv','wb')
writer = csv.writer(csvfile)
writer.writerow(['longitude','latitude'])
data = [ lng84,lat84]
writer.writerows(data)
csvfile.close()
print 'end'