日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全球地区资料json 含中英文 经纬度_爬虫实战(三)使用百度API获取经纬度/地址...

發(fā)布時間:2024/4/13 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全球地区资料json 含中英文 经纬度_爬虫实战(三)使用百度API获取经纬度/地址... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
點擊上方“藍字”關注我們百度API獲取經(jīng)緯度/地址Mar 28, 2020

本期介紹給定地址/經(jīng)緯度,使用百度API來獲取經(jīng)緯度/地址。

本文約3k字,預計閱讀18分鐘。

本次是第三篇爬蟲實戰(zhàn),這一次只是涉及最基礎的爬蟲知識,只需要會調(diào)用「requests包」即可完成該項目。

起因:因為論文需要,將獲取的1000多個地址轉化為經(jīng)緯度以便后續(xù)計算,我嫌使用別人的工具麻煩,因此自己寫了個簡單的函數(shù)來獲取經(jīng)緯度,現(xiàn)在拿出來分享下。

不同的API地圖的坐標系標準各有不同:

谷歌地圖采用的是WGS84地理坐標系(中國范圍除外),谷歌中國地圖采用的是GCJ02地理坐標系,百度采用的是BD09坐標系,而設備一般包含GPS芯片或者北斗芯片獲取的經(jīng)緯度為WGS84地理坐標系,為什么不統(tǒng)一用WGS84地理坐標系這就是國家地理測繪總局對于出版地圖的要求,出版地圖必須符合GCJ02坐標系標準了,也就是國家規(guī)定不能直接使用WGS84地理坐標系。(具體內(nèi)容自行查閱,本次我們使用百度API)

獲取AK

首先我們打開百度API開放平臺,注冊/登陸自己的賬號,成為百度開發(fā)者,在「應用管理」--- 「我的應用」中創(chuàng)建應用,如下所示:

在「創(chuàng)建應用」中輸入「應用名稱」,并且「請求校驗方式」選擇「IP白名單交驗」,這里我們不使用「sn校驗方式」,因為需要計算sn,并且為了方便,IP白名單選擇了“0.0.0.0/0”,不對IP進行限制(這里是為了Debug,如果想要上線,請設置合理的IP白名單),然后提交即可。

在「我的應用」中出現(xiàn)如下應用:

「訪問應用(AK)」是我們所需的。

獲取地址對應的經(jīng)緯度---地理編碼

查看百度開放平臺中的「開發(fā)文檔」---「Web服務API」,選擇「地點輸入提示」---「地理編碼」,我們可以找到地理編碼接口的url:

完整的請求參數(shù)如下:

參數(shù)名參數(shù)含義類型舉例默認值是否必須
address待解析的地址。最多支持84個字節(jié)string
city地址所在的城市名。string北京市
ak用戶申請注冊的key,自v2開始參數(shù)修改為“ak”string
output輸出格式為json或者xmlstringjson或xmlxml

主要的返回結果參數(shù)為:

名稱含義類型
status返回結果狀態(tài)值, 成功返回0,其他值請查看下方返回碼狀態(tài)表。int
location經(jīng)緯度坐標(包含lng和lat)object
precise位置的附加信息,是否精確查找。1為精確查找;0為不精確。int
level能精確理解的地址類型,包含:UNKNOWN、國家、省、城市、區(qū)縣、鄉(xiāng)鎮(zhèn)、村莊等string

接下來我們使用「request包」爬取對應的json內(nèi)容:

def BaiduQuery(address, currentkey): """ :param address: address :param currentkey: AK """ url = 'http://api.map.baidu.com/geocoding/v3/?' params = { "address": address, "city": '北京市', "output": 'json', "ak": currentkey, } response = requests.get(url, params=params) answer = response.json()

以北京東四地區(qū)為例,執(zhí)行函數(shù):

BaiduQuery('東四', currentkey="sLTKStSk6QGaAK2XriSseziy9FghVXkV")

得到的json結果如下:

{'status': 0, 'result': {'location': {'lng': 116.43043084078596, 'lat': 39.93757214936878}, 'precise': 0, 'confidence': 50, 'comprehension': 100, 'level': '商圈'}}

分析json數(shù)據(jù),我們需要的內(nèi)容應該是「result」中的「location」中的「lng(經(jīng)度)」和「lat(緯度)」,當然你也可以獲取其他信息。

查詢該經(jīng)緯度:

結果正確!

結合上述分析,最終我們的代碼如下:

def geocoding(address, currentkey): """ address convert lat and lng :param address: address :param currentkey: AK :return: places_ll """ url = 'http://api.map.baidu.com/geocoding/v3/?' params = { "address": address, "city": '北京市', "output": 'json', "ak": currentkey, } response = requests.get(url, params=params) answer = response.json() if answer['status'] == 0: tmpList = answer['result'] coordString = tmpList['location'] coordList = [coordString['lng'], coordString['lat']] places_ll.append([address, float(coordList[0]), float(coordList[1])]) print([address, float(coordList[0]), float(coordList[1])]) else: return -1

地址:

l?=?['東四', '天壇',?'官園',?'萬壽公園',?'奧體中心', '農(nóng)展館','萬柳',?'北部新區(qū)',?'豐臺花園',??'云崗',??'石景山古城',?'房山',?'大興','亦莊',??'通州',??'順義',??'昌平',??'門頭溝',???'平谷',??'懷柔','密云',??'延慶',??'定陵',??'八達嶺',???'密云水庫',??'東高村',?'永樂店',?'榆垡',???'琉璃河',?'前門',?'永定門內(nèi)',???'西直門北',???'南三環(huán)',?'東四環(huán)']

結果:

['東四', 116.430431, 39.937572]['天壇', 116.419342, 39.888663]['官園', 116.37293, 39.933926]['萬壽公園', 116.37434, 39.885845]['奧體中心', 116.406138, 39.990549]['農(nóng)展館', 116.473398, 39.943151]...['南三環(huán)', 116.38953, 39.864106]['東四環(huán)', 116.494326, 39.895722]

注意:

地址的名字相當關鍵,當你自己使用百度地圖時,輸入地址,百度會幫你進行「聯(lián)想修正」,但你通過百度API進行查找時,地址不匹配的話,它會返回一個默認的經(jīng)緯度:116.413384,39.910925,這里我舉例北京市的地區(qū),要是限定其他地區(qū),返回的默認經(jīng)緯度可以自行測試(看經(jīng)緯度相同的數(shù)量)。舉例:

「萬壽公園」這個地名我之前得到的是「萬壽西宮」,結果無法匹配,查找資料后,才知道在百度地圖上匹配的是萬壽公園。

可以通過比較經(jīng)緯度的方法,人工進行地名的修正(其他方法沒有想到,我自己查找了1000多條地名,自己修正了400多例)

獲取經(jīng)緯度對應的地址---逆地理編碼

查看「全球逆地理編碼」,我們可以找到逆地理編碼接口的url:

http://api.map.baidu.com/reverse_geocoding/v3/?ak=您的ak&output=json&coordtype=wgs84ll&location=31.225696563611,121.49884033194 //GET請求

主要的請求參數(shù)為:

參數(shù)名參數(shù)含義類型舉例默認值是否必須
location根據(jù)經(jīng)緯度坐標獲取地址。float
ak用戶申請注冊的key,自v2開始參數(shù)修改為“ak”string
output輸出格式為json或者xmlstringjson或xmlxml

主要的返回參數(shù):

名稱含義類型
status返回結果狀態(tài)值, 成功返回0,其他值請查看下方返回碼狀態(tài)表。int
location經(jīng)緯度坐標object
formatted_address結構化地址信息string

代碼如下:

def reverse_geocoding(lng, lat, currentkey): """ lat and lng convert address :param lng: longitude :param lat: latitude :param currentkey: AK :return: places_ll """ url = 'http://api.map.baidu.com/reverse_geocoding/v3/?' params = { "location": str(lat)+','+str(lng), "output": 'json', "ak": currentkey, "coordtype": "wgs84ll", } response = requests.get(url, params=params) answer = response.json() if answer['status'] == 0: tmpList = answer['result'] address = tmpList['formatted_address'] print([lng, lat, address]) places_ll.append([address, lng, lat]) else: return -1

以東四的經(jīng)緯度為例,json結果為:

{'status': 0, 'result': {'location': {'lng': 116.44318395258946, 'lat': 39.94483923411242}, 'formatted_address': '北京市東城區(qū)東中街16號', 'business': '東四,東直門,東四十條', 'addressComponent': {'country': '中國', 'country_code': 0, 'country_code_iso': 'CHN', 'country_code_iso2': 'CN', 'province': '北京市', 'city': '北京市', 'city_level': 2, 'district': '東城區(qū)', 'town': '', 'town_code': '', 'adcode': '110101', 'street': '東中街', 'street_number': '16號', 'direction': '附近', 'distance': '23'}, 'pois': [], 'roads': [], 'poiRegions': [], 'sematic_description': '', 'cityCode': 131}}

最后輸出:

[116.430431, 39.937572, '北京市東城區(qū)東中街16號']Github

GitHub地址:https://github.com/BlackSpaceGZY/Crawler

往期精彩回顧今日頭條爬蟲實戰(zhàn)----爬取圖片
嗶哩嗶哩爬蟲實戰(zhàn)----驗證碼識別掃碼關注更多精彩

總結

以上是生活随笔為你收集整理的全球地区资料json 含中英文 经纬度_爬虫实战(三)使用百度API获取经纬度/地址...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。