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

Python利用GeoPandas打造一個(gè)交互式中國(guó)地圖選擇器

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

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

C:\pythoncode\new\china_map_app.py

技術(shù)棧概覽

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

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

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

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

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

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

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

class ChinaMapFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="中國(guó)地圖行政區(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 # 存儲(chǔ)上次加載成功的地圖文件路徑
        
        self.init_ui()
        self.load_state()
        self.load_geo_data()
        
        self.Bind(wx.EVT_CLOSE, self.on_close)

這里定義了幾個(gè)重要的實(shí)例變量:

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

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

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

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

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 對(duì)象上繪制,并通過(guò) FigureCanvas 呈現(xiàn)在窗口中。

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

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

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

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

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

這是地圖可視化的核心邏輯。它根據(jù) self.selected_provinces 的狀態(tài),為每個(gè)行政區(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()

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

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

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

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

如何運(yùn)行和使用

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

pip install wxpython geopandas matplotlib

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

運(yùn)行腳本后,你會(huì)看到一個(gè)包含中國(guó)地圖和所有省份按鈕的窗口。你可以:

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

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

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

相關(guān)文章

  • Python使用FastParquet庫(kù)處理Parquet文件的方法

    Python使用FastParquet庫(kù)處理Parquet文件的方法

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

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

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

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

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

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

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

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

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

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

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

    python存儲(chǔ)16bit和32bit圖像的實(shí)例

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

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

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

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

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

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

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

最新評(píng)論

剑阁县| 宝鸡市| 高碑店市| 宜章县| 岑巩县| 商洛市| 文化| 雷州市| 玉田县| 宜都市| 荔浦县| 芦溪县| 喀什市| 津市市| 白玉县| 鄂伦春自治旗| 宁明县| 体育| 德惠市| 新沂市| 铁岭市| 青冈县| 石台县| 东乌珠穆沁旗| 普兰店市| 简阳市| 松潘县| 浮梁县| 东城区| 宜章县| 湖州市| 迁安市| 日喀则市| 尼玛县| 个旧市| 永平县| 肥城市| 合水县| 红安县| 定日县| 正蓝旗|