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