python爬虫_抓取瓦片图片信息并将其拼接_以mapbar为例(适用交通工程类专业)

python爬虫_抓取瓦片图片信息并将其拼接_以mapbar为例(适用交通工程类专业)


爬虫是抓取数据的高效率方法,本次介绍爬取瓦片图片并进行拼接:
瓦片信息就是,类似于拼图,一块块小的拼图本身所含的信息并不多,将所有的拼图碎片全部抓取之后,再将其拼接成完成的拼图,才能运用其中的数据。

瓦片图片主要存在在地图(包含道路交通等等以不同图层layer的方式展现),每块瓦片碎片的大小、类别都是一样的,只是所代表的位置不同罢了。也因此每块瓦片碎片都有它自己的标号来标定当前瓦片的位置(一般是以某种方向的坐标系为准)。
所以,首先解析瓦片标号并构建瓦片所在的坐标系,之后按照一定的范围依次爬取,最后进行拼接就可以得到想要的数据了。流程大概如下:

Created with Raphaël 2.2.0 开始 解析瓦片标号信息和其所在坐标系 找到需要爬取的范围(一般为一个矩形)开始爬 将瓦片按顺序拼接,得到完整的图片数据 结束

这次就以mapbar为例爬取道路交通拥堵情况

在这里插入图片描述
绿色、黄色、红色的线就是北京市的道路交通拥堵情况了,目标是尽可能详细地抓出来然后拼接。

第一步,瓦片标号解析

打开开发者工具F12,进一步放大地图会弹出很多.png格式的图,前面是一连串序号。在network的preview里就能看到图的样子,明显就是道路交通拥堵的图层瓦片。
在这里插入图片描述
这里就直接解析这张图的序列号:o b 16bd l 9bd
这是一个16位进制编码的标号,o为开头,b代表大小层级,16bd是x轴,l为xy轴分隔,9bd是y轴。顺序从左到右,从下到上,典型的xy坐标系啊。
因此大概找了北京等其他城市的大致范围,并将其存到了表格方便依次读取,表格大概长这样:
在这里插入图片描述

df1=pd.read_excel('pic.xlsx',sheet_name='cityinf',header=0,index=False)
data_citypic=df1.values
citynum=data_citypic.shape[0] #city num=42

然后是对坐标解析:

'''xy坐标信息'''
def city_loc(number):
    n=number                            #表格里的序号,代表城市
    city_inf=data_citypic[n,1:4]        #读取需要的信息
    cityname=city_inf[0]
    xy1_16=city_inf[1]
    xy2_16=city_inf[2]                  #16位进制坐标
    x1_16=xy1_16[2:6
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
爬取高德地图数据可以使用`requests`库和`BeautifulSoup`库。首先,需要获取全国地铁列表页面的HTML内容。可以通过以下代码实现: ```python import requests from bs4 import BeautifulSoup url = 'https://ditie.mapbar.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') ``` 接下来,需要从HTML中提取地铁信息。可以通过观察HTML源代码,发现地铁信息保存在`<div class="subway_list">`标签下的`<a>`标签中。可以使用以下代码提取地铁名称和链接: ```python subway_list = soup.find('div', {'class': 'subway_list'}) subways = subway_list.find_all('a') subway_info = [] for subway in subways: name = subway.text link = subway['href'] subway_info.append({'name': name, 'link': link}) ``` 接下来,需要访问每个地铁线路的页面获取地铁站点信息。可以使用以下代码实现: ```python for subway in subway_info: link = subway['link'] response = requests.get(link) soup = BeautifulSoup(response.text, 'html.parser') station_list = soup.find('div', {'class': 'station_list'}) stations = station_list.find_all('a') station_info = [] for station in stations: name = station.text lat = station['lat'] lng = station['lng'] station_info.append({'name': name, 'lat': lat, 'lng': lng}) subway['stations'] = station_info ``` 现在,`subway_info`列表就包含了全国所有地铁线路的信息,每个地铁线路包含它所包含的地铁站点信息。可以将这些信息写入CSV文件中: ```python import csv with open('subway.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['subway', 'station', 'lat', 'lng'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for subway in subway_info: for station in subway['stations']: writer.writerow({ 'subway': subway['name'], 'station': station['name'], 'lat': station['lat'], 'lng': station['lng'] }) ``` 数据可视化可以使用`matplotlib`库和`pandas`库。可以使用以下代码读取CSV文件并创建一个包含所有地铁站点信息的数据框: ```python import pandas as pd df = pd.read_csv('subway.csv') ``` 接下来,可以使用以下代码绘制全国地铁站点分布图: ```python import matplotlib.pyplot as plt plt.figure(figsize=(10, 8)) plt.scatter(df['lng'], df['lat'], s=2, alpha=0.5) plt.title('Subway stations in China') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.show() ``` 可以在地图上看到所有地铁站点的分布情况。如果想要根据地铁线路对站点进行着色,可以使用以下代码: ```python import matplotlib.cm as cm colors = cm.rainbow(df['subway'].factorize()[0] / len(df['subway'].unique())) plt.figure(figsize=(10, 8)) plt.scatter(df['lng'], df['lat'], s=2, alpha=0.5, c=colors) plt.title('Subway stations in China') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.show() ``` 这样可以看到每个地铁线路的站点都被着不同的颜色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值