百度地圖API呼叫
百度地圖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,;‘@()*[]")
# 在最後直接追加上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程式碼的檔案