python 地图经纬度转换、纠偏的实例代码
python地图经纬度转换、纠偏的代码如下所示:
#-*-coding:utf-8-*- importjson importurllib importmath x_pi=3.14159265358979324*3000.0/180.0 pi=3.1415926535897932384626#π a=6378245.0#长半轴 ee=0.00669342162296594323#偏心率平方 classGeocoding: def__init__(self,api_key): self.api_key=api_key defgeocode(self,address): """ 利用高德geocoding服务解析地址获取位置坐标 :paramaddress:需要解析的地址 :return: """ geocoding={'s':'rsv3', 'key':self.api_key, 'city':'全国', 'address':address} geocoding=urllib.urlencode(geocoding) ret=urllib.urlopen("%s?%s"%("http://restapi.amap.com/v3/geocode/geo",geocoding)) ifret.getcode()==200: res=ret.read() json_obj=json.loads(res) ifjson_obj['status']=='1'andint(json_obj['count'])>=1: geocodes=json_obj['geocodes'][0] lng=float(geocodes.get('location').split(',')[0]) lat=float(geocodes.get('location').split(',')[1]) return[lng,lat] else: returnNone else: returnNone defgcj02_to_bd09(lng,lat): """ 火星坐标系(GCJ-02)转百度坐标系(BD-09) 谷歌、高德——>百度 :paramlng:火星坐标经度 :paramlat:火星坐标纬度 :return: """ z=math.sqrt(lng*lng+lat*lat)+0.00002*math.sin(lat*x_pi) theta=math.atan2(lat,lng)+0.000003*math.cos(lng*x_pi) bd_lng=z*math.cos(theta)+0.0065 bd_lat=z*math.sin(theta)+0.006 return[bd_lng,bd_lat] defbd09_to_gcj02(bd_lon,bd_lat): """ 百度坐标系(BD-09)转火星坐标系(GCJ-02) 百度——>谷歌、高德 :parambd_lat:百度坐标纬度 :parambd_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] defwgs84_to_gcj02(lng,lat): """ WGS84转GCJ02(火星坐标系) :paramlng:WGS84坐标系的经度 :paramlat:WGS84坐标系的纬度 :return: """ ifout_of_china(lng,lat):#判断是否在国内 returnlng,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[mglng,mglat] defgcj02_to_wgs84(lng,lat): """ GCJ02(火星坐标系)转GPS84 :paramlng:火星坐标系的经度 :paramlat:火星坐标系纬度 :return: """ ifout_of_china(lng,lat): returnlng,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] defbd09_to_wgs84(bd_lon,bd_lat): lon,lat=bd09_to_gcj02(bd_lon,bd_lat) returngcj02_to_wgs84(lon,lat) defwgs84_to_bd09(lon,lat): lon,lat=wgs84_to_gcj02(lon,lat) returngcj02_to_bd09(lon,lat) 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 returnret def_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 returnret defout_of_china(lng,lat): """ 判断是否在国内,不在国内不做偏移 :paramlng: :paramlat: :return: """ returnnot(lng>73.66andlng<135.05andlat>3.86andlat<53.55) if__name__=='__main__': lng=118.7294833 lat=31.9341833 result1=gcj02_to_bd09(lng,lat) result2=bd09_to_gcj02(lng,lat) result3=wgs84_to_gcj02(lng,lat) result4=gcj02_to_wgs84(lng,lat) result5=bd09_to_wgs84(lng,lat) result6=wgs84_to_bd09(lng,lat) s,v=wgs84_to_bd09(118.7294833,31.9341833) #lng1,lat1=wgs84_to_gcj02(lng,lat) #s,v=gcj02_to_bd09(lng1,lat1) prints,v #printresult1,result2,result3,result4,result5,result6
总结
以上所述是小编给大家介绍的python地图经纬度转换、纠偏的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!