如何在地图上绘制道路路线图,以北京六环线为例,成果图如下:
首先最重要的是我们需要获取道路坐标点信息,它是由一系列坐标点组成的,这里依托高德地图获取坐标信息。
打开高德地图,搜索“五环”,同时用浏览器抓包,得到道路坐标接口:
可以发现,坐标的数据藏的还是比较隐蔽的,可能也是一种反爬措施,反正我是翻了半天才找到,差点想放弃了。
然后用python代码模拟获取坐标数据值:
import requests
import json
import requests
url = "https://www.amap.com/service/poiInfo"
names=['一环','二环','三环','四环','五环','六环']
datas=[]
for name in names:
querystring = {"query_type":"TQUERY","pagesize":"20","pagenum":"1","qii":"true","cluster_state":"5","need_utd":"true",
"utd_sceneid":"1000","div":"PC1000","addr_poi_merge":"true","is_classify":"true","zoom":"10.59","city":"110000",
"geoobj":"115.714446|39.806938|117.024755|40.037228","keywords":name}
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0",
'Cookie': "cna=C4unE0DWOhkCAW/HM5tXZx6q; isg=BDY2XtDgdVyMNABlY4QxQhMNhGw4V3qR5uyqFKAfIJm049Z9COZtoOOV-zeP0HKp; l=eBPNRte4QBgWGI-jXOfalurza779sIOYYuPzaNbMiOCPs05p5K_AWZJCAZ89Cn1Nh6SwR3yoDYY2BeYBqIYl_XOwsThLxkkmn; tfstk=cFaNB3McbNQZtXg-SVg2cKOWlpHOZ2NgielSjogDD1Ap3fmhi1JxtjhSTj1bKcf..; CNZZDATA1255626299=1693867671-1599310074-https%253A%252F%252Fwww.baidu.com%252F%7C1608342563; _uab_collina=159931078783353165837045; UM_distinctid=17621ccd916b0-0aa3b71503f7838-1a327340-1fa400-17621ccd9174ad; xlly_s=1; x5sec=7b22617365727665723b32223a223536303264653134623164306530663164643861336232393161353761636335434c7a6739663446454d627970376e4f2b706d4d4d513d3d227d; guid=2cf2-47ab-6fb3-87c2",
}
response = requests.request("GET", url, headers=headers, params=querystring)
print(response.text)
data=json.loads(response.text)['data']['poi_list'][0]['domain_list'][3]['value']
datas.append(data)
关键词是keywords,替换关键词可获取其他道路坐标值
另外,爬虫头部信息必须要加入cookie值,否则会返回如下信息,这里也让我纠结了好久:
{"rgv587_flag": "sm", "url": "/service/poiInfo/「「tmd」」/punish?x5secdata=5e0c8e1365474455070961b803bd560607b52cabf5960afff39b64ce58073f78f095b6a70f415eb80daf000cedba5ead38d9a2a0ac48b428a68cd31d3048050015ffd60f48a95c19dbd6de3a68e082d35151e037d30b894fa1b9f0617640df860a901a36bd6d324642091753f1253ec47fad7705c7bf26a7ef1aa109e380a620226c7a04348d1829eb44709e59dd96fc56a6252dd094901cf5724d59b1bb3f0850783758416449fc20e5ee69a797df9be0496fd369fe90d5a5cb0968745f36290175faeaa6a5c62f6416f2833375c81943057e2edd1838e1ccc05f4f01cfb61713b9e53b3a344694df999179f2180f7b845ebbb7c256e077889b653f76774fc4ef6a3cd44835da8eebba31e12701f0db05fb79c9eba41a053d0783c4f8755a7ef89354d8b35a2064c031e0aa24dc52ec0e246fc1aadf9a13035d912254a9314098b7da07ac843b06bd0ece7d88ee7766a0c2fc5986066c12006dff7a464dac6c0267bde1e6164d86ade50c3136c9c7bdf90a4a6c568590b4d523216e455515e120dbf7e795ad9f39bda3014f1fd29ab4c04a64f68838a16b73a9e529c48b847da7952539132824d28f7487e8eadc07b2c39d46574c43341bd01587c34986959900dda199ae2b90e2343a9b2118d076c0837c7ece6e8c8ac12a415226e08a1672afd5701786ef448148b53cf33a433555ec5e5da041851c4b0d3ca278a068777113f639debec32ea20c512cf598832f6ae0c9c53c98ea46bef1df79fc778dcd130315fde51df250f3e894c8b965f0040d1cc73da6391ae5d989dbebc98c10d20aa5153bdc7c776e3494d804651bfb8146e26011be062aa3dedbfdf5eaa1990f1acfa677bcca19e4c0f4533607dab59f68204881fc217951995f7bcd2215ae4ace&x5step=2"}
接着将返回的数据信息整合成folium适用的格式:
results=[]
for data in datas:
result=[]
str_data=data.replace('|','_').split('_')
for i in str_data:
result.append([float(i.split(',')[1]),float(i.split(',')[0])])
results.append(result)
results
然后用folium进行标点
import folium
from folium import plugins
map = folium.Map(location=[39.917834, 116.397036], zoom_start=13, zoom_control='False',
tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',attr='AutoNavi')
incidents = folium.map.FeatureGroup()
for result in results:
for i in result:
incidents.add_child(
folium.CircleMarker( #CircleMarker表示画圆
[i[0], i[1]], #坐标
radius=7, #圆圈半径
color='purple', #标志的外圈颜色
fill=True, #是否填充
fill_color='green', #填充颜色
fill_opacity=0.4 #填充透明度
)
)
map.add_child(incidents)
map
最后用folium的PolyLine进行连线
import folium
from folium import plugins
map = folium.Map(location=[39.917834, 116.397036], zoom_start=13, zoom_control='False',
tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',attr='AutoNavi')
incidents = folium.map.FeatureGroup()
for result in results:
incidents.add_child(
folium.PolyLine( #PolyLine用来连线
result,
color='purple'
)
)
map.add_child(incidents)
map
小结:用这种方法可以做很多有意思的事,例如画行车路线图、画城市主干道路图等等,感兴趣的朋友可以深入研究一下。
在这里还是要推荐下我自己建的Python开发交流学习(qq)群:810735403,群里都是学Python开发的,如果你正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和高级开发教程,欢迎进阶中和想深入Python的小伙伴!