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

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

https://p1-tt-ipv6.byteimg.com/img/pgc-image/ed6aa9cffa3343908a1eab26e4202d95~tplv-tt-shrink:640:0.image

数据的说明

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

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

https://p1-tt-ipv6.byteimg.com/img/pgc-image/9a4b505320514023865f9cab7a24d31e~tplv-tt-shrink:640:0.image

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

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

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

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

https://p1-tt-ipv6.byteimg.com/img/pgc-image/f554ed8dbb5a47cf83a1c2f09d2d25e3~tplv-tt-shrink:640:0.image

只用四色的效果

算法的说明

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

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

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

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

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

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

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

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

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

数据和源代码的获取

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

https://download.csdn.net/download/xiaorang/63345496

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python自动化办公课程配套软件是一款用Python编写的工具,旨在帮助用户提高办公效率并简化日常办公中的重复性工作。该软件提供了丰富的功能和实用的功能模块,以下是它的主要组成部分。 1. 数据处理模块:该模块能够读取和处理各种常见的数据文件,如Excel、CSV等。用户可以方便地进行数据清洗、筛选、排序和计算等操作,大大提高了数据处理的效率。 2. 文件操作模块:该模块包括文件的复制、移动、重命名和删除等功能。用户可以通过简单的命令完成这些操作,节省了繁琐的手动操作时间。 3. 邮件发送模块:该模块能够实现自动化的邮件发送功能。用户可以通过自定义的模板和收件人列表,批量发送邮件,并且可以附件文件和设置发送时间,极大地提高了邮件发送的效率和准确性。 4. 任务调度模块:该模块可以方便地进行任务的定时执行和定时提醒。用户可以根据自己的需求设置任务的执行时间和频率,以及提醒的方式,如邮件、弹窗等。 该软件的源代码文档详细介绍了每个功能模块的实现原理和代码结构,方便用户理解和修改。用户可以根据自己的需求对软件进行二次开发,添加或优化功能,以满足特定的业务需求。 总之,Python自动化办公课程配套软件是一款功能强大且易于使用的工具,帮助用户提高办公效率,简化办公过程,并且提供了源代码文档方便用户进行二次开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圣手书生肖让

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值