代码分析Python地图坐标转换
最近做项目正好需要坐标的转换
- 各地图API坐标系统比较与转换;
- WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,
- 谷歌地图采用的是WGS84地理坐标系(中国范围除外);
- GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
- 谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系;BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系;
- 搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的.
然后在csv中将其转化。
最后再在百度地图API上进行检验成功
#http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=10923
#代码原地址
importcsv
importstring
importtime
importmath
#系数常量
a=6378245.0
ee=0.00669342162296594323
x_pi=3.14159265358979324*3000.0/180.0;
#转换经度
deftransformLat(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
returnret
#转换纬度
deftransformLon(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
returnret
#Wgstransformtogcj
defwgs2gcj(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]
returnloc
#gcjtransformtobd2
defgcj2bd(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]
returnbdpoint
#wgstransformtobd
defwgs2bd(lat,lon):
wgs_to_gcj=wgs2gcj(lat,lon)
gcj_to_bd=gcj2bd(wgs_to_gcj[0],wgs_to_gcj[1])
returngcj_to_bd;
foriinrange(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=[]
withopen(n,newline='',encoding='UTF-8')asf:
reader=csv.DictReader(f)
forrowinreader:
ifrow['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("转换成功")