眾所周知,Python的一個使用場景還是比較多的,在工作當中,也會涉及到多方面的一些事情。那么,今天小編寫這篇文章的一個主要目的,給大家來介紹關于如何用Python完成百度與搞得地圖轉換,下面就給大家詳細介紹下。
一、地理編碼與逆編碼
地理編碼與逆編碼表示的是地名地址與地理坐標(經緯度)互相轉換的過程。其中,將地址信息映射為地理坐標的過程稱之為地理編碼;將地理坐標轉換為地址信息的過程稱之為逆地理編碼。(ps:猜猜我在哪)
地理編碼能對一些只有名稱或地址的數據進行空間化,從而可以開展空間分析和制圖,對于數據分析人員十分重要。
大量地圖廠商都提供了相關的API,可以直接利用這些API進行轉化。國外的如谷歌、esri、osm等,國內的有百度、高德、騰訊等公司,python提供了專業的geopy包集成了這些API調用。
地理處理包將多帶帶研究,本文直接使用高德和百度的開放API進行地理編碼。使用開放API前需要注冊應用獲取KEY
提示:以下是本篇文章正文內容,下面案例可供參考
二、高德地圖地理編碼
詳細信息可參考官方開發文檔,可以看到,請求參數必填的有key和address,其他的根據需要設置
具體代碼如下:
def getGDCor(key,addr): baseUrl='http://restapi.amap.com/v3/geocode/geo?' params={'key':key,##應用key 'address':addr, 'city':u'武漢'##指定城市,限制范圍 } url=baseUrl+urllib.parse.urlencode(params) req=urllib.request.Request(url) content=urllib.request.urlopen(req).read() jsonData=json.loads(content) lon,lat='','' if jsonData['status']=='1': try: corr=jsonData['geocodes'][0]['location'] lon,lat=corr.split(',')[0],corr.split(',')[1] except: lon,lat='0','0' else: print('error') return(lon,lat)
三、百度地圖地理編碼
百度地圖與高德類似,同樣需要注冊應用獲取key,詳細內容參考官網文檔
def getBDCor(ak,addr): #sleep(random.random()) baseUrl='http://api.map.baidu.com/geocoding/v3/?' params={'address':addr, 'city':u'武漢市', 'output':'json', 'ak':ak,##應用key 'callback':'showLocation' } url=baseUrl+urllib.parse.urlencode(params) req=urllib.request.urlopen(url).read().decode()#'utf-8'針對中文需要設施編碼 cont1=req.replace("showLocation&&showLocation(",'') cont=cont1.replace(")",'') jsonData=json.loads(cont) lon,lat=0,0 if jsonData['status']==0: try: lon=jsonData['result']['location']['lng'] lat=jsonData['result']['location']['lat'] except: print(addr) return(lon,lat)
四、坐標轉換和空間化
高德或百度獲取的地理位置都是經過加密的,高德地圖位置使用的是火星坐標,百度地圖是bd-09坐標,與WGS84坐標系間有偏差,通常需要進行轉換。
火星坐標(GCJ-02):國測局坐標,由WGS-84加密而成,國內必須至少使用GCJ-02坐標系,或者使用在GCJ-02加密后再進行加密的坐標系,如百度坐標系。高德和Google在國內都是使用GCJ-02坐標系,可以說,GCJ-02是國內最廣泛使用的坐標系;
百度坐標系是在GCJ-02坐標系的基礎上再次加密偏移后形成的坐標系。
各坐標間可以通過坐標轉換互轉,通常有三參數或七參數法,網上可找到相關的轉換參數,貼一下轉換函數(不知道哪位大神寫的)
import math x_pi=3.14159265358979324*3000.0/180.0 pi=3.1415926535897932384626#π a=6378245.0#長半軸 ee=0.00669342162296594323#扁率 def gcj02_to_bd09(lng,lat): """ 火星坐標系(GCJ-02)轉百度坐標系(BD-09) 谷歌、高德——>百度 :param lng:火星坐標經度 :param lat:火星坐標緯度 :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] def bd09_to_gcj02(bd_lon,bd_lat): """ 百度坐標系(BD-09)轉火星坐標系(GCJ-02) 百度——>谷歌、高德 :param bd_lat:百度坐標緯度 :param bd_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] def wgs84_to_gcj02(lng,lat): """ WGS84轉GCJ02(火星坐標系) :param lng:WGS84坐標系的經度 :param lat:WGS84坐標系的緯度 :return: """ if out_of_china(lng,lat):#判斷是否在國內 return lng,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] def gcj02_to_wgs84(lng,lat): """ GCJ02(火星坐標系)轉GPS84 :param lng:火星坐標系的經度 :param lat:火星坐標系緯度 :return: """ if out_of_china(lng,lat): return lng,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] def bd09_to_wgs84(bd_lon,bd_lat): lon,lat=bd09_to_gcj02(bd_lon,bd_lat) return gcj02_to_wgs84(lon,lat) def wgs84_to_bd09(lon,lat): lon,lat=wgs84_to_gcj02(lon,lat) return gcj02_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 return ret 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 return ret def out_of_china(lng,lat): """ 判斷是否在國內,不在國內不做偏移 :param lng: :param lat: :return: """ return not(lng>73.66 and lng<135.05 and lat>3.86 and lat<53.55)
到此為止,這篇文章就給大家介紹到這里了,希望可以給大家帶來更多的幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128237.html
摘要:高德和在國內都是使用坐標系或在此基礎上面加密為直接的坐標系,可以說,是國內最廣泛使用的坐標系百度坐標系,百度坐標系是在坐標系的基礎上再次加密偏移后形成的坐標系,只適用于百度地圖。 概述 一:在進行地圖開發過程中,我們一般能接觸到以下三種類型的地圖坐標系: 1.WGS-84原始坐標系,一般用國際GPS紀錄儀記錄下來的經緯度,通過GPS定位拿到的原始經緯度,Google和高德地圖定位的的經...
摘要:實際中我們可能會用到不同的地圖,那么就對應到不同坐標系的轉換,比如說,你有一份的數據服務,你要展現在百度或者高德地圖上,這時候你就需要轉換了。 地圖坐標轉換 LBS,基于位置的服務(Location Based Service),近年來已經無處不在,尤其是我們前端,相信或多或少都有接觸一些地圖API服務,比如高德、百度啊、谷歌啊~但是用的時候可能看到下面這些字眼:比如BD09、火星坐標...
摘要:來自侵刪百度坐標轉高德傳入經度緯度高德坐標轉百度傳入經度緯度來自:https://blog.csdn.net/wang415229224ye/article/details/79207791 侵刪//百度坐標轉高德(傳入經度、緯度) function bd_decrypt(bd_lng, bd_lat) { var X_PI = Math.PI * 3000.0 / 180.0; ...
摘要:做過地圖相關開發的同學肯定會遇到這樣一個問題同樣的經緯度坐標,在百度地圖和高德地圖上位置不一樣。解決方案百度地圖以及高德地圖都提供了一些方法來轉換不同坐標系下的坐標,但是它們都需要進行網絡請求,性能很差。 做過地圖相關開發的同學肯定會遇到這樣一個問題:同樣的經緯度坐標,在百度地圖和高德地圖上位置不一樣。showImg(https://segmentfault.com/img/remot...
//百度坐標轉高德(傳入經度、緯度) function bd_decrypt(bd_lng, bd_lat) { var X_PI = Math.PI * 3000.0 / 180.0; var x = bd_lng - 0.0065; var y = bd_lat - 0.006; var z = Math.sqrt(x * x + y * y) - 0.0000...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1983·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02