最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python利用GeoPandas打造一個交互式中國地圖選擇器

 更新時間:2025年08月12日 08:18:56   作者:winfredzhang  
在數(shù)據(jù)分析和可視化領(lǐng)域,地圖是展示地理信息的強大工具,被將使用Python、wxPython 和 GeoPandas 構(gòu)建的交互式中國地圖行政區(qū)劃選擇器,感興趣的可以了解下

在數(shù)據(jù)分析和可視化領(lǐng)域,地圖是展示地理信息的強大工具。它能直觀地揭示數(shù)據(jù)在空間上的分布模式。今天,我將帶你深入了解一個使用 PythonwxPythonGeoPandas 構(gòu)建的交互式中國地圖行政區(qū)劃選擇器。這個應(yīng)用不僅能讓你輕松選擇省份,還能將選定的區(qū)域高亮顯示在地圖上,并支持導(dǎo)出地圖截圖和自動保存狀態(tài)。

C:\pythoncode\new\china_map_app.py

技術(shù)棧概覽

在深入代碼之前,我們先了解一下這個項目使用的主要技術(shù)棧:

  • wxPython:一個用于創(chuàng)建圖形用戶界面(GUI)的跨平臺 Python 庫。它提供了豐富的控件和事件處理機制,是構(gòu)建桌面應(yīng)用的利器。
  • GeoPandas:一個強大的庫,它擴展了 Pandas 的功能,使其能夠處理地理空間數(shù)據(jù)。你可以把它看作是 Pandas 的地理空間版,可以方便地讀取、操作和繪制 GeoJSON、Shapefile 等格式的地理數(shù)據(jù)。
  • Matplotlib:Python 中最流行的繪圖庫之一。GeoPandas 依賴它來完成地圖的繪制。
  • Python 標(biāo)準(zhǔn)庫:包括 json(用于讀寫應(yīng)用狀態(tài))和 os(用于文件路徑操作)。

整個應(yīng)用的核心思想是:使用 wxPython 構(gòu)建 GUI 框架,利用 GeoPandas 讀取和渲染地圖數(shù)據(jù),再通過事件綁定將 GUI 按鈕操作與地圖的重新繪制聯(lián)系起來。

代碼結(jié)構(gòu)分析

我們的應(yīng)用主要由一個主窗口類 ChinaMapFrame 組成。讓我們逐一剖析它的關(guān)鍵部分。

1. __init__ 方法:初始化與狀態(tài)管理

__init__ 中,我們完成了應(yīng)用的初始化工作:

class ChinaMapFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="中國地圖行政區(qū)劃選擇器", 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)

這里定義了幾個重要的實例變量:

  • self.provinces:一個包含所有中國省份、自治區(qū)和直轄市的列表。
  • self.selected_provinces:一個 set 集合,用于高效地存儲當(dāng)前選中的省份,方便添加和刪除。
  • self.gdf:GeoPandas 的核心數(shù)據(jù)結(jié)構(gòu),用于存儲從 GeoJSON 或 Shapefile 文件加載的地理數(shù)據(jù)。
  • self.last_map_file:這是一個關(guān)鍵改進(jìn)!它記錄了上一次成功加載的地圖文件路徑,以便應(yīng)用下次啟動時能自動加載。

load_state()on_close() 方法負(fù)責(zé)應(yīng)用的狀態(tài)持久化。當(dāng)程序關(guān)閉時,save_state() 會將 self.selected_provincesself.last_map_file 保存到 map_state.json 文件中。下次啟動時,load_state() 會自動讀取這個文件,恢復(fù)到上次關(guān)閉時的狀態(tài),這大大提升了用戶體驗。

2. init_ui 方法:構(gòu)建用戶界面

init_ui 方法負(fù)責(zé)構(gòu)建整個窗口的布局和控件。它使用了 wx.BoxSizerwx.GridSizer 來組織界面。

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

這里,FigureCanvasWxAgg 是連接 Matplotlib 圖形和 wxPython 窗口的關(guān)鍵橋梁。地圖將在 Matplotlib 的 Figure 對象上繪制,并通過 FigureCanvas 呈現(xiàn)在窗口中。

新增的“導(dǎo)出地圖”按鈕(export_btn)及其事件綁定,為用戶提供了保存地圖視圖的功能。

3. load_geo_data 與 on_load_geo_file:數(shù)據(jù)加載邏輯

這兩個方法是應(yīng)用的核心數(shù)據(jù)加載部分。

  • load_geo_data 實現(xiàn)了智能加載。它首先檢查 self.last_map_file 是否有效,如果有效則直接加載。如果無效,它會嘗試加載幾個預(yù)設(shè)的默認(rèn)文件名(如 china.geojson)。這種設(shè)計保證了應(yīng)用在大多數(shù)情況下都能找到并加載地圖數(shù)據(jù)。
  • on_load_geo_file 則響應(yīng)“加載地圖文件”按鈕的點擊事件,通過文件對話框讓用戶手動選擇地圖文件。加載成功后,它會更新 self.last_map_file 并重新繪制地圖。

4. create_map 方法:地圖繪制核心

這是地圖可視化的核心邏輯。它根據(jù) self.selected_provinces 的狀態(tài),為每個行政區(qū)劃分配不同的顏色,然后調(diào)用 GeoPandas 的 plot 方法進(jìn)行繪制。

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)
    # ... 繪制圖例和標(biāo)題 ...
    self.canvas.draw()

代碼中的一個亮點是它對地圖文件列名的魯棒性。它會嘗試匹配多個常見的列名('name', 'NAME', '省份' 等),以確保它能兼容不同來源的 GeoJSON 或 Shapefile 文件。

5. on_province_click 與 on_export_map:交互與導(dǎo)出

on_province_click 負(fù)責(zé)處理省份按鈕的點擊事件。它會 toggles(切換)省份在 self.selected_provinces 集合中的狀態(tài),并改變按鈕的背景顏色,最后調(diào)用 create_map 來更新地圖視圖。

on_export_map 則是新增的導(dǎo)出功能。它使用 wx.FileDialog 彈出保存對話框,然后調(diào)用 self.figure.savefig(filepath, dpi=300) 將當(dāng)前 Matplotlib 的 Figure 保存為高分辨率的 PNG 圖片。

如何運行和使用

要運行這個應(yīng)用,請確保你已經(jīng)安裝了所有必需的庫:

pip install wxpython geopandas matplotlib

然后,你需要一個中國行政區(qū)劃的 GeoJSON 或 Shapefile 文件。你可以在 load_geo_data 方法中指定的幾個默認(rèn)文件名(china.geojson 等),或者在 GitHub 等網(wǎng)站找到類似的文件,然后通過“加載地圖文件”按鈕導(dǎo)入。

運行腳本后,你會看到一個包含中國地圖和所有省份按鈕的窗口。你可以:

  • 點擊按鈕來選擇或取消選擇省份。
  • 使用“全選”和“清除所有”按鈕來快速操作。
  • 點擊“導(dǎo)出地圖”將當(dāng)前視圖保存為圖片。

這個應(yīng)用是一個很好的例子,展示了如何將多個 Python 庫(GUI、地理空間數(shù)據(jù)、繪圖)有機地結(jié)合起來,創(chuàng)建一個功能實用且用戶友好的桌面工具。通過這種方式,你可以將復(fù)雜的數(shù)據(jù)處理和可視化任務(wù)封裝在一個直觀的界面中,大大降低了非技術(shù)人員的使用門檻。

到此這篇關(guān)于Python利用GeoPandas打造一個交互式中國地圖選擇器的文章就介紹到這了,更多相關(guān)Python交互式中國地圖選擇器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python使用FastParquet庫處理Parquet文件的方法

    Python使用FastParquet庫處理Parquet文件的方法

    在大數(shù)據(jù)時代,數(shù)據(jù)存儲和處理的效率至關(guān)重要,Parquet作為一種列式存儲格式,因其高效的壓縮和編碼方案,成為大數(shù)據(jù)處理中的熱門選擇,本文將深入探討FastParquet庫的使用,幫助讀者掌握如何利用這一工具高效處理Parquet文件,需要的朋友可以參考下
    2025-02-02
  • Python更改pip的默認(rèn)安裝位置的常用方法

    Python更改pip的默認(rèn)安裝位置的常用方法

    本文介紹了如何更改pip的默認(rèn)包安裝位置,包括在安裝Python時指定安裝目錄、使用pip的--target或--prefix參數(shù)、創(chuàng)建pip.ini配置文件、設(shè)置環(huán)境變量以及修改site.py文件,最后,驗證設(shè)置是否成功,需要的朋友可以參考下
    2025-10-10
  • Python光學(xué)仿真wxpython之DC繪圖

    Python光學(xué)仿真wxpython之DC繪圖

    這篇文章主要為大家介紹了Python光學(xué)仿真wxpython之DC繪圖的基本概念及用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 關(guān)于Python 內(nèi)置庫 itertools

    關(guān)于Python 內(nèi)置庫 itertools

    今天得這篇文章就來給大家介紹一下Python的系統(tǒng)庫itertools的 相關(guān)資料,需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • python使用dlib進(jìn)行人臉檢測和關(guān)鍵點的示例

    python使用dlib進(jìn)行人臉檢測和關(guān)鍵點的示例

    這篇文章主要介紹了python使用dlib進(jìn)行人臉檢測和關(guān)鍵點的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python將視頻或者動態(tài)圖gif逐幀保存為圖片的方法

    Python將視頻或者動態(tài)圖gif逐幀保存為圖片的方法

    本文是基于opencv將視頻和動態(tài)圖gif保存為圖像幀的方法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-09-09
  • python存儲16bit和32bit圖像的實例

    python存儲16bit和32bit圖像的實例

    今天小編就為大家分享一篇python存儲16bit和32bit圖像的實例,具有的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python使用Scrapling進(jìn)行網(wǎng)頁采集的用法詳解

    Python使用Scrapling進(jìn)行網(wǎng)頁采集的用法詳解

    Scrapling是一個Python Web Scraping框架,支持靜態(tài)網(wǎng)頁、動態(tài) 網(wǎng)頁抓取及多頁面爬蟲,它結(jié)合了requests、BeautifulSoup、Scrapy、Playwright的優(yōu)點,API簡潔統(tǒng)一,適用于快速原型、簡單的網(wǎng)頁抓取,本文給大家介紹了Scrapling的使用指南,需要的朋友可以參考下
    2026-05-05
  • Python?numpy下幾種fft函數(shù)的使用方式

    Python?numpy下幾種fft函數(shù)的使用方式

    numpy中有一個fft的庫,scipy中也有一個fftpack的庫,各自都有fft函數(shù),兩者的用法基本是一致的,下面這篇文章主要給大家介紹了關(guān)于Python?numpy下幾種fft函數(shù)的使用方式,需要的朋友可以參考下
    2022-08-08
  • Python實現(xiàn)獲取命令行輸出結(jié)果的方法

    Python實現(xiàn)獲取命令行輸出結(jié)果的方法

    這篇文章主要介紹了Python實現(xiàn)獲取命令行輸出結(jié)果的方法,涉及Python命令執(zhí)行及文件讀寫等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06

最新評論

金山区| 温泉县| 通城县| 东乡| 营口市| 璧山县| 铜山县| 余庆县| 应用必备| 揭西县| 庐江县| 门头沟区| 武强县| 阳泉市| 灵寿县| 鸡东县| 云南省| 曲阜市| 大港区| 安泽县| 陇川县| 曲麻莱县| 广南县| 错那县| 宁安市| 怀安县| 铜陵市| 库伦旗| 睢宁县| 华宁县| 崇义县| 铜梁县| 永德县| 新沂市| 辉南县| 洛川县| 杭锦后旗| 青冈县| 晋州市| 聊城市| 内黄县|