最近做项目正好需要坐标的转换
- 各地图API坐标系统比较与转换;
- WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,
- 谷歌地图采用的是WGS84地理坐标系(中国范围除外);
- GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
- 谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系; BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系;
- 搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的.
然后在csv中将其转化。
最后再在百度地图API上进行检验成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=10923
#代码原地址
import csv
import string
import time
import math
#系数常量
a = 6378245.0
ee = 0.00669342162296594323
x_pi = 3.14159265358979324 * 3000.0 / 180.0 ;
#转换经度
def transformLat(lat,lon):
ret = - 100.0 + 2.0 * lat + 3.0 * lon + 0.2 * lon * lon + 0.1 * lat * lon + 0.2 * math.sqrt( abs (lat))
ret + = ( 20.0 * math.sin( 6.0 * lat * math.pi) + 20.0 * math.sin( 2.0 * lat * math.pi)) * 2.0 / 3.0
ret + = ( 20.0 * math.sin(lon * math.pi) + 40.0 * math.sin(lon / 3.0 * math.pi)) * 2.0 / 3.0
ret + = ( 160.0 * math.sin(lon / 12.0 * math.pi) + 320 * math.sin(lon * math.pi / 30.0 )) * 2.0 / 3.0
return ret
#转换纬度
def transformLon(lat,lon):
ret = 300.0 + lat + 2.0 * lon + 0.1 * lat * lat + 0.1 * lat * lon + 0.1 * math.sqrt( abs (lat))
ret + = ( 20.0 * math.sin( 6.0 * lat * math.pi) + 20.0 * math.sin( 2.0 * lat * math.pi)) * 2.0 / 3.0
ret + = ( 20.0 * math.sin(lat * math.pi) + 40.0 * math.sin(lat / 3.0 * math.pi)) * 2.0 / 3.0
ret + = ( 150.0 * math.sin(lat / 12.0 * math.pi) + 300.0 * math.sin(lat / 30.0 * math.pi)) * 2.0 / 3.0
return ret
#Wgs transform to gcj
def wgs2gcj(lat,lon):
dLat = transformLat(lon - 105.0 , lat - 35.0 )
dLon = transformLon(lon - 105.0 , lat - 35.0 )
radLat = lat / 180.0 * math.pi
magic = math.sin(radLat)
magic = 1 - ee * magic * magic
sqrtMagic = math.sqrt(magic)
dLat = (dLat * 180.0 ) / ((a * ( 1 - ee)) / (magic * sqrtMagic) * math.pi)
dLon = (dLon * 180.0 ) / (a / sqrtMagic * math.cos(radLat) * math.pi)
mgLat = lat + dLat
mgLon = lon + dLon
loc = [mgLat,mgLon]
return loc
#gcj transform to bd2
def gcj2bd(lat,lon):
x = lon
y = lat
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)
bd_lon = z * math.cos(theta) + 0.0065
bd_lat = z * math.sin(theta) + 0.006
bdpoint = [bd_lon,bd_lat]
return bdpoint
#wgs transform to bd
def wgs2bd(lat,lon):
wgs_to_gcj = wgs2gcj(lat,lon)
gcj_to_bd = gcj2bd(wgs_to_gcj[ 0 ], wgs_to_gcj[ 1 ])
return gcj_to_bd;
for i in range ( 3 , 4 ):
n = str ( '2017.040' + str (i) + '.csv' )
m = str ( '2017040' + str (i) + '.csv' )
csvfile = open (m, 'w' ,encoding = 'UTF-8' ,newline = '')
nodes = csv.writer(csvfile)
nodes.writerow([ 'md5' , 'content' , 'phone' , 'conntime' , 'recitime' , 'lng' , 'lat' ])
l = []
with open (n,newline = ' ',encoding=' UTF - 8 ') as f:
reader = csv.DictReader(f)
for row in reader:
if row[ 'md5' ] = = 'md5' :
continue
else :
y = float (row[ 'lng' ])
x = float (row[ 'lat' ])
loc = wgs2bd(x,y)
l.append([row[ 'md5' ],row[ 'content' ],row[ 'phone' ],row[ 'conntime' ],row[ 'recitime' ],loc[ 0 ],loc[ 1 ]])
nodes.writerows(l)
csvfile.close()
print ( "转换成功" )
|