地图——基于python的gis开发与应⽤
新冠病毒疫情地图、GIS和Qt平台
这是沁园春⾥最难的、最核⼼的部分。没有地图,GIS是玩不转的。没有基⽯,如何能建起⾼楼?地图就是gis的基⽯。我的论⽂要义是基于python做gis,所以python成了我的制图⼯具。⽽python是⼀个神奇的语⾔,它的开发者为它和它的忠实编程粉丝设计和开发了各式各样的python包和python库,就只谈制做地图这⽅⾯的包和库就有好⼏种,⽐如matplotlib、folium、basemap、pyplot、cartopy等等。我前⾯也提到了,python 2.X版本在2020年被停⽌维护和升级,⽽作为python 2.X的殉葬品,basemap等包也得不到更新。但是中国⼈⾃⼰研发的pyecharts是开发地图的神器,适⽤于python任何版本⾥,并且我⽤的是python 3.8版本,所以我就⽤它来完成这次的地图制作项⽬。
Pyecharts制作出来的东西是可视化的、有交互性的。Pyecharts输出格式⽬前所知只有两种:分别为html格式和png格式。但是Pyecharts的交互性只能体现在HTML上,⽆法将交互性引⽤到图⽚中,因此pyecharts可以和⼀些web框架联动,这是后话,暂且不在这⾥谈。
另话:制作地图除了像我这样以外,还可以调⽤API来做。像百度地图、⾼德地图等地图制作公司都有相关地图制作开发开放平台,是地图爱好者等⼈的天堂。有了这些API,就可以把python的地图包给省下了,但是要导⼊urllib包、requests包等跟爬⾍相关的包,⽽且这个制图⽅式重点不在python⾝上,⽽是
HTML修改上。所以我没有选择这个⽅法,这个⽅法⽆法体现gis是基于python上。
这⼀步虽说是制作地图,其实不然,地图的制作早就被pyecharts的开发⼈员给做好了,我只需要调⽤它即可,然后再给它附上数据,这就成为了我独创独有的地图。
python怎么读取桌面上的文件我学到两种制图⽅法,但皆有缺点:
其⼀,运⽤爬⾍去爬数据,然后直接调⽤在地图上显⽰。
第⼀步跟爬数据是⼀样的,到⽹站,写下数据包装函数(只写部分重要处):
def catch_cn_disease_dis():
第⼆步调⽤pyecharts的地图函数画出地图并把爬来的数据对应地合在地图上:
def map_cn_disease_dis() -> Map:
Map().title_opts 是给地图命名,设置标题。
Map().visualmap_opts 是给地图整理格式,可以设置最⼤数据范围。
最后⼀步,把地图输出:
Map_cn_disease_dis().render()
render()是pyecharts的输出函数,只可输出pyecharts已设计好的⽹页、图⽚或是notebook(⽐如Jupyter Notebook、Jupyter Lab和Nteract)输出结果。
结果如下图4.14所⽰(该⽰例显⽰的病毒感染状态时间是2020年4⽉30⽇):
图4.14 疫情地图20200430
可以不⽤再写爬数据的代码,但缺点是:当天只能爬当天的数据,之前的数据⼀概爬不到,⽽且我也不可能天天爬。
其⼆,直接读电脑⾥的相关数据⽂件,与地图相合。
第⼀步,除了pyecharts,还要导⼊pandas。Pandas也是⼀个神奇的包。我的数据是存在excel⾥的,⼀般python调⽤excel的数据需要下好⼏个包,⽽且还要根据excel版本不⼀样下对应版本的包。Pandas⼀下⼦就把这些琐碎的杂事解决了,pandas有⼀个excel读取函数,⽆论excel⽂件后⾯点缀是.xlsx还是.xls,皆可以读取调⽤。这个函数是read_excel(),如果被调⽤的excel⾥有多个页表,就需要在该函数内标明是哪个页表,⽤sheet_name=’ ‘来表⽰。以我的代码为例,如下:
data = ad_excel(‘G:/pycharm/Spider/疫情历史数据(个⼈整理,⾮官⽅提供)/疫情数据2019年12⽉.xlsx’,
sheet_name = ‘2019-12-31’ ) #导⼊数据
这个意思是读取G盘⾥pycharm/Spider/疫情历史数据(个⼈整理,⾮官⽅提供)这个⽂件夹⾥的名为“疫情数据2019年12⽉”的excel ⽂件中的名为‘2019-12-31’的页表,因为我在这个excel⽂件⾥设置了很多页表,需要单独提出,不然默认读取的是第⼀个页表或者读取会出错。
第⼆步,将读取的数据转换为⼆元的列表,即和pyecharts⾥地图数据格式相吻合。该列表代码如下所⽰:
List1 = list(zip(data[‘province’], data[‘confirmed’])) #将数据转换成⼆元的列表
我这个excel表⾥有两列,我分别命名为‘province’和‘confirmed’,分别代表中国的省份和各⾃省份确诊⼈数。我就需要这两列数据来做⽂章、做地图、做GIS。
这第三步跟之前的其⼀的第⼆部类似,调⽤Map()⾥的set_global_opts()函数,给地图设置标题、设置数据范围。然后再使⽤add函数添加地图数据和地图类型。如果可以,在做这步之前最好先创建⼀个地图对象,这样做不怎么会出差错。
最后再⽤render()函数输出结果。结果如下图4.15所⽰(该⽰例显⽰的疫情时间是2019年12⽉31⽇):
图4.15 疫情地图20191231
我⽤这个⽅法连续做了⼀百五⼗多个,从2019年12⽉1⽇到2020年4⽉30⽇。
这个⽅法的缺点是:⽆法做到批量化,做这么多张地图,要⼀个⼀个地输⼊excel⽂件名,任务量⾮常
重,且这么做容易出错。
⽬前我没有到解决这个缺点的办法。
其实做到这⾥我就已经完成了我的任务。那些疫情地图基本上算是GIS,属于较简单的。我之前也说了,GIS是数据上的地图。我把数据镶嵌在地图⾥并显⽰出来,就已经做出了⼀个GIS。
但是我不满⾜,我觉得要⽤⼀个东西来衬托它,就像⽤盘⼦来托住⽠果菜蔬。GUI成了我的⾸选。我思来想去,我决定使⽤Qt,虽然这是⼀个C++编程软件,但它和python有联系、有关联,⽽且在python中可⽤GUI编程⾥Qt是最为出众、最受编程者的欢迎,所以我选择了它来制作我的GUI。
Qt制作GUI我在前⾯讲过,这⾥就不重复了。但是我不仅仅是把html⽹页嵌⼊到GUI⾥,我想做⼀个界⾯,⼀个可以直接看不⽌⼀个疫情地图的界⾯。这样就不仅仅是在Qt⾥拖动⼏个组件那么简单,⽽是需要再加⼊信号与槽。信号(Signal)就是⼀种通告,⼀种需要在特定情况下被发射(emit)的通告;⽽槽(Slot)则是对那些信号响应的函数。槽本质上就是⼀个函数,所以它就可以被调⽤。但是槽函数和其他函数不⼀样的地⽅是:槽函数是可以与其中⼀个信号相互关联,所以当发射某个信号那个刹那,与此相关联的对应槽函数会被⾃动执⾏。
别的话不多说了,我直接上图。在Qt⾥除⾮⽤到⾮常复杂的界⾯,不然只需简单操作即可获得⼀般界⾯。如下图4.16:
图4.16 桌⾯疫情界⾯
这张图是⼀个显⽰2020年1⽉1⽇到10⽇疫情地图界⾯的截图。
这个⽅法的短板显露出来了。⽤这个界⾯不能放⼊超过10个HTML页⾯,不然界⾯会⾃动闪退,⽽且如果多次运⾏,电脑会直接⿊屏。我上⽹查资料,发现这个现象被称为“堆栈溢出”,解决的办法涉及到多线程。我觉得好复杂,不如先设置⼀个总界⾯,上⾯有多个按钮,分别对应不同时间段,只是觉得这样做不美观就放弃了,我还是决定另辟蹊径。
Timeline是时间线的意思。Pyecharts的时间线设定仿佛是为了我的需求⽽诞⽣的。我放⼀张pyecharts的tiemline⽰例图4.17和图
4.18:
图4.17 pyecharts的timeline1
图4.18 pyecharts的timeline2
这个案例是关于中国每年各省GDP汇总。这个图例⾥不仅有地图和时间线,还有饼图、柱形图、折线
图和时间线上的轮播(可⾃动播放)。我根据这个案例修改为我需要的。如图4.19所⽰:
图4.19 疫情地图四⽉份
这张图显⽰的是2020年4⽉份每⼀天疫情感染确诊⼈数情况图,其中包括GIS、折线图、柱形图和饼图,⽽且有数据显⽰。
虽然这个timeline⾮常好使,但是也有缺点。细数缺点:
A、⾥⾯的数据需要⼈⼯⼿动⼀个⼀个输⼊进去,⽬前我没有到可以解决的办法。
B、⽬前我只能把⼀个⽉的数据进去,⽆法同时放五个⽉的。因此我为此做了五个不同的timeline。
C、这次做的地图跟之前做的不⼀样,之前那张可以在省的上⽅出现数据,⽽这张不⾏,数据是出现在另外⼀个⼩柱⼦上,有些不⽅便,但是⽬前我改动不了。
这个也可以简单地嵌⼊到PyQt5界⾯⾥,就不赘述了。
使⽤⽅法:
使⽤PyInstaller其实⼗分简单。打开命令提⽰符,把路径改到想要存储⽂件的地⽅(pyinstaller⽣成的⽂件与cmd起始位置息息相关,所以⼀定要选好路径),然后在cmd⾥敲⼊如下指令(举例,我这⾥⽤的源⽂件是pyecharts5.py):
>pyinstaller G:\pycharm\Spider\pyecharts5.py
在执⾏这条指令完成后,会在该⽂件夹下出现两个⽂件夹,分别为dist和build。其中:build是⽤来存储pyinstaller产⽣临时⽂件的⽬录(可安全删除);dist⾥⾯包含可执⾏⽂件(可执⾏⽂件名同源⽂件名⼀样),其余⽂件是该可执⾏⽂件的动态链接库。
我点开后先是出现如cmd类似的界⾯,⽽后才出现源⽂件编写的界⾯。如下图4.20所⽰:
图4.20 打包后的桌⾯端界⾯
由于直接调⽤6.2⾥⽤到的.py⽂件,没有换别的⽂件,得到的结果同6.2的是⼀样的,只是输出⽅式不同,⼀个是pycharm输出,另⼀个是pyinstaller输出。
这个缺点就是运⾏太慢了。我等这个结果等了⼤概2到3分种(也有可能是源代码过于复杂的问题)。
Pyinstaller还有其它有⽤的⽤法,但是这⾥没⽤到,就不多做说明。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论