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地图经纬度转换、纠偏的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!