Python基於Excel生成向量圖層及屬性表資訊:ArcPy

疯狂学习GIS發表於2024-03-20

  本文介紹基於PythonArcPy模組,讀取Excel表格資料並生成帶有屬性表向量要素圖層,同時配置該圖層的座標系的方法。

1 任務需求

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

  現有一個記錄北京市部分PM2.5濃度監測站點資訊的Excel表格資料,格式為.xls;檔案內包含站點編號、XY座標、站點名稱等四列資料,部分資料如下所示。

image

  我們需要將該表格檔案中所記錄的全部站點資訊匯入到Python中,並將全部站點建立為一個點要素的向量圖層;此外,需要同時可以指定該向量圖層的投影座標系,並將表格檔案中的四列資訊作為向量圖層屬性表的欄位與內容

2 程式碼實現

  接下來,我們就基於PythonArcPy模組,進行詳細程式碼的撰寫與介紹。

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

  上面提到需要初始定義的變數一共有四個,其中arcpy.env.workspace參數列示當前工作空間,excel_path參數列示儲存有北京市PM2.5濃度監測站點資訊的Excel資料檔案,spatial_reference_txt參數列示需要對站點向量資料進行投影的座標系型別(在本文中我們以“WGS 1984 UTM Zone 50N”投影為例),shapefile_name參數列示投影后站點向量資料的具體檔案。

# -*- coding: cp936 -*-
# @author: ChuTianjia

import xlrd
import arcpy

arcpy.env.workspace=arcpy.GetParameterAsText(0)
excel_path=arcpy.GetParameterAsText(1) # 站點資訊表格檔案
shapefile_name=arcpy.GetParameterAsText(3) # 需要生成的向量要素的路徑與名稱

file_data=xlrd.open_workbook(excel_path)
sheet_data=file_data.sheets()[0]
sheet_row_num=sheet_data.nrows

point_geometry_list=[]
point_object=arcpy.Point()

# Read Spatial Coordinate Information
spatial_reference_txt=arcpy.GetParameterAsText(2) # 指定投影座標系
spatial_reference=arcpy.SpatialReference()
spatial_reference.loadFromString(spatial_reference_txt)

# Import the Coordinates of Each Point
for i in range(1,sheet_row_num):
    x=sheet_data.row(i)[1].value
    y=sheet_data.row(i)[2].value
    point_object.X=float(x)
    point_object.Y=float(y)
    point_geometry=arcpy.PointGeometry(point_object,spatial_reference)
    point_geometry_list.append(point_geometry)

arcpy.CopyFeatures_management(point_geometry_list,shapefile_name)

# Import the Filed Information
field_list=["X","Y","ID_Own","Name"]
arcpy.AddField_management(shapefile_name,field_list[0],"FLOAT")
arcpy.AddField_management(shapefile_name,field_list[1],"FLOAT")
arcpy.AddField_management(shapefile_name,field_list[2],"SHORT")
arcpy.AddField_management(shapefile_name,field_list[3],"TEXT")

with arcpy.da.UpdateCursor(shapefile_name,field_list) as cursor:
    n=1
    for row in cursor:
        row[0]=sheet_data.row(n)[1].value
        row[1]=sheet_data.row(n)[2].value
        row[2]=sheet_data.row(n)[0].value
        row[3]=sheet_data.row(n)[3].value
        cursor.updateRow(row)
        n+=1

3 執行結果

  執行上述程式碼,即可得到包含有表格檔案中所列全部站點的點要素向量圖層檔案,且其屬性表中包含了原有表格檔案中全部列所對應的欄位與內容。

  檢視該圖層屬性,可以看到其已經具有了我們在程式碼中所指定的投影座標系。

  至此,大功告成。

相關文章