android常用地图坐标转换

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);
        }
    }

搜狗坐标转换真实坐标(这方面资料比较少,只找到一个网页端的代码,有兴趣的参考一下,我这里就不贴了)
http://blog.csdn.net/zeeeitch/article/details/51479353

图吧坐标和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'

你可能感兴趣的:(归纳整理)