背景:現(xiàn)有一個(gè)需求仲闽,需要根據(jù)道路的名稱獲取到道路上所有特征點(diǎn)的經(jīng)緯度,以串聯(lián)成線顯示道路
首先想到的是調(diào)用地圖廠商如高德或者百度現(xiàn)有的webapi僵朗,能夠直接返回理想的數(shù)據(jù)赖欣,但是翻遍了這些廠商的api都沒(méi)有發(fā)現(xiàn),搜索之下有篇2020年的帖子說(shuō)調(diào)用高德隱api可以滿足要求:
http://restapi.amap.com/v3/road/roadname?city=020&key=<用戶的key>&keywords=元崗路
但是實(shí)測(cè)下來(lái)會(huì)報(bào)錯(cuò)權(quán)限問(wèn)題验庙,如圖
說(shuō)明高德確實(shí)是有這個(gè)api的顶吮,但是因?yàn)闄?quán)限問(wèn)題被禁用了,故詢問(wèn)了一下客服不能調(diào)用的原因或者怎樣可以滿足調(diào)用條件粪薛,得到回復(fù)該接口已經(jīng)不對(duì)外開(kāi)放c擦恕!违寿!
那么就沒(méi)有辦法了嗎湃交?并不是,既然高德的官網(wǎng)是可以實(shí)現(xiàn)這樣子的功能的話藤巢,就說(shuō)明他們是有自己的api在用的搞莺,嘗試在高德官網(wǎng)搜索道路
發(fā)現(xiàn)官方是可以實(shí)現(xiàn)的,那么我們打開(kāi)開(kāi)發(fā)者模式看看他們是怎么請(qǐng)求的掂咒,這里不得不說(shuō)藏的很深才沧!
可以看到在poiinfo接口下有一個(gè)看著像是我們想要的數(shù)據(jù):
我們把數(shù)據(jù)拷貝出來(lái)看一下
這一個(gè)個(gè)就很像我們需要的經(jīng)緯度啊,是不是I芄巍温圆?
但是細(xì)看會(huì)發(fā)現(xiàn),這些經(jīng)緯度是被|
和_
分割開(kāi)的孩革,如果他倆的作用是一樣的岁歉,為啥不用同樣的字符分割?但是我們也不知道人家這樣做的意圖是什么樣子的嫉戚,所以只能先按照相同的作用做分割,把數(shù)據(jù)分割好之后是這個(gè)樣子的:
有那個(gè)意思了澈圈,導(dǎo)入到項(xiàng)目里面一看彬檀,蒙了,連起來(lái)是個(gè)啥啊瞬女,一條路連起來(lái)像個(gè)蜘蛛網(wǎng)窍帝,當(dāng)時(shí)沒(méi)截圖大家可以腦補(bǔ)一下
開(kāi)玩笑的,這邊項(xiàng)目不方便透露诽偷,寫(xiě)了個(gè)demo來(lái)按照點(diǎn)的順序展示點(diǎn)坤学,發(fā)現(xiàn)數(shù)據(jù)順序是錯(cuò)亂的
毫無(wú)章法是不是疯坤?這指定是有問(wèn)題的,想來(lái)就是點(diǎn)的順序有問(wèn)題深浮,那么就是數(shù)據(jù)分割的有問(wèn)題压怠,重新來(lái)梳理過(guò):
1、先根據(jù)|
分割數(shù)組
發(fā)現(xiàn)了沒(méi)飞苇,基本上每一段數(shù)據(jù)的起點(diǎn)都是另一段數(shù)據(jù)的終點(diǎn)菌瘫,intersting,那么有沒(méi)有可能根據(jù)這個(gè)規(guī)律拼接起來(lái)就對(duì)了布卡?
2雨让、將對(duì)應(yīng)的上的路段首尾相連,理想情況應(yīng)該可以連成一條路段數(shù)據(jù)忿等,但是有時(shí)候發(fā)現(xiàn)有的路段首尾都沒(méi)有相連的其他路段栖忠,不要慌張,正常的贸街,如果是雙向道路或者一些奇怪的交叉道路庵寞,確實(shí)就應(yīng)該就多條連不起來(lái)的數(shù)據(jù)的。
3匾浪、再把上一步獲得的多條路段數(shù)據(jù)分別用
_
分割皇帮,再次導(dǎo)入demo中,完美蛋辈!這邊查詢的道路不一樣属拾,抱歉,但是就是這么個(gè)效果冷溶,到這邊我們就拿到了目標(biāo)道路上的所有點(diǎn)
但是這樣手動(dòng)拼接分割的操作有點(diǎn)過(guò)于的反人類
所以寫(xiě)了個(gè)簡(jiǎn)易的python腳本處理數(shù)據(jù):
import sys
def main(args):
array = args.split('|')
for i in range(len(array)):
original = array[i]
for j in range(len(array)):
originalArray = original.split('_')
compare = array[j]
compareArray = compare.split('_')
if originalArray[0] == compareArray[len(compareArray) - 1]:
originalNew = originalArray
del originalNew[0]
array[i] = '@@@@@'
array[j] = compare + '_' + '_'.join(originalNew)
while '@@@@@' in array:
array.remove('@@@@@')
result = []
for i in range(len(array)):
locationArray = []
locationStrArray = array[i].split('_')
for item in locationStrArray:
lnglat = item.split(',')
locationArray.append([float(lnglat[0]), float(lnglat[1])])
result.append(locationArray)
print(result)
if __name__ == '__main__':
main(sys.argv[1])
臨時(shí)寫(xiě)的渐白,沒(méi)考慮啥性能,莫笑逞频,最終的效果就是傳入從高德官網(wǎng)扒下來(lái)的字符串直接輸出二維路線經(jīng)緯度數(shù)組
最后說(shuō)兩句
該思路僅供個(gè)人使用纯衍,請(qǐng)勿用作商業(yè)用途
適合少量數(shù)據(jù)研究學(xué)習(xí)使用,如果批量獲取數(shù)據(jù)也不建議直接使用腳本爬取官方網(wǎng)站苗胀,給網(wǎng)站增加負(fù)擔(dān)襟诸,可聯(lián)系商務(wù)洽談?wù){(diào)用事宜