代码分析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("转换成功")