具體程式碼
import urllib.request, urllib.parse, urllib.error
import json
import hashlib
import numpy as np
import pandas as pd
MyAK = 'sIWgaZ4ypVeGYGwnMPfUDB1FHV0dLgtC'
MySK = 'GucWw7tIwOzHvlwWyloQHNLqzc8iAb2U'
lat=0.0
lng=0.0
#處理得到url
def get_url(name):
#GET請求 http://api.map.baidu.com/geocoding/v3/?address=北京市海淀區上地十街10號&output=json&ak=您的ak&callback=showLocation
queryStr = '/geocoding/v3/?address={}&output=json&ak={}'.format(name,MyAK)
# 對queryStr進行轉碼,safe內的保留字元不轉換
encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
# 在最後追加sk
rawStr = encodedStr + MySK
# 計算sn
sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
#由於URL裡面含有中文,所以需要用parse.quote進行處理,然後返回最終可呼叫的url
url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
#print('URL:', url)
return url
#得到json資料
def get_json(url):
# 從API讀取資料
req = urllib.request.urlopen(url)
res = req.read().decode()
# 解析資料
try:
# 將 JSON 物件轉換為 Python 字典
json_data = json.loads(res)
except:
json_data = "地址未知"
if not json_data or 'status' not in json_data or json_data['status'] != 0:
print('json資料獲取失敗',json_data['status'])
'''else:
#輸出Json資料
print(json.dumps(json_data, indent=4, ensure_ascii=False))'''
return json_data
# 獲取經緯度座標
def get_lnglat(json_data):
#Python中定義函式時,若想在函式內部對函式外的變數進行操作,就需要在函式內部宣告其為global
global lat,lng
lat = json_data["result"]["location"]["lat"]
lng = json_data["result"]["location"]["lng"]
#print('緯度', lat, '經度', lng)
def get_url2(lat,lng):
#GET請求 http://api.map.baidu.com/reverse_geocoding/v3/?ak=您的ak&output=json&coordtype=wgs84ll&location=31.225696563611,121.49884033194
queryStr = '/reverse_geocoding/v3/?ak={}&output=json&coordtype=wgs84ll&location={},{} '.format(MyAK,str(lat),str(lng))
# 對queryStr進行轉碼,safe內的保留字元不轉換
encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
# 在最後追加sk
rawStr = encodedStr + MySK
# 計算sn
sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
#由於URL裡面含有中文,所以需要用parse.quote進行處理,然後返回最終可呼叫的url
url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
#print('URL:', url)
return url
# 解析Json資料
def get_info(json_data):
if json_data != "地址未知":
province=json_data["result"]["addressComponent"]["province"]
city=json_data["result"]["addressComponent"]["city"]
district=json_data["result"]["addressComponent"]["district"]
# adcode=json_data["result"]["addressComponent"]["adcode"]
# print("地理:",province+city+district)
result = province+city+district
else:
result = json_data
return result
# print("行政程式碼:"+adcode)
if __name__ == '__main__':
#得到經緯度
# 讀取csv檔案單位地區資料
df = pd.read_csv("D:/12140/Desktops/111/222/test002.csv",encoding='utf-8')
data = df[['單位名稱']]
data = data.fillna("0")
data_array = np.array(data.stack()) # 首先將pandas讀取的資料轉化為array
data_list = data_array.tolist() # 然後轉化為list形式
#print(data_list)
print(len(data_list))
# 將各個單位名稱儲存為一個列表形式
url = []
for i in range(0,len(data_list)):
result =data_list[i]
#print(result)
url.append(result)
print(url)
rr = []
for i in range(0,len(url)):
uu = get_url(url[i])
json_data = get_json(uu)
if json_data['status'] != 1:
lnglat = get_lnglat(json_data)
uu2 = get_url2(lat,lng)
json_data = get_json(uu2)
# get_info(json_data)
m = get_info(json_data)
# print("result ",m)
rr.append(m)
df['地域維度'] = rr
df.to_csv("D:/12140/Desktops/111/222/test0031.csv", index=False)
print("地域維度清洗成功!")
效果展示