失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 用Python画填色的中国分省地图(数据+源代码)

用Python画填色的中国分省地图(数据+源代码)

时间:2021-07-18 19:26:48

相关推荐

用Python画填色的中国分省地图(数据+源代码)

前一篇文章提供了中国陆地国界地图的多边形数据,这次将分省的多边形数据及省邻接数据分享给大家。画分省地图,还涉及到填色问题。本文也顺便介绍一下填色算法。

数据的说明

大体来说是每个省一个多边形,中国省级行政区严格来说有34个,但数据提供的多边形是33个。

首先,在地图填色这个问题上,请允许我省略了香港和澳门两个特别行政区。另外,在北京和天津中间有一块河北省飞地,却大到了不能省略的地步。所以河北省包括2个多边形,如下图所示。

给地图填色,有一个基本的规则就是相邻的两个省不能用同一种颜色。所以这里另外有一个信息不得不包含,那就是省与省之间的邻接信息

用python的语义来表达,这个信息用一个字典来表示,每个省是一个键,用一个列表记录了它的所有邻接省。

对于海南岛,认为它与广东相邻;台湾岛,认为它与福建相邻。

如果出现“飞地”这种情况,会导致邻接省变多,甚至于可能导致4种颜色不够填的问题。当然在中国地图上仅河北一块飞地,并没有导致这种问题。虽然4种颜色已经足够了,但为了更好看,在示例图中,我们实际用了5种颜色。只用4色的效果如下,如果你想看更多颜色填图的效果,可以下载并略修改代码。

只用四色的效果

算法的说明

数据中附带了画图的源代码,这次使用的是python自带的tkinter库,所以不用安装任何库就可以直接运行。

代码中包括了读取数据的方法和画多边形的方法,都比较简单。

这里重点介绍一下填色算法。这个算法当然会用到递归。其实凡是用了递归的算法,从概念上都相当简明。

算法是一个函数:填色(setColor),传递三个参数:地图的邻接性信息(以及已填色的区域信息也暂存在其中),可用的颜色列表(避免用全局变量,所以当作参数传递),准备填色的区域。

前两个参数是好理解的,第三个参数,实际上是递归算法的一个标志。

由于填色结果保存在了第一个参数中,所以函数只有一个返回值,就是填色是否成功True/False。

算法的逻辑是这样设计的:

如果这个“准备填色的区域”已经有颜色了,当然就是成功的,直接返回成功True;本区域尚未填色的情况下,查看这个区域周围所有已经填过颜色的邻接区域,那些区域用过的颜色肯定是不能用的。如果在颜色列表中已经没有剩余颜色了,填色失败,返回False;本区域尚未填色,并且在列表中有剩余颜色,那就是有成功的机会了,但究竟填哪个颜色合适呢?用循环的方法,一个一个地试。试的标准就是:周围所有邻接区域都能填色成功。注意:这里就出现递归了;在循环中,给本区域试填列表中剩下的一种颜色,然后逐一给周围尚未填色的邻接区域填色——调用填色算法:setColor——当然这里第三个参数就变成了对应的区域;如果每个邻接区域都返回填色成功(返回True),本区域选择这个颜色也就没有问题了。于是也返回成功True;如果有一个邻接区域无法填色(返回False),就说明本区域不能选择这个颜色,换填循环中的下一个颜色,继续试验。转到步骤4;如果循环之后,无论使用哪个颜色,都无法给本区域成功填色,只能返回填色失败False。在返回之前,把本区域试填的颜色擦除。

具体的实现细节,请感兴趣的朋友看源代码。

数据和源代码的获取

基于深搜的图片填色算法-Python文档类资源-CSDN下载用深搜算法来验证四色问题,使用了一些不便说明的数据,自己下载看,相信是有用的。更多下载资源、学习资料请访问CSDN下载频道./download/xiaorang/63345496

/download/xiaorang/63345496

如果觉得《用Python画填色的中国分省地图(数据+源代码)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。