關鍵詞:耕地流入流出;地類轉換;自動分析;腳本工具;四川省中圖分類號:TP311.5 文獻標志碼:ADOI:10.19345/j.cnki.1674-7909.2025.07.030文章編號:1674-7909(2025)7-146-8
0 引言
實現耕地總量動態平衡是守住耕地保護紅線的重要手段,加強年度耕地流入流出管理是落實關于改革完善耕地占補平衡有關要求的重要舉措。耕地流人是指在分析目標年度內,通過土地整治、建設用地增減掛鉤、高標準農田建設等方式,將非耕地整治、復墾并轉變為耕地的過程;耕地流出是指在分析目標年度內,耕地因建設占用、農業產業結構調整、自然災毀等,轉變為其他農用地、建設用地與未利用地的過程。耕地流入流出管理是耕地占補平衡、進出平衡制度的進一步延伸和拓展[1]。根據前面耕地流入流出的含義,分析縣域年度耕地流入流出就是將分析目標年度的變更調查地類圖斑與上一年度的變更調查地類圖斑進行疊加對比分析,然后根據分析結果統計耕地增加、減少2個方向的地類來源與數量,從而得到耕地在目標年度內面積的變化情況
目前,尚無基于四川省年度耕地流入流出管理要求的自動分析處理方法,傳統方法是人工在Arc-GIS平臺上采用疊加分析功能處理數據[2],將處理結果導人Excel中進行地類轉換;然后利用Excel的數據透視功能3,根據統計需要進行分類匯總并單獨存表。該項工作涉及分析數據圖層統計字段的新建、地類轉換、疊加分析、數據分類匯總及分析報表輸出等主要操作流程,根據管理需要,具有重復性較高的特點。根據《國土空間調查、規劃、用途管制用地用海分類指南》中第三次全國國土調查(以下簡稱“國土三調”工作分類一級類、《中華人民共和國土地管理法》“三大類\"的分類方式4進行統計,每次分析都需要重新建立對應的轉換關系,人工分析處理耗時費力。目前,詹龍圣5根據市縣國土空間規劃編制要求,進行了“國土三調”工作分類與用地用海分類轉換方法研究;伍素貞等采用深度學習技術和人工目視解譯方法,著重研究了“國土三調\"地類與用地用海二級類批量轉換的精度和可靠性;李卓等7利用ArcGIS的空間分析功能,通過嵌入式VBScript程序,在耕地分等與地理信息相結合算法自動化方面進行了探索與嘗試;王露等8利用ArcPy設計了土地利用現狀及規劃分類統計的腳本工具,實現了土地利用現狀及規劃分類統計表的自動生成;林蔚凱采用組合分析方法和多源數據融合方法,以ArcPy為基礎搭建Python腳本工具,實現了園地快速準確的定級計算[9]。上述研究在地類轉換的方向、空間分析的對象、腳本設計的方式上各有側重,但均不能滿足四川省縣域年度耕地流入流出分析與統計的實際需要。鑒于此,研究基于Ar-cPy設計,編寫了一套在ArcGIS-Pro3.2上運行的分析腳本工具,實現了耕地流入流出的自動化分析。橫列按“國土三調”工作分類一級類、《中華人民共和國土地管理法》“三大類”的分類方式,豎行按鄉鎮代碼與名稱統計并導出Excel表,可以大大提高分析與統計的工作效率。
1 環境介紹
ArcPy是Esri公司為ArcGIS平臺提供的一個Python站點包,專門用于地理數據處理、分析和流程自動化。它是ArcGIS的核心腳本工具,允許用戶通過Python腳本調用ArcGIS的豐富功能,包括數據管理、地圖制圖、空間分析和地理處理[10]。ArcPy提供了對ArcGIS地理處理工具的完整訪問能力,用戶可以通過Python腳本調用這些工具,實現批量處理、自動化工作流和復雜空間分析。此外,ArcPy還提供了豐富的模塊和類,用于處理地理數據、地圖文檔、圖層、幾何對象等。
2分析腳本工具的設計思路
2.1 數據準備
2.1.1 數據圖層
分析腳本涉及的數據圖層包括縣域分析目標年度變更調查地類圖斑(研究以2023年為分析目標年度,即2023年DLTB,以下簡稱\"target_layer\")、上一年度的變更調查地類圖斑(即2022年DLTB,以下簡稱\"compare_layer\")和行政區圖層(即XZQ,以下簡稱\"xzq_layer\")。
2.1.2地類轉換關系預處理
將縣域分析目標年度變更調查地類圖斑導出Excel表,提取所有DLBM(地類編碼)與DLMC(地類名稱)列表,根據《國土空間調查、規劃、用途管制用地用海分類指南》中“國土三調”工作分類一級類、《中華人民共和國土地管理法》“三大類”與DLBM(地類編碼)和DLMC(地類名稱)的分類對應情況,建立分析目標縣域的變更調查地類轉換映射關系。
2.2腳本工具的設計思路
2.2.1 設計流程
腳本工具的設計流程如圖1所示。

2.2.2 設計流程的補充說明
在target_layer、compare_layer中添加字段,并根據變更調查地類的映射關系進行賦值,在ArcGIS中僅對現有圖層的屬性表進行操作,不創建新的圖層文件。
在2個年度圖層中篩選的耕地與非耕地圖層作為分析過程中的臨時圖層,不單獨導出。
耕地與非耕地圖層在執行相交操作時,強調耕地圖層在前、非耕地圖層在后的原則,便于后續統一統計字段并簡化代碼。
由于pivot_table函數的數據透視并不會對表格進行橫行、縱列的合計,因此需要在腳本中追加合計行列的代碼后再進入\"pd.ExcelWriter函數寫人Excel表\"流程。
在腳本工具運行過程中,導出inflow_layer、out-flow_layer、identified_inflow_layer和identified_out-flow_layer等4個過程的圖層,用于人工校驗腳本代碼的正確性。
3關鍵函數與代碼實現
3.1 導人模塊
腳本基于ArcPy語言編寫,并在ArcGIS-Pro3.2平臺上運行,導入os、arcpy、pandas3個模塊。其中,os模塊主要用于與操作系統交互,arcpy模塊主要用于地理數據處理,pandas模塊用于數據處理和分析,如數據讀取、清洗、轉換、分組聚合、合并、時間序列處理等[]。模塊導入代碼如下:
import arcpy import os import pandas as pd
3.2主要流程代碼實現
3.2.1 獲取用戶參數
target_layer
arcpy.GetParameterAsText(0)#設置分析目標年度圖層compare_layer Σ= Σ arcpy.GetParameterAsText(1)#設置比較年度圖層xzq_layer
arcpy.GetParameterAsText(2)#設置行政區圖層output_dir Σ= arcpy.GetParameterAsText(3)#設置分析過程圖層的存放路徑output_excel_path=arcpy.GetParameterAsText(4)
#設置分析結果Excel表格存放路徑
3.2.2建立地類轉換映射關系
#根據數據準備階段處理的地類映射關系,按
ArcPy字典編寫轉換代碼mapping_dict
'0101':{'YJDLBM':'01','YJDLMC':'耕地
'SDDLMC':農用地'},'0508':{YJDLBM':'05','YJDLMC':'商業服務
業用地','SDDLMC':'建設用地'},'1207':{YJDLBM':'12','YJDLMC':'其他土地',
'SDDLMC':未利用地'},
3.2.3 添加字段與字段賦值
#為目標年度圖層和比較年度圖層添加定義的
字段 defadd_new_fields(layers,field_defs): for layer in layers: existing_fields Σ= Σ {field.name for field in arcpy.
ListFields(layer)} forfield_name,field_type,field_lengthin
field_defs: if field_name not in existing_fields: print(f\"Adding field {field_name}to {layer}\") arcpy.AddField_management(layer, field_name,
field_type,field_length °leddash field_length) #根據DLBM字段的值給新增字段賦值 def update_fields(layer,mapping): field_names Σ= Σ [\"DLBM\", \"YJDLBM\",
\"YJDLMC\", \"SDDLMC\"] with arcpy.da.UpdateCursor(layer, field_names)
as cursor: for row in cursor: dlbm_value
row[0] if dlbm_value in mapping: row[1]
mapping[dlbm_value]['YJDLBM'] row[2]
mapping[dlbm_value]['YJDLMC'] row[3] Σ= Σ mapping[dlbm_value]['SDDLMC'] cursor.updateRow(row) else: print(f\"Warning:DLBM value'{dlbm_value}'
not found in mapping dictionary. Skipping this row.\")
3.2.4篩選分析目標年度與上一年度的耕地和非耕地代碼
文中僅列出篩選目標年度圖層的耕地與非耕地代碼,同理篩選上一年度(以下涉及相同操作的按此執行)。
#用QUERY篩選分析目標年度圖層的耕地與非耕地代碼,不單獨導出圖層
def filter_target_layer(target_layer): query_cultivated_target
\"YJDLMC Σ= Σ 耕地\"# 篩選分析目標年耕地 cultivatedland_target_lyr Σ= Σ arcpy.MakeFeatureLayer_management(target_layer,\"cultivatedland_target_lyr\") arcpy.SelectLayerByAttribute_management(cultivatedland_target_lyr,\"NEW_SELECTION\",query_ cultivated_target) query_non_cultivated_target Σ= \"YJDLMC ? 耕 地\"#篩選分析目標年度非耕地 non_cultivatedland_target_lyr Σ= Σ arcpy.MakeFeatureLayer_management(target_layer,\"non_cultivatedland_target_lyr\") arcpy.SelectLayerByAttribute_management(non_ cultivatedland_target_lyr,\"NEW_SELECTION\",query_non_cultivated_target) return cultivatedland_target_lyr,non_cultivatedland_target_lyr
3.2.5 獲取耕地流入流出圖層
3.2.5.1 獲取耕地流人圖層(inflow_layer)
#特力價口協牛反圖云時析地工 #將分析目標年度圖層的耕地與上一年度圖層 中反圖云的非耕地相交并導出圖層
defcalculate_inflow_layer(cultivatedland_target_
lyr,non_cultivatedland_compare_lyr,output_shape
file): inflow_layer Ψ= Ψ os.path.join(output_shapefile,\"in
flow_layer.shp\") print(f\"Calculatinginflow layer:{inflow_layer}\") arcpy.Intersect_analysis([cultivatedland_target_
lyr,non_cultivatedland_compare_lyr],inflow_layer) returninflow_layer
3.2.5.2 獲取耕地流出圖層(outflow_layer)
#將上一年度圖層的耕地與分析目標年度圖層 的非耕地相交 defcalculate_outflow_layer(cultivatedland_compare_lyr,non_cultivatedland_target_lyr,output_shapefile): outflow_layer τ= τ os.path. join(output_shapefile, \"outflow_layer.shp\") print(f'Calculatingoutflowlayer:{outflow_ layer}\")
arcpy.Intersect_analysis([cultivatedland_compare _lyr,non_cultivatedland_target_lyr],outflow_layer) returnoutflow_layer
3.2.6 重算面積
為準確統計耕地流入流出面積,重算[TBMJ]、[KCMJ]、[TBDLMJ]3個字段的面積,其中[TBMJ]采用橢球面積計算方式重算面積,[KCMJ]和[TBDLMJ]按照“國土三調\"面積計算方法重算,具體如下:
def calculate_area_and_update_fields(inflow_ layer): #計算幾何面積(橢球面積)并賦值給TBMJ字 段,保留2位小數 area_field
\"TBMJ\" arcpy.CalculateField_management(inflow_layer, area_field,\"round(!shape.geodesicArea!,2)\", \"PYTHON3\") #更新KCMJ、TBDLMJ字段 field_names Σ= Σ [\"TBMJ\",\"KCXS\",\"KCMJ\", \"TBDLMJ\"] try: with arcpy.da.UpdateCursor(inflow_layer, field_names)ascursor: for row in cursor: tbmj
round(row[0],2) kcmj Σ= Σ round(tbmj *row[1],2) tbdlmj Σ= Σ round(tbmj-kcmj,2) row[2] Σ= Σ kcmj row[3]
tbdlmj cursor.updateRow(row) except Exception ase: print(f\"Error updating fieldsin calculate_area_ and_update_fields:{e}\")
3.2.7 標識行政區
使用identify分別標識耕地流人圖層(inflow_layer)、耕地流出圖層(outflow_layer),并導出 標識后的圖層(identified_inflow_layer、identified_outflow_layer),代碼如下:
#標識耕地流入圖層(inflow_layer)
defidentify_xzq_to_layers(inflow_layer,outflow_layer,xzq_layer,output_shapefile):
identified_inflow_layer Ψ= Ψ os.path.join(output_shapefile,\"identified_inflow_layer.shp\")
print(f\"IdentifyingXZQto inflowlayer:{identi
fied_inflow_layer}\")
arcpy.analysis.Identity(inflow_layer,xzq_layer, identified_inflow_layer,join_attributes
\"ALL\",cluster_tolerance
,relationship 1 = 1 \"NO_RELATIONSHIPS\")
3.2.8獲取統計表并進行數據透視
3.2.8.1 獲取統計數據源
在目標年度耕地流人統計圖層(identified_inflowlayer)和目標年度耕地流出統計圖層(identi-fied_outflow_layer)的基礎上,以XZQDM、XZQMO為第1、2列的行標題,統計耕地流入與流出的來源、去向地類。
defsummarize_tables_with_pivot(identified_in flow_layer,identified_outflow_layer):
#將DBF轉為DataFrame
field_names_inflowsource
[\"XZQDM\",\"XZQMC\",\"YJDLBM_1\",\"YJDLMC_1\", \"SDDLMC_1\", \"TBDLMJ\"]#指定耕地流入來源地類統計字段
field_names_inflowdestination Σ= Σ [\"XZQDM\", \"XZQMC\",\"DLBM\",\"DLMC\",\"TBDLMJ\"]#指定 流入耕地二級地類統計字段
df_inflowsource Σ= Σ pd.DataFrame(arcpy.da.TableToNumPyArray(identified_inflow_layer, field_names_inflowsource))
df_inflowdestination Σ= Σ pd.DataFrame(arcpy. da. TableToNumPyArray(identified_inflow_layer, field_names_inflowdestination))
field_names_outflowsource
[\"XZQDM\",\"XZQMC\",\"DLBM\",\"DLMC\",\"TBDLMJ\"]#指定流出 耕地二級地類統計字段
field_names_outflowdestination Σ= Σ [\"XZQDM\", \"XZQMC\",\"YJDLBM_1\",\"YJDLMC_1\",\"SDDLMC _1\",\"TBDLMJ\"]#指定耕地流出去向地類統計 字段
df_outflowsource Σ= Σ pd.DataFrame(arcpy.da.Ta bleToNumPyArray(identified_outflow_layer, field_names_outflowsource))
df_outflowdestination Σ= Σ pd.DataFrame(arcpy.da. TableToNumPyArray(identified_outflow_layer, field_names_outflowdestination))
3.2.8.2采用pivot進行數據透視
pivot_inflowsource Ψ= Ψ df_inflowsource.pivot_ table(index
[\"XZQDM\",\"XZQMC\"],columns
[\"YJDLBM_1\",\"YJDLMC_1\",\"SDDLMC_1\"],values
\"TBDLMJ\",aggfunc
sum').fillna(0)
pivot_inflowdestination Σ= Σ df_inflowdestination. pivot_table(index
[\"XZQDM\",\"XZQMC\"],columns
[\"DLBM\",\"DLMC\"],value ? \"TBDLMJ\",aggfunc : = 'sum').fillna(0)
pivot_outflowsource
df_outflowsource.pivot _table(index
[\"XZQDM\",\"XZQMC\"],columns
[\"DLBM\",\"DLMC\"],value \"TBDLMJ\",aggfunc
'sum').fillna(0)
pivot_outflowdestination Σ= Σ df_outflowdestination.pivot_table(index °leddash [\"XZQDM\",\"XZQMC\"],columns °leddash [\"YJDLBM_1\",\"YJDLMC_1\",\"SDDLMC_ 1\"],values
\"TBDLMJ\",aggfunc
sum').fillna(0)
3.2.8.3透視表追加行列匯總合計 #在透視表中追加合計列 pivot_inflowsourcel['合計
pivot_inflow
source.sum(axis 1 = 1 ) pivot_inflowdestination['合計
pivot_in
flowdestination.sum(axis=1) pivot_outflowsource['合計
pivot_outflow
source.sum(axis 1 = 1 ) pivot_outflowdestination['合計
pivot_out
flowdestination.sum(axis=1) #在透視表中增加合計行 total_row_inflowsource Σ= Σ pd.Series(pivot_in
flowsource.iloc[:,:].sum(,name=('合計',\",\")) total_row_inflowdestination Σ= Σ pd.Series
(pivot_inflowdestination.iloc[:,:].sum,name=('合計
', \",\")) total_row_outflowsource Σ= Σ pd. Series(pivot_out
flowsource.iloc[:,:].sum,name=('合計',\", \")) total_row_outflowdestination Σ= Σ pd.Series
(pivot_outflowdestination.iloc[:,:].sum,name=('合
計,\",\")) #在透視表中追加合計行插入到最后 pivot_inflowsource Σ= Σ pivot_inflowsource.append
(total_row_inflowsource).sort_index(kind='merge') pivot_inflowdestination Σ= Σ pivot_inflowdestina
tion.append(total_row_inflowdestination).sort_index
(kind
merge') pivot_outflowsource Σ= Σ pivot_outflowsource. ap
pend(total_row_outflowsource). sort_index(kind=
'merge') pivot_outflowdestination
pivot_outflowdestina
tion.append(total_row_outflowdestination).sort_index (kind='merge')
3.2.9 匯總數據導出Excel
#將匯總數據導出Excel,存放到一個工作簿中def export_to_excel(pivot_inflowsource,pivot_inflowdestination,pivot_outflowsource,pivot_out-flowdestination,excel_path):
with pd.ExcelWriter(excel_path) aswriter:
pivot_inflowsource.to_excel(writer,sheet_name= 耕地流入地類來源情況表,index
True)
pivot_inflowdestination.to_excel(writer,sheet name
流入耕地二級地類情況表,index Ψ= True)
pivot_outflowsource.to_excel(writer,sheet_name
流出耕地二級地類情況表',index
True)
pivot_outflowdestination.to_excel(writer,sheet name
耕地流出地類去向情況表',index
True)
4工具實現與實例驗證
4.1 工具實現
在ArcGIS-Pro3.2工程目錄的工具箱中新建工具箱,在新建工具箱中新建腳本,將代碼粘貼到\"執行”對話框中,完善“常規”“參數”對話框的設置。“參數\"設置要與代碼獲取用戶參數類型一致,設置分析目標年度圖層、上一年度圖層、行政區圖層、分析過程圖層存放路徑、分析結果Excel表格存放路徑及名稱等5個參數。腳本工具名稱為耕地流入流出分析V1.1,界面如圖2所示。
4.2 實例驗證
筆者測試數據為四川省某區2023年度和2022
年度變更調查數據。該區面積超過
,2023
年圖斑數量超過28萬個,2022年圖斑數量超過25萬個。經分析,該區2023年耕地流入圖斑8257個,總面積
;耕地流出圖斑11449個,總面積
年全年實現耕地凈流入
○
分析腳本工具運行時間不到 4 m i n ,輸出結果符合預期,分析結果如圖3至圖6(筆者僅對鄉鎮代碼、鄉鎮名稱進行了虛構與隱蔽處理,微調了統計字段的顯示效果)。

5結論
基于ArcPy設計的縣域耕地年度流入流出分析腳本工具,可以自動完成分析圖層的字段新建、地類轉換賦值、面積重算、疊加分析及統計出表,顯著提高了分析效率。該工具在面積重算過程中扣除了田坎系數,統計報表數據均以耕地凈流入流出面積呈現,便于無縫銜接2個年度的耕地面積。該工具不僅可以應用于耕地年度流入流出分析,同樣適用于跨年度的任意2個年度之間的耕地動態變化分析,對相關從業人員具有一定的參考與應用價值。
參考文獻:
[1]梁健,梁婧祎.縣域“進出平衡”耕地資源補充潛力分析:以重慶市巴南區為例[J.自然資源情報,2024(5):25-31.
[2]李歐,安靜.基于ArcGIS疊加分析功能的國土變更調查成果研究[J.測繪與空間地理信息,2024,47(S1):142-144.
[3]丁紅利.Excel數據透視表在高校數據處理中的應用[J].電腦知識與技術,2017,13(3):67-68.
[4自然資源部.自然資源部關于印發《國土空間調查、規劃、用途管制用地用海分類指南》的
通知[EB/OL].(2023-11-22)[2025-01-22].http:// gi.m.mnr.g0v.cn/202311/t20231124_2807521.html.
[5]詹龍圣.從“三調”分類到市縣國土空間總體規劃用地用海分類轉換技術方法探索[J.智能城市,2021,7(12):1-3.
[6]伍素貞,郭舟,淳錦.省級國土三調與用地用海分類數據快速轉換技術方法探索[J.測繪標準化,2024,40(1):66-73.
[7]李卓,張檳,劉毅,等.基于ArcGIS空間分析的黑龍江省耕地分等算法自動化的設計與實現[J].測繪與空間地理信息,2013,36(9):157-160.
[8]王露,盧駿.基于ArcPy的土地規劃分類統計腳本工具設計[J].河南科技,2023,42(9):23-26.
[9]林蔚凱.ArcPy腳本工具在園林草定級中
應用:以新羅區園地定級為例[J].北京測繪.2024,38(12):1766-1770.
2018(3):44-46,49.
[10]李詩宇,鄧吉強.基于ArcPy的地學數據自動化處理與分析方法[J].科技創新與生產力,
[11]韓文煜.基于python數據分析技術的數據整理與分析研究[J].科技創新與應用,2020(4):157-158.
Design of a Script Tool for Annual Inflowand Outflow Analysis of Cultivated Land at the County-Level Based on ArcPy
CHENLianhai12 JIANGLan2
1.Regional Geological Survey Brigade of Sichuan Bureauof Geology,Chengdu 61OO84,China; 2.Sichuan Tianfu Rongda Information TechnologyCo.,Ltd.,Chengdu 610213,China
Abstract: Implementing dynamic monitoring of cultivated land and strengthening the management of cultivated land inflows and outflows are important measures in cultivated land protection. Conducting annual analysis of cultivated land inflow and outflowat the county level in a timely mannercan help understand dynamic changes of cultivated land,thereby better serving the protection and management of cultivated land.In this paper,based on the policies fortheannual management of cultivated land inflows and outflows in Sichuan Province,we design and develop a script tool using ArcPy for analyzing annual changes in cultivated landat the county level.The tool,implemented on the ArcGIS Pro 3.2 platform,enables land use type conversion,automated analysis of cultivated land inflow and outflow,and area recalculation.The column headers of the output statisticaltable are subjectto data processing according to the first-level categories of the classification for the Third National Land Survey work and the \"Three Major Categories\" in the Land Administration Law.The row headers are based onthe statisticalcalibers of the townshipcodes and township names.Finally,Excel tables are respectively output according to the source and destination land categories of the inflow and outflow of cultivated land,significantly reducing repetitive tasks and improving the eficiency of analysis and statistics.
Key words: cultivated land inflow and outflow; land use type conversion; automated analysis; ArcPy-based script tool; Sichuan Province