Python基於Excel數據加以反距離加權空間插值並掩膜圖層

来源:https://www.cnblogs.com/fkxxgis/p/18125409
-Advertisement-
Play Games

本文介紹基於Python中ArcPy模塊,實現Excel數據讀取並生成矢量圖層,同時進行IDW插值與批量掩膜的方法。 1 任務需求 首先,我們來明確一下本文所需實現的需求。 現有一個記錄有北京市部分PM2.5濃度監測站點在2019年05月18日00時至23時(其中不含19時)等23個逐小時PM2.5 ...


  本文介紹基於PythonArcPy模塊,實現Excel數據讀取生成矢量圖層,同時進行IDW插值批量掩膜的方法。

1 任務需求

  首先,我們來明確一下本文所需實現的需求。

  現有一個記錄有北京市部分PM2.5濃度監測站點在2019年05月18日00時至23時(其中不含19時)等23個逐小時PM2.5濃度數據Excel表格文件,我們需要將其中的數據依次讀入一個包含北京市各PM2.5濃度監測站點的矢量點要素圖層中;隨後,基於這些站點導入的23個逐小時PM2.5濃度數據,逐小時對北京市PM2.5濃度加以反距離加權(IDW)方法的插值,即共繪製23幅插值圖;最後,基於已有的北京市邊界矢量數據,分別對這23幅插值圖加以掩膜。

  在這裡,包含北京市各PM2.5濃度監測站點的矢量點要素圖層是基於Python基於Excel生成矢量圖層及屬性表信息:ArcPy得到的,如下圖所示。

image

  其中,該矢量圖層還包括屬性表,屬性表內容包括每一個站點的編號、地理位置與中文名稱,如下圖所示。

  而記錄有北京市部分PM2.5濃度監測站點在2019年05月18日00時至23時(其中不含19時)等23個逐小時PM2.5濃度數據Excel表格文件則如下所示,其中包括各站點在23個整點時所監測到的PM2.5濃度。

2 代碼實現

  瞭解了需求後,我們就基於Python中的ArcPy模塊,進行詳細代碼的撰寫與介紹。

  這裡需要說明的是:在編寫代碼的時候,為了方便執行,所以希望代碼後期可以在ArcMap中直接通過工具箱運行,即用到Python程式腳本新建工具箱與自定義工具的方法;因此,代碼中對於一些需要初始定義的變數,都用到了arcpy.GetParameterAsText()函數。大家如果只是希望在IDLE中運行代碼,那麼直接對這些變數進行具體賦值即可。關於Python程式腳本新建工具箱與自定義工具,大家可以查看ArcMap將Python寫的代碼轉為工具箱與自定義工具詳細瞭解。

  上面提到需要初始定義的變數一共有十個,其中arcpy.env.workspace參數表示當前工作空間,csv_path參數表示存儲有北京市2019年05月18日00時至23時(其中不含19時)逐小時PM2.5濃度數據的.csv文件,shape_file_path參數表示站點信息矢量數據文件,boundary_file_path參數表示投影後北京市邊界矢量數據文件,spatial_resolution參數表示IDW插值結果柵格圖的像元大小,power參數表示IDW插值時所用距離的冪指數,look_point參數表示IDW插值時所用最鄰近輸入採樣點數量的整數值,max_distance參數表示IDW插值時對最鄰近輸入採樣點的限制距離,單位依據地圖坐標系確定;idw_result_dir參數表示IDW插值結果圖層保存路徑,mask_result_dir參數表示IDW插值結果圖層經掩膜後保存路徑。

  代碼的整體思路為:首先利用pd.read_csv函數讀取記錄有北京市部分PM2.5濃度監測站點在2019年05月18日00時至23時(其中不含19時)等23個逐小時PM2.5濃度數據Excel表格文件數據,隨後在北京市各PM2.5濃度監測站點的矢量點要素圖層的屬性表中新建23個列,每一個列表示該監測站點在某一時刻的濃度數據(共有23個時刻,因此共有23個列);其次,由於矢量要素圖層中的部分站點在Excel文件中並沒有數據,因此需要將這些站點從矢量要素圖層中刪除;最後,分別利用Idw函數與ExtractByMask函數進行IDW插值與掩膜。

  具體代碼如下。

# -*- coding: utf-8 -*-
# @author: ChuTianjia

import copy
import arcpy
import pandas as pd
from arcpy.sa import *

arcpy.env.workspace=arcpy.GetParameterAsText(0)
csv_path=arcpy.GetParameterAsText(1)
shape_file_path=arcpy.GetParameterAsText(2)
idw_result_dir=arcpy.GetParameterAsText(8)
boundary_file_path=arcpy.GetParameterAsText(3)
mask_result_dir=arcpy.GetParameterAsText(9)
spatial_resolution=arcpy.GetParameterAsText(4)
power=arcpy.GetParameterAsText(5)
look_point=arcpy.GetParameterAsText(6)
max_distance=arcpy.GetParameterAsText(7)

csv_data=pd.read_csv(csv_path,header=0,encoding="gbk")
column_name_list=list(csv_data)
hour_column=csv_data["hour"]

pm_25_list=[[0]*len(csv_data) for i in range(csv_data.shape[1]-3)]

for i in range(3,csv_data.shape[1]):
    for index,data in csv_data.iterrows():
        pm_25_list[i-3][index]=data[i]

field_list=["hour_00","hour_01","hour_02","hour_03","hour_04","hour_05",\
            "hour_06","hour_07","hour_08","hour_09","hour_10",\
            "hour_11","hour_12","hour_13","hour_14","hour_15",\
            "hour_16","hour_17","hour_18","hour_20",\
            "hour_21","hour_22","hour_23"]
field_list_use=copy.deepcopy(field_list)
field_list_use.insert(0,"Name")

# Update the columns in the attribute table
for i in range(len(field_list)):
    arcpy.AddField_management(shape_file_path,field_list[i],"SHORT")

delete_num=0
delete_name=[]
with arcpy.da.UpdateCursor(shape_file_path,field_list_use) as cursor:
    for row in cursor:
        for column_name in column_name_list:
            if column_name==row[0]:
                for i in range(len(csv_data[column_name])):
                    row[i+1]=csv_data[column_name][i]
                    cursor.updateRow(row)

        # Find stations that without any data        
        if row[0] not in column_name_list:
            cursor.deleteRow()
            delete_num+=1
            delete_name.append(row[0])

arcpy.AddWarning("Delete {0} site(s) that do not contain any data, and the site(s) name is(are):".format(delete_num))
for i in delete_name:
    arcpy.AddMessage(i)
arcpy.AddMessage("\n")

# Perform IDW interpolation
arcpy.env.extent=boundary_file_path
for i in range(len(field_list)):
    idw_result=Idw(shape_file_path,field_list[i],spatial_resolution,power,RadiusVariable(look_point,max_distance))
    idw_result_path=idw_result_dir+"\\"+"BJ_"+field_list[i]+".tif"
    idw_result.save(idw_result_path)
    arcpy.AddMessage("{0} has completed IDW interpolation.".format(field_list[i]))

# Perform mask
tif_file_list=arcpy.ListRasters("BJ_hour_*","TIF")
for raster in tif_file_list:
    mask_result=ExtractByMask(raster,boundary_file_path)
    mask_result_path=mask_result_dir+"\\"+raster.strip(".tif")+"_Mask.tif"
    mask_result.save(mask_result_path)
    arcpy.AddMessage("{0} has been masked.".format(raster.strip(".tif")))

3 運行結果

  執行上述代碼,如果是在ArcMap中直接通過工具箱運行,則可以看到代碼運行過程中出現的提示。

  例如,下圖所示提示可以知道有哪幾個站點是沒有數據、從而被剔除的。

  下圖則可以顯示出目前代碼的運行情況。

  同時,在我們設定的結果文件夾中可以看到,23小時的插值圖與掩膜圖都將自動生成並保存在指定文件夾。

  再來看看具體的圖片長什麼樣子。

  首先查看IDW插值結果圖;我們以當日10時的插值結果圖為例進行查看。可以看到其已對北京市邊界矢量數據所包含的矩形範圍完成了插值。

  接下來,查看IDW插值結果圖經過掩膜後的圖像;我們同樣以當日10時的插值、掩膜結果圖為例進行查看。可以看到,經過掩膜操作後的圖像已經完全符合北京市邊界矢量數據的範圍。

  至此,大功告成。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 提供者目錄 Provider Authenticator BaseDirectGrantAuthenticator AbstractFormAuthenticator AbstractUsernameFormAuthenticator RequiredActionProvider FormActio ...
  • 強制等待 即sleep()方法,由python中的time模塊提供,強制讓代碼等待xxx時間,無論前面的代碼是否執行完成或者還未完成,都必須等待設定的時間。 示例代碼如下: # coding = utf-8 from selenium import webdriver from time impor ...
  • 拓展閱讀 MySQL View MySQL truncate table 與 delete 清空表的區別和坑 MySQL Ruler mysql 日常開發規範 MySQL datetime timestamp 以及如何自動更新,如何實現範圍查詢 MySQL 06 mysql 如何實現類似 oracl ...
  • maku-generator —— 一款低代碼生成器,可根據自定義模板內容,快速生成前後端代碼,可實現項目的快速開發、上線,減少重覆的代碼編寫,開發人員只需專註業務邏輯即可。 ...
  • 目錄簡介源碼函數說明arv_camera_newarv_camera_acquisitionarv_camera_get_model_namearv_buffer_get_image_widtharv_buffer_get_image_height 簡介 本文針對官方常式中的第一個常式:single ...
  • DDD 領域驅動設計理解(Domain Driven Design) 目錄DDD 領域驅動設計理解(Domain Driven Design)概念核心目標 概念 領域驅動設計事實上是1針對OOAD的一個擴展和延申。DDD基於面向對象分析與設計技術。 對技術架構進行了分層規劃。 對每個類進行了策略和劃 ...
  • Spring Boot 允許你將配置外部化,以便可以在不同的環境中使用相同的應用程式代碼。可以使用屬性文件、YAML文件、環境變數和命令行參數將配置外部化。屬性值可以通過使用 @Value 註解直接註入 bean,可以通過 Spring 的 Environment 抽象訪問,也可以通過 @Confi... ...
  • 永久激活支持全家桶所有軟體,包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode 下麵以 Intellij IDEA 作為演示。 準備工作:下載插件包 https://qweree.cn/index.php/259/(如果 ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 1. 講故事 這一期程式故障除了做原理分析,還順帶吐槽一下,熟悉我的朋友都知道我分析dump是免費的,但免費不代表可以濫用我的寶貴時間,我不知道有些人故意惡搞卡死是想幹嘛,不得而知,希望後面類似的事情越來越少吧!廢話不多說,我們來看看是如何被惡搞的。 二:WinDbg 分析 1. 程式是如 ...
  • TCP(Transmission Control Protocol): 特點:面向連接、可靠傳輸、按序交付、流量控制、擁塞控制。 用途:適用於需要高可靠性的數據傳輸,如網頁瀏覽、電子郵件、文件傳輸等。 優勢:數據包順序和完整性有保障,適合需要準確無誤傳輸數據的場景。 舉例:線上購物網站的交易數據傳輸 ...
  • 前面兩篇隨筆介紹了EAV模型(實體-屬性-值)的設計思路和Winform前端對於通用查詢的處理,本篇隨筆繼續深入EAV模型(實體-屬性-值)設計的探討,介紹實體屬性的定義,以及根據不同屬性的定義構建不同的輸入控制項處理,以及列表界面的展示。旨在結合關係型資料庫的熟練使用、性能優勢和MongoDB資料庫... ...
  • IEC60870-5-104 是一種電力自動化系統中常用的通信協議,使用 TCP/IP 協議作為底層通信協議,用於監視和控制電力系統中的各種設備,如變電站、發電機、開關等。 ...
  • 前言:最近幾天有好幾個小伙伴玩WPF,遇到不同頁面,不知道要怎麼傳遞消息。於是,我今天就來演示一個事件聚合器的玩法,採用prism框架來實現。作為福利,內容附帶了主頁面打開對話框時候直接通過參數傳遞消息的一個小例子,具體請自行圍觀。 以下內容,創建wpf項目以及引用prism和實現依賴註入等細節,可 ...
  • 在這篇文章中,我們介紹瞭如何利用大型語言模型為情人節營造難忘的氛圍。通過上傳圖片併進行風格轉化,我們可以為對方呈現一幅獨特的作品,增添浪漫的色彩。同時,藉助搜索功能,我們能夠輕鬆獲取與情人節相關的信息,為策劃活動提供更多靈感和建議。 ...
  • 正文 晚上跳舞回來,在便利店照例買根冰淇淋吃。看到店裡的老闆娘在訓她孩子。言辭依稀可以聽見考上好初中之類。 當時一個臨時起意,打算買兩根冰淇淋,塞一根到他手上,說一句:“我小時候也老被罵,沒什麼。” 然後跑掉。但是在冰櫃里翻了半天,都沒找到自己想吃的那種。與此同時,聽到他媽媽聲色俱厲地說:“你知道我小時 ...
  • strcpy和memcpy 目錄strcpy和memcpy 複製內容: strcpy:專門用於複製字元串,它會一直複製直到遇到源字元串中的'\0'結束符。這意味著如果源字元串長度超過了目標緩衝區的大小(不包括'\0'),就會發生緩衝區溢出,這是一個常見的安全隱患。 memcpy:可以複製任意內容,如 ...
  • 本文介紹在Visual Studio中,通過屬性表,使得一個新建解決方案中的項目可以快速配置已有解決方案的項目中各類已編譯好的C++第三方庫的方法~ ...
  • 將多個第三方包封裝成一個項目後,如果你的目的是讓其他開發人員可以直接引用這些依賴,一般來說有兩種常見的方式: 打成JAR包:將封裝好的項目編譯打包成JAR文件,其他開發人員可以將這個JAR文件添加到他們的項目中,併在項目的構建工具(比如Maven)中配置該JAR作為依賴。這樣做的好處是簡單直接,其他 ...