python绘制一份完美的中国地图

本文章小编将带你学会使用python绘制一份完美的中国地图~

昨日,突地被一大早的微博热搜 #自然资源部核查处理问题中国地图# 刷屏,恍惚中看到了近日在追的《亲爱的,热爱的》。小编还沉浸在酣甜的剧情里,今的又有新热搜了!!

作为一家资(jia)深(mao)剧粉,带着欣(ba)喜(gua)的心情浏览的热搜,嗯???好像哪里不对……

第39集中存在的“问题地图”引发广泛关注与讨论。

该剧中使用的地图存在错误表示阿克赛钦和我国藏南地区国界线、我国台湾和海南岛底色与大陆不一致、漏绘我国南海诸岛和南海断续线、克什米尔地区不符合国家有关规定等问题。

不少网友表示,既然是公开播放的剧就该好好审核,制作方与审核方都应该在国家主权上谨慎且坚持一个完整国家的原则。

绝非小题大做!国家版图与国歌、国旗一样,是一个主权国家的重要标志,体现的事一个国家的完整政治主张,绝不仅是一张图画而已。错误的国家地图不仅损害了国家利益,更可怕的是它会向公众传播错误的知识,并弱化公众心中国家完整的这一认知。

经过一番倒腾,小编决定亲手为大家奉上一份使用python绘制的完美的中国地图

下面是又一种我国地图绘制的正确方式!!


进行这个实验你需要有以下的环境:

  • python 3.6 以上

首先安装pyecharts, 默认安装是最新版本的,最新版本的pyecharts需要python3.6以上的版本,在安装好python并将pip加入到环境变量之后:

windows系统 打开cmd输入:

pip install pyecharts

macOS系统 打开terminal输入:

pip install pyecharts

出现 Successfully installed 后就表明 pyecharts 安装完毕。下面我们将教程分成三个部分:

  • 1. 利用pyecharts使用Python画中国地图
  • 2. 在中国地图上标记出 《亲爱的 热爱的》 剧中的地图所缺失的部分
  • 3. 将地图保存成图片
1. 首先是第一步,我们可以试着使用 pyecharts 来绘制一个简单的中国地图

在任意新建的一个文件夹下(注意路径不要有中文),创建 map.py 将以下代码写入:

from pyecharts.charts import Geo

# ->Geo 是函数注解,表示该函数返回值为Geo对象
def geo_effectscatter() -> Geo:
    # 以下为链式调用方法声明对象
    c = (
        Geo()

        # 添加底部地图
        .add_schema(maptype="china")
    )
    return c

# 生成对象
c = geo_effectscatter()

# 渲染地图
c.render()

运行

windows系统:打开cmd,cd 进入当前文件夹,输入下面的指令

python map.py

macOS系统:打开terminal,cd进入当前文件夹,输入上述指令

运行完毕后,你会看见当前目录下有一个render.html生成,使用浏览器打开这个文件便能看见我们的地图啦,代码中有几个值得注意的地方,第一个是:

def geo_effectscatter() -> Geo:

与普通的函数声明不同,其后面带了一个函数注解(->Geo)表明该函数的返回值是Geo对象。

第二个是:

c = (
        Geo()
        .add_schema(maptype="china")
        # 添加底部地图
    )

这个是Python的链式调用,其效果等同于

c = Geo()
c.add_schema(maptype="china")

生成的中国地图如下:

2. 第二步, 在中国地图上标记出 《亲爱的 热爱的》 剧中的地图所缺失的部分

在当前目录下新建文件 map_mark.py

from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType
def geo_effectscatter() -> Geo:

    # 初始化地图参数 page_title: 页面标题, theme: 画布主题(主题列表可见Echarts官网)
    InitOpts = opts.InitOpts(page_title="中国地图", theme="light")
    c = (
        # 声明对象时将初始化参数
        Geo(InitOpts)
        # 添加底部地图
        .add_schema(
            maptype="china")

        # 增加区域点(阿克赛钦和藏南地区)
        .add_coordinate(
            name='阿克赛钦',
            longitude=78.928266,
            latitude=35.115117
        )
        .add_coordinate(
            name='藏南地区',
            longitude=93.128902,
            latitude=27.616436
        )

        # 将剧中地图缺少的地方标记出来
        .add(
            "《亲爱的 热爱的》剧中地图缺少的部分",
            [['海南',100], ['台湾', 100], ['阿克赛钦', 100], ['藏南地区', 100]],
            type_=ChartType.EFFECT_SCATTER,
        )
        # 显示出这个点的标签(formatter={b} 表示显示地区名称,详细可见:
        #  https://pyecharts.org/#/zh-cn/series_options )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter="{b}", font_size=14))

        # 设置地图名称,即左上角
        .set_global_opts(title_opts=opts.TitleOpts(title="中国地图"))
    )
    return c    
# 生成对象
c = geo_effectscatter()

# 渲染地图
c.render()

运行同第一步一样,改个文件名即可,记得不要在路径中包含中文。运行完毕后会在当前目录下生成render.html,使用浏览器打开即可看见地图

效果如下:

3. 第三步,将地图保存成图片

pyecharts 中生成图片有两种方法,一种是selenium方法,还有一种是用phantomjs. 本教程推荐使用 phantomjs.

首先,我们需要安装 snapshot-phantomjs. 同安装echarts一样,打开cmd (Windows) 或者terminal (macOS) 输入以下指令:

pip install snapshot-phantomjs

然后,我们需要前往phantomjs官网下载phantomjs:2.1.1版本下载链接

phantomjs的安装在这里以Windows为例进行讲解:

解压下载的压缩包后,得到phantomjs-2.1.1-windows,里面bin文件夹里的phantomjs.exe就是我们需要的程序,我们需要将其加入到环境变量中。

windows 10在左下角搜索环境变量即可。

windows7则需要如下图所示打开环境变量(windows10 也可以这样打开)

向系统变量的path的后面,加入我们 phantomjs.exe 的路径,比如我的是加入:

C:\Users\Ckend\Downloads\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin

如果你是windows 7系统,记得用;与前一条path隔开。

;C:\Users\Ckend\Downloads\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin

接下来就可以生成图片了,在代码的首部引入我们刚刚的两个包

from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot

最后我们调用生成图片的函数即可

# 生成图片
make_snapshot(snapshot, c.render(), "map.png")

完整代码如下:

from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot

from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType
def geo_effectscatter() -> Geo:

    # 初始化地图参数 page_title: 页面标题, theme: 画布主题(主题列表可见Echarts官网)
    InitOpts = opts.InitOpts(page_title="中国地图", theme="light")
    c = (
        # 声明对象时将初始化参数
        Geo(InitOpts)
        # 添加底部地图
        .add_schema(
            maptype="china")

        # 增加区域点(阿克赛钦和藏南地区)
        .add_coordinate(
            name='阿克赛钦',
            longitude=78.928266,
            latitude=35.115117
        )
        .add_coordinate(
            name='藏南地区',
            longitude=93.128902,
            latitude=27.616436
        )

        # 将剧中地图缺少的地方标记出来
        .add(
            "《亲爱的 热爱的》剧中地图缺少的部分",
            [['海南',100], ['台湾', 100], ['阿克赛钦', 100], ['藏南地区', 100]],
            type_=ChartType.EFFECT_SCATTER,
        )
        # 显示出这个点的标签(formatter={b} 表示显示地区名称,详细可见:
        #  https://pyecharts.org/#/zh-cn/series_options )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter="{b}", font_size=14))

        # 设置地图名称,即左上角
        .set_global_opts(title_opts=opts.TitleOpts(title="中国地图"))
    )
    return c    

# 生成对象
c = geo_effectscatter()

# 渲染地图
c.render()

# 生成图片
make_snapshot(snapshot, c.render(), "map_marked.png")

生成的中国地图可是高清大图,高达7M哦!

你要是愿意,甚至可以更改地图的颜色,标点的颜色,每个区域的颜色,甚至可以细化到省级、市级角度,详细请见官方文档:

pyecharts: https://pyecharts.org

如果你想看更多自定义的方法,请阅读:

echarts原始功能: https://echarts.baidu.com

我们的文章到此结束啦!如果你喜欢我们的文章,请持续关注Python实用宝典哦!请记住我们的官方网站:https://pythondict.com , 公众号:python实用宝典。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注