第五章、 模組開發
第二節、 模組功能(函式)開發
PsAddClassify 使用者新增面物件分類類別。
PsFillHole 填補面物件之空洞。
函式語法 PsDataCheck(InputFeatures)
參數 說明 資料類型
在原圖資屬性欄位新增分類欄位。使用者可以透過常用的程式編輯器或記 事本方式,開啟與編輯分類表來新增面圖資的分類屬性欄位(如圖 21)。
表 10:新增類別欄位函式語法與參數
函式語法 PsAddClassify(ClassifiedTable_pac,InputFeatures)
參數 說明 資料類型
ClassifiedTable_pac 新增類別分類表。 PAC 檔
InputFeatures 欲新增類別的面圖層。 面圖層
OutputFeatures(預設) 新增類別後的面圖層,檔名同輸入面圖層檔名。
(InputFeatures.shp) 面圖層
圖 21:新增分類表格式
由於增加類別,主要透過Python 的字典型態(dictionary type)來儲存分 類類別(即 key 為舊有分類類別,value 為新增分類類別)。因此,在執行函 式時,會有兩種情況產生,第一種情況是如果舊有類別有重複分類,其新 增分類欄位的分類類別會以最後一筆為分類類別(即 key 相同,value 更 新)。第二種情況為舊有類別有遺漏缺失,在程式設計上會在新增的類別給 予Null,表示空值無資料(如圖 22)。
舊有分類欄位 新增分類
圖 22:新增類別欄位函式分類資料處理機制 (三)填補面空洞
另外,ArcGIS 具有處理面物件有洞情況。即在計算周長時,除了面物 件外面邊緣長度之外,還包含面物件內部有洞的邊緣長度。除了長度之 外,面物件節點的記載分布,也是由面物件裡面記載到外面(為節點由內部 空洞邊緣記載到面物件外圍邊緣)。
在這種面物件有洞情況之下,不利於計算一個面物件的形狀,會產生 錯誤的計算結果。例如計算面物件角度,為同邊緣上連續三節點來計算一 角。如果面物件有洞,節點座標的紀錄不會分類邊緣內外,以致發生計算 角度的錯誤。
為了解決面物件有洞,以致計算部分形狀指數的錯誤(角度、形心距 離),本函式開發了填補面空洞函式(如表 11)。函式透過調用最小幾何邊界 函式(Minimum Bounding Geometry)求出面物件的範圍。利用擦除(Eraser)得 到最小幾何邊界之內且面物件以外的部分,再扣除面積最大的部分,即為 面物件空洞部分。最後使用聯合(Union)與融合(Dissolve)把面物件空洞填補 起來(如圖 23)。
表 11:填補面空洞函式語法與參數
函式語法 PsFillHole(InputFeatures)
參數 說明 資料類型
InputFeatures 含有空洞的面圖層。 面圖層
OutputFeatures(預設) 填補空洞後的面圖層。
(輸出檔名:InputFeatures_FillHole.shp) 面圖層
圖 23:PsFillHole 函式填補面空洞前(左)後(右)效果 二、面物件幾何特徵
面物件幾何特徵子模組(如表 12),包括量測面物件的面積、周長、長軸長 (長度)、短軸長(寬度)、長軸方向(走向)、相關圓(包含相同面積圓、最小外接 圓、最大內切圓)的圓心與半徑等。上述基本的幾何特徵的計算,主要透過面幾 何資訊(PsPolygonInfo)與面相關圓(PsCircle)兩個函式來實現。最後,透過面形 狀指數函式(PsShapeIndex)呼叫前兩者函式獲得幾何參數,來計算常用的形狀指 數,如表16。分別以下說明之。
表 12:面物件幾何特徵子模組各函式概述
函數 函式說明
PsPolygonInfo 計算面物件面積、周長、長度、寬度、走向。
PsCircle 計算面物件相關圓:相同面積圓、最小外接圓、最 大內切圓之圓心座標與半徑。
PsShapeIndex 計算面物件的角度。
(一)面幾何資訊
面幾何資訊函式(如表 13),利用 ArcPy 的搜索游標(SearchCursor)來讀 取每一筆面物件資訊,並透過幾何令牌(geometry tokens)方式來取得面積與 周長。並透過最小邊界幾何 (Minimum Bounding Geometry) 函式的運算(按 照寬度輸出矩形),計算每個面物件的長軸長、短軸長與走向。
表 13:面幾何資訊函式語法與參數
函式語法 PsPolygonInfo(InputFeatures)
參數 說明 資料類型
InputFeatures 欲計算面幾何資訊的面圖層。 面圖層
OutputJSON(預設) 計算後的面幾何資訊。
(輸出檔名為 InputFeatures_PolygonInfo.json) JSON 檔
輸出暫存檔(預設) 計算後的面幾何資訊。 Python 字典型態
函式語法 PsCircle(InputFeatures,LoopTimes=None)
參數 說明 資料類型
(輸出檔名為 InputFeatures_Circle.dbf) DBF 檔
輸出暫存檔(預設) 計算後的面相關圓資訊。 Python 字典型態
圖 24:PsCircle 函式中相關圓圓心與半徑計算
至於,最大內切圓,其圓心不在trueCentroid,而是 label point(標注 點)。但標注點並不是完全符合每個面物件的內切圓圓心,因此透過 while 迴圈不斷的利用標注點與面物件邊界距離,反覆修正內切圓圓心位置。不 過透過程式迴圈反覆求取圓心與半徑方式,面對大筆資料運算容易產生運 算時間過長或錯誤的情況。所以在程式開發語法上運用try-except 來確保程 式能順利執行。此外,在函式設計上,會需要使用者給定迴圈運算次數(避 免無窮迴圈)。如果使用者沒給定參數,則程式系統則預設運算次數 10 次 來求取圓心與半徑。
上述兩個函式主要負責面物件幾何資訊的計算。在檔案輸出部分,計算結 果主要以Python 的字典型態儲存,因此面幾何資訊函式資料輸出,選用格式相 近的JSON 檔(.json)來儲存。另外,面相關圓函式主要計算面物件的相關圓圓心 坐標與圓半徑。故程式開發過程時,考量方便可以在ArcGIS 畫圓,選擇以 DBF 檔(.dbf)格式輸出。
(三)面形狀指數
透過函式的計算,使我們更容易取得面物件的幾何資訊,更能進一步 利用這些資料,來度量面物件的形態。過去在面資料的形狀度量上,相關 學者運用面物件的面積、周長與長度當做面物件形狀的度量元素,並衍生
出許多的形狀指數,包括常見的周長-面積比,景觀生態指數中的形狀指 數、碎形維度,以及水文學度量流域與集水區形狀的環性比、長性比等 (Maceachren 1985、Mcgarigal 1995、Bardossyb and Schmidt 2002)。此外,
學者也運用面物件的最大內切圓、最小外切圓、相同面積圓等元素,來衡
函式語法 PsShapeIndex(InputFeatures)
參數 說明 資料類型
InputFeatures 欲計算面形狀指數的面圖層。 面圖層 OutputFeatures
(預設)
計算後具面形狀指數的面圖層。
(輸出檔名:InputFeatures_ShapeIndex.shp) 面圖層 輸出暫存檔
(預設) 計算後的面形狀指數資訊。 Python
字典型態
表 16:既有相關形狀度量指數與公式
形狀指數分類 指數名稱(函式中簡稱) 公式
周長面積比 Perimeter/Area ratio (PAR1) 𝑃 𝐴
周長面積比 Perimeter/Area ratio (PAR2) 𝑃
√𝐴
周長面積比 Perimeter/Area ratio (PAR3) 0.28𝑃
√𝐴
面積周長比 Area/Perimeter ratio (APR1) √𝐴 0.28𝑃
面積周長比 Area/Perimeter ratio (APR2) 𝐴 (0.28𝑃)2
面積周長比 Aeal form factor (APR_AFF) 𝐴 𝑃2
相關圓參數 Parameters of related circles (PORC1) 4𝐴 𝜋 ∙ 𝐿2
相關圓參數 Parameters of related circles (PORC2) 4𝐴 𝜋 ∙ 𝑅𝑚𝑖𝑛𝐶2
相關圓參數 Parameters of related circles (PORC3) 𝑟𝑠𝑎𝑐 𝑟𝑚𝑖𝑛𝑐
相關圓參數 Parameters of related circles (PORC4) 𝑟𝑚𝑎𝑥𝑖𝑐
𝑟𝑚𝑖𝑛𝑐
相關圓參數 Parameters of related circles (PORC5) 𝑚𝑎𝑥𝑖𝑐 𝑚𝑖𝑛𝑐
相關圓參數 Parameters of related circles (PORC6) 𝑅𝑚𝑎𝑥𝑖𝑐
𝑅𝑚𝑖𝑛𝑐
相關圓參數 Parameters of related circles (PORC7) 𝑚𝑎𝑥𝑖𝑐 𝐴
景觀生態指數 Shape index_Vector (SI_R) 𝑃
2√𝐴 ∙ 𝜋
景觀生態指數 Shape index_Raster (SI_S)
*註:該公式為網格式形狀指數
0.25𝑃
√𝐴
景觀生態指數 Fractal dimension_Vector (FD_R) 2 log 𝑃 log 𝐴
景觀生態指數 Fractal dimension_Raster (FD_S)
*註:該公式為網格式形狀指數
2 log(0.25𝑃) log 𝐴
流域形狀指數 Compactness (BasinSI_C) 𝑃
2√𝜋 ∙ 𝐴
流域形狀指數 Form factor (BasinSI_F) 𝐴
𝐿2
流域形狀指數 Basin circularity (BasinSI_c) 4𝜋 ∙ 𝐴 𝑃2
流域形狀指數 Basin elongation (BasinSI_E) 2√𝐴 𝐿√𝜋
資料來源: Ebdon 1985、Maceachren 1985、Mcgarigal 1995、Bardossyb and Schmidt 2002
圖 25:面形狀指數計算後屬性資料表 三、面物件節點與角度
除了利用面物件幾何特徵,如周長、面積、長度與相關圓形,做為度量面 物件形狀的依據外,本研究嘗試利用角度與節點來度量形狀。該子模函式,如 表17。
表 17:面物件節點與角度子模組各函式概述
函數 函式說明
PsAngle 計算面物件的角度。
PsAngleStatistics 計算面物件角度數量、銳角數等。
PsCentroidDistance 計算面物件形心距離平均值、標準差、變異係數。
PsConvexHull 計算面物件凸面面積、非凸面面積、非凸面面積比。
(一)面角度
面角度函式(如表 18)利用 SearchCursor 方式讀取每一筆面物件,並透 過幾何令牌(geometry tokens)可以快捷取得每筆面物件節點座標(或其他物 件幾何資訊)。由於每一面物件節點座標中是依序性地被記錄下來,故可以 透過連續三點座標來求取一角角度,即點1、2、3,可求第 2 點為頂點的 角度。面物件的角度,如公式5-2-2~4。
表 18:面角度函式語法與參數
函式語法 PsAngle(InputFeatures)
參數 說明 資料類型
InputFeatures 欲計算面物件角度的面圖層。 面圖層
OutputJSON(預設) 計算後的面物件角度資訊。
(輸出檔名為 InputFeatures_Angle.json) JSON 檔
輸出暫存檔(預設) 計算後的物件角度資訊。 Python 字典型態
由於最後一點節點跟第一個節點是重複的,因此需要去除最後一點,
才能正確的求得角度。計算完角度後,將直線上的點所產生的角度(接近 180 度)與 nan(非數值,角度太小)去除。最後,將計算結果(Python 字典型 態)保存在與字典形態相似的 JSON 檔輸出。
函式語法 PsAngleStatistics(InputFeatures)
參數 說明 資料類型
InputFeatures 欲計算面物件角度統計值的面圖層 面圖層
OutputFeatures (預設)
計算後具面物件角度統計值的面圖層
(輸出檔名:InputFeatures_AngleStatistics.shp) 面圖層
輸出暫存檔(預設) 計算後的面物件角度統計值資訊 Python 字典型態
圖 26:面銳角數統計
(圖中編號為面物件編號,括號中數字為銳角數。面顏色越紅代表銳角數多,面 顏色越綠代表銳角數少)
(三)面形心距離
除了用角度度量形狀,本研究也透過形心距離來衡量面物件的形狀。
面形心距離函式(如表 20)透過幾何令牌取得每一個面物件幾何中心(即重 心、質心或形心),並透過程式計算該物件節點與幾何中心之間的距離,做 統計分析(公式 5-2-5、5-2-6)。
表 20:面形心距離函式語法與參數
函式語法 PsCentroidDistance(InputFeatures)
參數 說明 資料類型
InputFeatures 欲計算面形心距離統計值的面圖層。 面圖層
OutputFeatures (預設)
計算後具面形心距離統計值的面圖層。
(輸出檔名:InputFeatures_CentroidDistance.shp) 面圖層
輸出暫存檔(預設) 計算後的面形心距離統計值資訊。 Python 字典型態
由於物件節點的多寡與分布會影響到形心距離的樣本,尤其在面物件 的轉折處節點,所計算出來的距離會影響形心距離的統計結果(如圖 27)。
在計算形心距離之前,函式會先以預設距離來增密節點。但由於增密節點 是將原本節點再加上增密後的節點,雖然節點變得更均勻分布,但轉折處 仍然有節點集中之情況。此時必須設定節點距離閥值(預設閥值為公式 5-2-7)來篩選節點,如果節點之間距離小於閥值,則該節點不採計,篩選後節 點(如圖 28),可發現除了節點均勻分布之外,而且避免轉折處節點集中的 情況。
篩選完面物件之節點後,再來計算形心距離與統計,並將統計數據存 放置於新檔屬性欄位。透過形心距離的分析,可發現該面物件中形心距離 彼此差異越大,即變異係數越大,其形狀也越崎嶇(如圖 29)。
節點形心距離(𝐷𝑛𝑐) = √(𝑛𝑥− 𝑐𝑥)2+ (𝑛𝑦− 𝑐𝑦)2 (公式 5 − 2 − 5) 形心距離(𝐶𝐷) = 𝐷𝑛𝑐1+ 𝐷𝑛𝑐2+ ⋯ + 𝐷𝑛𝑐𝑛 (公式 5 − 2 − 6) 𝑛𝑥:該面物件邊緣上節點𝑋座標;𝑛𝑦:該面物件邊緣上節點𝑌座標;
𝑐𝑥:該面物件邊緣上節點𝑋座標;𝑐𝑦:該面物件邊緣上節點𝑌座標;
𝑛:該面物件節點個數。
𝑛:該面物件節點個數。