百度地圖API調用
這次主要用到的是地理編碼服務
1. 什么是地理編碼服務
1.1 介紹
地理編碼服務(又名Geocoder)是一類Web API接口服務;
地理編碼服務提供將結構化地址數據(如:北京市海淀區上地十街十號)轉換為對應坐標點(經緯度)功能;
地理編碼服務當前未推出國際化服務,解析地址僅限國內;
白話說就是把一個地點的經度和緯度返回
1.2 功能介紹
用戶可通過該功能,將結構化地址(省/市/區/街道/門牌號)解析為對應的位置坐標。地址結構越完整,地址內容越准確,解析的坐標精度越高。
lng: 經度 lat: 緯度
2. 使用流程
2.1 注冊開發者
http://lbsyun.baidu.com/apiconsole/center
填寫完信息后, 郵箱會收到一條激活開發者的郵件, 點擊激活即可.
2.2 創建應用
http://lbsyun.baidu.com/apiconsole/key#/home
應用名稱可以隨便填寫, 請求校驗方式為IP白名單校驗/當然你也可以用sn校驗方式, 但是sn后面還要寫代碼獲取sn
所以這里我就省事用ip白名單校驗. 0.0.0.0/0
代表任何ip都可以訪問.
2.3 閱讀官方文檔
http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
http://api.map.baidu.com/geocoding/v3/?address=北京市海淀區上地十街10號&output=json&ak=您的ak&callback=showLocation
注意: 網上很多教程都是老版本的接口了, 老用戶可以使用但是新用戶不可以, 所以這一點一定要注意一下.
具體參數, 返回值, 以及狀態碼我就不一一介紹了, 詳情請看官方文檔.
2.4 實例代碼
如果你已經是一個經常寫接口的老司機了, 那么這段話你可以選擇不看, 主要是大致講解一些關於接口的一些白話.
首先這個接口的作用是返回一個地點的經緯度, 那么這個經緯度的查詢是誰做的呢? 就是這個接口做的事. 你可以
把接口想象成一個人, 這個人只會最一件事, 那就是你告訴他一個地點,他告訴你這個地點的經緯度. 具體這個人是
怎么實現的, 這你就不需要考慮了.
# 只需要把 ak=你創建應用的ak 改為你自己應用的ak就行了
import requests
import json
import re
# 獲取用戶輸入的地點
region = input('請輸入你要查詢的地點:').strip()
# api接口
url = f'http://api.map.baidu.com/geocoding/v3/?address={region}&output=json&ak=你創建應用的ak&callback=showLocation'
# 發送get請求
response = requests.get(url=url)
# 解析數據
result = re.findall(r'showLocation&&showLocation\((.*?)\)', response.text,re.S)[0]
data = json.loads(result)
# 獲取 經度 緯度
lng = data['result']['location']['lng']
lat = data['result']['location']['lat']
level = data['result']['level']
print('{} 經度:{} 緯度:{} 行業:{}'.format(region, lng, lat, level))
查看應用ak
如果返回的狀態碼為 240 建議重新創建一個應用即可
3.補充
3.1 sn校驗
如果有朋友選擇了sn檢驗方式 就需要查看一下sn的校驗方法
官方文檔: http://lbsyun.baidu.com/index.php?title=lbscloud/api/appendix
這時你不但需要 ak 還需要 sk
請求的url是:
http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak&sn=7de5a22212ffaa9e326444c75a58f9a0
//后面的sn就是要計算的,sk不需要在url里出現,但是在計算sn的時候需要sk(假設sk=yoursk) 下面提供java、PHP、C#、python 2.7的參考代碼。
3.2 計算sn
看到這里你肯定會說我pycharm都打開了,你給我看python2.7 ?
python 2.7參考代碼如下:
# -*- coding: utf-8 -*-
# 第一行必須有,否則報中文字符非ascii碼錯誤
import urllib
import hashlib
# 以get請求為例http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak
queryStr = '/geocoder/v2/?address=百度大廈&output=json&ak=yourak'
# 對queryStr進行轉碼,safe內的保留字符不轉換
encodedStr = urllib.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
# 在最后直接追加上yoursk
rawStr = encodedStr + 'yoursk'
# md5計算出的sn值7de5a22212ffaa9e326444c75a58f9a0
# 最終合法請求url是http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak&sn=7de5a22212ffaa9e326444c75a58f9a0
print hashlib.md5(urllib.quote_plus(rawStr)).hexdigest()
還好我准備了python3的實例代碼:
# -*- coding: utf-8 -*-
# 第一行必須有,否則報中文字符非ascii碼錯誤
import urllib.request, urllib.parse, urllib.error
import hashlib
# 以get請求為例http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak
queryStr = '/geocoder/v2/?address=百度大廈&output=json&ak=你的ak'
# 對queryStr進行轉碼,safe內的保留字符不轉換
encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
# 在最后直接追加上yoursk
rawStr = encodedStr + '你的sk'
# md5計算出的sn值7de5a22212ffaa9e326444c75a58f9a0
# 最終合法請求url是http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak&sn=7de5a22212ffaa9e326444c75a58f9a0
print(hashlib.md5(urllib.parse.quote_plus(rawStr).encode()).hexdigest())
ok到這里就結束了, 只需要那把 url 改為你的 url 即可
3.3 關與py2轉py3
不知道你好奇不好奇我是怎么將py2的代碼轉成py3的, 實際上很多官方文檔里面的示例代碼還是python2.X代碼,
當然有的也能直接在python3上運行, 但是為了保證萬無一失, 最好還是轉成python3
這里采用的是python3自帶的一個內置模塊2to3.py
上教程:
-
切換到你的python安裝路徑下找到 Tools/scripts/2to3.py
-
復制2to3.py到你需要轉換代碼的同目錄下
如: 這里我想把demo.py中的py2代碼轉換成python3代碼
-
命令行/pycharm的Terminal 切換到這兩個文件的路徑下
-
執行命令 python 2to3.py -w demo.py 即可
-
新生成一個文件
這時 demo.py中代碼就是python3的代碼了, demo.py.bak是原python2代碼的文件