Python中ArcPy讀取Excel表格長時間序列數(shù)據(jù)牵寺、批量反距離加權IDW插值與批量掩膜

??本文介紹基于PythonArcPy模塊悍引,實現(xiàn)Excel數(shù)據(jù)讀取導入圖層,同時進行IDW插值批量掩膜的方法帽氓。

1 任務需求

??首先趣斤,我們來明確一下本文所需實現(xiàn)的需求。

??現(xiàn)有一個記錄有北京市部分PM2.5濃度監(jiān)測站點在2019年05月18日00時至23時(其中不含19時)等23個逐小時PM2.5濃度數(shù)據(jù)Excel表格文件黎休,我們需要將其中的數(shù)據(jù)依次讀入一個包含北京市各PM2.5濃度監(jiān)測站點的矢量點要素圖層中浓领;隨后玉凯,基于這些站點導入的23個逐小時PM2.5濃度數(shù)據(jù),逐小時對北京市PM2.5濃度加以反距離加權(IDW)方法的插值镊逝,即共繪制23幅插值圖壮啊;最后,基于已有的北京市邊界矢量數(shù)據(jù)撑蒜,分別對這23幅插值圖加以掩膜歹啼。

??在這里,包含北京市各PM2.5濃度監(jiān)測站點的矢量點要素圖層是基于這篇博客https://blog.csdn.net/zhebushibiaoshifu/article/details/122849279)得到的座菠,如下圖所示狸眼。

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

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

2 代碼實現(xiàn)

??了解了需求后品嚣,我們就基于Python中的ArcPy模塊炕倘,進行詳細代碼的撰寫與介紹。

??這里需要說明的是:在編寫代碼的時候翰撑,為了方便執(zhí)行罩旋,所以希望代碼后期可以在ArcMap中直接通過工具箱運行,即用到Python程序腳本新建工具箱與自定義工具的方法眶诈;因此涨醋,代碼中對于一些需要初始定義的變量,都用到了arcpy.GetParameterAsText()函數(shù)逝撬。大家如果只是希望在IDLE中運行代碼浴骂,那么直接對這些變量進行具體賦值即可。關于Python程序腳本新建工具箱與自定義工具宪潮,大家可以查看這篇博客https://blog.csdn.net/zhebushibiaoshifu/article/details/121518404)詳細了解溯警。

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

??代碼的整體思路為:首先利用pd.read_csv函數(shù)讀取記錄有北京市部分PM2.5濃度監(jiān)測站點在2019年05月18日00時至23時(其中不含19時)等23個逐小時PM2.5濃度數(shù)據(jù)Excel表格文件數(shù)據(jù)询张,隨后在北京市各PM2.5濃度監(jiān)測站點的矢量點要素圖層的屬性表中新建23個列,每一個列表示該監(jiān)測站點在某一時刻的濃度數(shù)據(jù)(共有23個時刻浙炼,因此共有23個列)份氧;其次,由于矢量要素圖層中的部分站點在Excel文件中并沒有數(shù)據(jù)弯屈,因此需要將這些站點從矢量要素圖層中刪除蜗帜;最后,分別利用Idw函數(shù)與ExtractByMask函數(shù)進行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 運行結果

??執(zhí)行上述代碼,如果是在ArcMap中直接通過工具箱運行宴偿,則可以看到代碼運行過程中出現(xiàn)的提示湘捎。

??例如,下圖所示提示可以知道有哪幾個站點是沒有數(shù)據(jù)窄刘、從而被剔除的窥妇。

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

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

??再來看看具體的圖片長什么樣子欺矫。

??首先查看IDW插值結果圖;我們以當日10時的插值結果圖為例進行查看展氓∧屡浚可以看到其已對北京市邊界矢量數(shù)據(jù)所包含的矩形范圍完成了插值。

??接下來遇汞,查看IDW插值結果圖經過掩膜后的圖像未妹;我們同樣以當日10時的插值、掩膜結果圖為例進行查看空入÷缢可以看到,經過掩膜操作后的圖像已經完全符合北京市邊界矢量數(shù)據(jù)的范圍歪赢。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末化戳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子埋凯,更是在濱河造成了極大的恐慌点楼,老刑警劉巖扫尖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掠廓,居然都是意外死亡换怖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門蟀瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沉颂,“玉大人,你說我怎么就攤上這事悦污≌桌溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵塞关,是天一觀的道長抬探。 經常有香客問我,道長帆赢,這世上最難降的妖魔是什么小压? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮椰于,結果婚禮上怠益,老公的妹妹穿的比我還像新娘。我一直安慰自己瘾婿,他們只是感情好蜻牢,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偏陪,像睡著了一般抢呆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笛谦,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天抱虐,我揣著相機與錄音,去河邊找鬼饥脑。 笑死恳邀,一個胖子當著我的面吹牛,可吹牛的內容都是我干的灶轰。 我是一名探鬼主播谣沸,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笋颤!你這毒婦竟也來了乳附?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎许溅,沒想到半個月后瓤鼻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡贤重,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年茬祷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并蝗。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祭犯,死狀恐怖,靈堂內的尸體忽然破棺而出滚停,到底是詐尸還是另有隱情沃粗,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布键畴,位于F島的核電站最盅,受9級特大地震影響,放射性物質發(fā)生泄漏起惕。R本人自食惡果不足惜涡贱,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惹想。 院中可真熱鬧问词,春花似錦、人聲如沸嘀粱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锋叨。三九已至垄分,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悲柱,已是汗流浹背锋喜。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工些己, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留豌鸡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓段标,卻偏偏與公主長得像涯冠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逼庞,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容