library("magrittr")
library("jsonlite")
dizhi = c('北京市朝陽區望京東路6號望京國際研發園三期','北京市海淀區上地信息路9號奎科科技大廈')

將地址解析為具體的經緯度:

GetJD <- function(address){
url = "http://api.map.baidu.com/geocoder/v2/"
header <- c("User-Agent"="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36")
payload = list(
'output' = 'json',
'ak' = '***********'
)
addinfo <- data.frame()
for (i in dizhi){
payload[["address"]]=i
tryCatch({
web <- GET(url,add_headers(.headers = header),query = payload)
content <- web %>% content(as="text",encoding="UTF-8") %>% fromJSON(flatten = TRUE) %>% [[(2) %>% [[(1) addinfo <- rbind(addinfo,content) },error = function(e){ cat(sprintf("任務【%s】處理失敗!",i),sep = "\n") addinfo <- rbind(addinfo,list("lng" = NA ,"lat" = NA)) }) Sys.sleep(runif(1)) print(sprintf("正在抓取第【%s】個地址",i)) } print("所有數據全部抓取完畢!!!") return(addinfo) }

運行程序:

system.time(myresult<-GetJD(dizhi))

lng lat
116.4955 40.01256
116.3130 40.04769

地址逆解析——將經緯度還原為具體地址

待解析的經緯度指標

lddata = data.frame(
lon = c(39.934,40.013,40.047),
lat = c(116.329,116.495,116.313)
)

解析函數

GetAddress <- function(lddata){
url = "http://api.map.baidu.com/geocoder/v2/"
header = c('User-Agent'= 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36')
payload = list(
'output' = 'json',
'ak' = '*******'
)
addinfo = c()
for (i in 1:nrow(lddata)){
payload[['location']] = sprintf('%.3f,%.3f',lddata[i,'lon'],lddata[i,'lat'])
tryCatch({
web <- GET(url,add_headers(.headers = header),query = payload)
addinfo <- web %>% content(as="text",encoding="UTF-8") %>% fromJSON(flatten = TRUE) %>%[[(2) %>%[[`(2) %>% c(addinfo,.)
},error = function(e){
cat(sprintf(“第【%d】個任務處理失敗!”,i),sep = “\n”)
addinfo <- c(addinfo,NA)
})

}
return(addinfo)
}
運行逆解析程序
system.time( MyAddress<-GetAddress(lddata))
'北京市海淀區增光路35-6號' '北京市朝陽區望京東路輔路' '北京市海淀區上地五街9號'

Python版:

import  time
import requests
from urllib.request import quote
#待解析的地址
dizhi = ['北京市朝陽區望京東路6號望京國際研發園三期','北京市海淀區上地信息路9號奎科科技大廈']

地址解析函數——將地址轉換為經緯度

def getid(dizhi):
url = "http://api.map.baidu.com/geocoder/v2/"
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}
payload = {
'output':'json',
'ak':'**********'
}
addinfo = []
for i in dizhi:
payload['address'] = i
try:
content = requests.get(url,params=payload,headers=header).json()
addinfo.append(content['result']['location'])
except:
pass
return(addinfo)

運行解析程序

if __name__ == "__main__":
#計時開始:
t0 = time.time()
myaddress = getid(dizhi)
t1 = time.time()
total = t1 - t0
print("消耗時間:{}".format(total))

[{'lat': 40.012564990769135, 'lng': 116.49546484496102},
{'lat': 40.04768803728198, 'lng': 116.31300123279135}]

地址逆解析——經緯度解析為具體地址

lon = [39.934,40.013,40.047]
lat = [116.329,116.495,116.313]
lddata = [(j,w) for j,w in zip(lon,lat)]

解析函數

def GetAddress(lddata):
url = "http://api.map.baidu.com/geocoder/v2/"
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}
payload = {
'output':'json',
'ak':'*********'
}
addinfo = []
for lon,lat in lddata:
payload['location'] = '{0:s},{1:s}'.format(str(lon),str(lat))
try:
content = requests.get(url,params=payload,headers=header).json()
addinfo.append(content['result']['formatted_address'])
except:
addinfo.append(None)
return(addinfo)

運行程序

if __name__ == "__main__":    
#計時開始:
t0 = time.time()
mylonlat = GetAddress(lddata)
t1 = time.time()
total = t1 - t0
print("消耗時間:{}".format(total))
['北京市海淀區增光路35-6號', '北京市朝陽區望京東路輔路', '北京市海淀區上地五街9號']

文章轉自微信公眾號@數據小魔方

上一篇:

PHP+Mysql實現百度地圖API打點標記

下一篇:

基于.net8在 ASP.NET Core 中掌握 API Key 密鑰身份驗證
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費