社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

厉害了,我用python精确画出了北京五环

Python爱好者社区 • 5 年前 • 923 次点击  
转自:python数据分析之禅

今天鸟哥教大家如何在地图上绘制道路路线图,以北京六环线为例,成果图如下:

首先最重要的是我们需要获取道路坐标点信息,它是由一系列坐标点组成的,这里依托高德地图获取坐标信息。

打开高德地图,搜索“五环”,同时用浏览器抓包,得到道路坐标接口:

可以发现,坐标的数据藏的还是比较隐蔽的,可能也是一种反爬措施,反正我是翻了半天才找到,差点想放弃了。

然后用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.917834116.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.917834116.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

小结:用这种方法可以做很多有意思的事,例如画行车路线图、画城市主干道路图等等,感兴趣的朋友可以深入研究一下。


感谢阅读

推荐阅读:

1真实的上海IT圈:张江男vs漕河泾男

2:真实的北京IT圈:后厂村姑 vs 后厂村花?

3:为什么你的提问没人解答?

4:Python爱好者社区历史文章合集



重磅!Python交流已成立


公众号运营至今,离不开小伙伴们的支持。
为了给小伙伴们提供一个互相交流的技术平台,特地开通了Python交流群。
群里有不少技术大神,不时会分享一些技术要点,更有一些资源收藏爱好者不时分享一些优质的学习资料。 (免费,不卖课!)
需要进群的朋友,可长按扫描下方二维码。


▲长按扫码

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/106609