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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...