python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python交互式中国地图选择器

Python利用GeoPandas打造一个交互式中国地图选择器

作者:winfredzhang

在数据分析和可视化领域,地图是展示地理信息的强大工具,被将使用Python、wxPython 和 GeoPandas 构建的交互式中国地图行政区划选择器,感兴趣的可以了解下

在数据分析和可视化领域,地图是展示地理信息的强大工具。它能直观地揭示数据在空间上的分布模式。今天,我将带你深入了解一个使用 PythonwxPythonGeoPandas 构建的交互式中国地图行政区划选择器。这个应用不仅能让你轻松选择省份,还能将选定的区域高亮显示在地图上,并支持导出地图截图和自动保存状态。

C:\pythoncode\new\china_map_app.py

技术栈概览

在深入代码之前,我们先了解一下这个项目使用的主要技术栈:

整个应用的核心思想是:使用 wxPython 构建 GUI 框架,利用 GeoPandas 读取和渲染地图数据,再通过事件绑定将 GUI 按钮操作与地图的重新绘制联系起来。

代码结构分析

我们的应用主要由一个主窗口类 ChinaMapFrame 组成。让我们逐一剖析它的关键部分。

1. __init__ 方法:初始化与状态管理

__init__ 中,我们完成了应用的初始化工作:

class ChinaMapFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="中国地图行政区划选择器", size=(1200, 800))
        
        self.state_file = "map_state.json"
        
        # 定义所有省份列表
        self.provinces = [...] 
        # 定义省份名称映射,以兼容不同地图文件的命名方式
        self.province_mapping = {...}
        
        self.selected_provinces = set()
        self.gdf = None
        self.last_map_file = None # 存储上次加载成功的地图文件路径
        
        self.init_ui()
        self.load_state()
        self.load_geo_data()
        
        self.Bind(wx.EVT_CLOSE, self.on_close)

这里定义了几个重要的实例变量:

load_state()on_close() 方法负责应用的状态持久化。当程序关闭时,save_state() 会将 self.selected_provincesself.last_map_file 保存到 map_state.json 文件中。下次启动时,load_state() 会自动读取这个文件,恢复到上次关闭时的状态,这大大提升了用户体验。

2. init_ui 方法:构建用户界面

init_ui 方法负责构建整个窗口的布局和控件。它使用了 wx.BoxSizerwx.GridSizer 来组织界面。

def init_ui(self):
    # ...
    # 上部分:地图区域,使用 FigureCanvas 承载 Matplotlib 图
    self.figure = Figure(figsize=(12, 8), dpi=80)
    self.canvas = FigureCanvas(panel, -1, self.figure)
    # ...
    # 下部分:按钮区域,使用 GridSizer 布局
    button_sizer = wx.GridSizer(rows=0, cols=6, hgap=5, vgap=5)
    # ...
    # 控制按钮,包括新增的“导出地图”按钮
    control_sizer.Add(load_btn, 0, wx.RIGHT, 10)
    control_sizer.Add(export_btn, 0)
    # ...

这里,FigureCanvasWxAgg 是连接 Matplotlib 图形和 wxPython 窗口的关键桥梁。地图将在 Matplotlib 的 Figure 对象上绘制,并通过 FigureCanvas 呈现在窗口中。

新增的“导出地图”按钮(export_btn)及其事件绑定,为用户提供了保存地图视图的功能。

3. load_geo_data 与 on_load_geo_file:数据加载逻辑

这两个方法是应用的核心数据加载部分。

4. create_map 方法:地图绘制核心

这是地图可视化的核心逻辑。它根据 self.selected_provinces 的状态,为每个行政区划分配不同的颜色,然后调用 GeoPandas 的 plot 方法进行绘制。

def create_map(self):
    if self.gdf is None:
        self.show_no_data_message()
        return

    self.figure.clear()
    ax = self.figure.add_subplot(111)

    colors = []
    # 遍历 GeoDataFrame 的每一行
    for idx, row in self.gdf.iterrows():
        is_selected = False
        province_name = None
        # 尝试匹配不同的列名('name', 'NAME', 'province' 等)
        # ...
        
        # 匹配选中的省份
        if province_name:
            for selected_province in self.selected_provinces:
                # 使用直接匹配和映射匹配,提高兼容性
                # ...
                
        colors.append('#0066FF' if is_selected else '#E6F3FF')

    self.gdf.plot(ax=ax, color=colors, edgecolor='white', linewidth=0.5)
    # ... 绘制图例和标题 ...
    self.canvas.draw()

代码中的一个亮点是它对地图文件列名的鲁棒性。它会尝试匹配多个常见的列名('name', 'NAME', '省份' 等),以确保它能兼容不同来源的 GeoJSON 或 Shapefile 文件。

5. on_province_click 与 on_export_map:交互与导出

on_province_click 负责处理省份按钮的点击事件。它会 toggles(切换)省份在 self.selected_provinces 集合中的状态,并改变按钮的背景颜色,最后调用 create_map 来更新地图视图。

on_export_map 则是新增的导出功能。它使用 wx.FileDialog 弹出保存对话框,然后调用 self.figure.savefig(filepath, dpi=300) 将当前 Matplotlib 的 Figure 保存为高分辨率的 PNG 图片。

如何运行和使用

要运行这个应用,请确保你已经安装了所有必需的库:

pip install wxpython geopandas matplotlib

然后,你需要一个中国行政区划的 GeoJSON 或 Shapefile 文件。你可以在 load_geo_data 方法中指定的几个默认文件名(china.geojson 等),或者在 GitHub 等网站找到类似的文件,然后通过“加载地图文件”按钮导入。

运行脚本后,你会看到一个包含中国地图和所有省份按钮的窗口。你可以:

这个应用是一个很好的例子,展示了如何将多个 Python 库(GUI、地理空间数据、绘图)有机地结合起来,创建一个功能实用且用户友好的桌面工具。通过这种方式,你可以将复杂的数据处理和可视化任务封装在一个直观的界面中,大大降低了非技术人员的使用门槛。

到此这篇关于Python利用GeoPandas打造一个交互式中国地图选择器的文章就介绍到这了,更多相关Python交互式中国地图选择器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文