(题图来自于网络)
有这么一个需求:要得到某个区域的边缘坐标点。本文就带领大家一起来实现这个需求。
step1 需求分析
我们需要获取某个区域的范围,在百度地图上刚好有这个区域的范围,通过查阅百度地图查询得到区域边缘的源代码后,发现边缘点保存在js文件中,我们可以利用Python中的json包,把这些js信息解析出来,进而保存下来。(下图为百度地图上标识的区域,以我的母校为例),经过分析网页源码,发现区域边缘上的点,保存在一个js页面当中。(浏览器F12可查看网页源码)
step2 数据抓取
首先导入需要使用的Python库,介绍一下这些库的作用
requests :根据url将网页源代码下载下来
json :用来将网页中的js内容转换为Python字典类型
re :正则表达式库,用于提取网页中满足一定规律的内容(比如本案例中的经纬度信息)
-
pandas :Python中操作结构化数据的程序库,能够实现几乎所有Excel的数据操作功能,本例中,用来结构化经纬度数据
获取区域的uid
先查看抓取到的uid,这些16进制的字符串是构造用于抓取经纬度信息的一部分,经过验证,发现选择其中第一个字符串即可。
我们可以先来查看通过其中第一个字符串抓取到的情况
'{"content":{"geo":"4|12618225.7275,2634141.50233;12620436.14,2635744.10819|1-12618229.2366,2634972.26759,12618225.7275,2635002.28594,12618227.1548,2635005.75909,12618263.5817,2635013.24391,12618295.9275,2635082.51963,12618301.8005,2635082.54492,12618306.1276,2635141.32619,12618269.1117,2635143.4825,12618264.6473,2635174.57984,12618259.351,2635219.88318,12618568.2984,2635230.62723,12618556.9761,2635367.12823,12618566.7501,2635380.12539,12618593.2436,2635391.57514,12618878.5036,2635441.67687,12618'
为了看起来更加直观,也便于,稍后将经纬度信息提取出来,我们使用json库将这些数据转换成Python字典类型
'4|12618225.7275,2634141.50233;12620436.14,2635744.10819|1-12618229.2366,2634972.26759,12618225.7275,2635002.28594,12618227.1548,2635005.75909,12618263.5817,2635013.24391,12618295.9275,2635082.51963,12618301.8005,2635082.54492,12618306.1276,2635141.32619,12618269.1117,2635143.4825,12618264.6473,2635174.57984,12618259.351,2635219.8 ........
再使用正则表达式来提取经纬度信息,并循环取出其中的每一组经纬度,并把它们转换成数值型。
将得到的这个列表转换为pandas的DataFrame,并给每列命名
以下为tableau绘制的结果:
由于百度地图展示的坐标和真实的坐标之前有偏移,所以抓取得到的坐标还需要进一步进行转换才可以,因为坐标是整体偏移的,绘制出的区域形状是没有问题的,如果是用这些数据来求区域面积,也是没有问题的。如果都使用百度坐标,判断点是否在区域内,也是可以的,前提是都必须使用百度坐标。
今天就写到这儿吧! |