最近做项目正好需要坐标的转换
- 各地图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 ( "转换成功" ) |