2022年6月16日 星期四

QGIS疑難雜症-SHP圖層拓樸校正

「為什麼我的圖層無法進行空間運算?」、「出現無效幾何( invalid geometry)的問題,我應該如何處理?」、「出現Please fix the geometry or change the Processing setting to the “Ignore invalid input features” option.,我要怎麼辦?」、「要如何檢查圖層是否有拓樸錯誤?」


    會產生上述的問題,代表你的圖層出現了拓樸錯誤,而系統無法進行運算才會導致報錯。

    那什麼是拓樸呢?出現了拓樸錯誤要如何解決?以下文章將解釋這些問題。

    本文章使用QGIS環境為:QGIS 3.18.2 with GRASS 7.8.5

第一部分:什麼是幾何拓樸的有效性?

    根據林政道老師QGIS第一講 數位化向量地圖中的解釋,向量圖層必須要符合三個規則。

  1.     多邊型必須要閉和。
  2.     如果多邊型內部有洞,必須是在一個封閉的多邊型裡面產生,也就是這個洞必須要有自 己的邊界。
  3. 多邊型不可以自我交會(self-intersection)。這裡的多邊型代表A多邊型不可以與自己(A多邊型)產生交會,但可以與其他的多邊型交會,例如:A多邊型與B多邊型可以是有重疊的區域,如果兩個多邊型皆屬於A多邊型但是卻重疊了,就換產生拓樸上的錯誤。
有趣的是,我們在QGIS進行圖徵數化時,即使當下有發生拓樸錯誤,但還是可以把shp檔進行儲存,但許多QGIS演算法運行時,檔案還是會報錯。

而當使用影像向量化時,也很容易會出現SHP圖層拓樸錯誤,像是我寫的文章QGIS技術-影像計算(Raster calculator),將WMTS圖磚轉換為向量資料,把影像檔轉換成向量檔時,有機率會出現錯誤。

第二部分:如何檢查圖層是否有拓樸錯誤?

 QGIS內部附有檢查SHP檔是否有錯誤的工具,名稱為「檢查有效性」(Check validity) 。路徑為:「向量」->「幾何工具」->「檢查有效性」。 

該工具可以檢查出許多錯誤的種類,例如:Repeated point(重複點)、Self-intersection(自我交會)。裡面的錯誤種類相當多,我就不一一解釋,有興趣的人可以點選此連結

            

「檢查有效性」工具的路徑


使用「檢查有效性」時,有許多選項可以選擇,像是輸出錯誤區、輸出無效區與輸出有效區

目前我遇到的拓樸錯誤種類都是自我交會,以下將以自我交會的案例進行說明。

QGIS官網對於自我交會(Self-intersection)的解釋


第三部分:使用「fix geometries」進行拓樸修正


「fix geometries」是QGIS內建的演算法,從地理運算工具箱的地方輸入「fix geometries」就可以找到此工具。

QGIS內建的「fix geometries」演算法


開啟「fix geometries」的畫面



通常大多數的自我交會拓樸錯誤,都可以使用此步驟處理完成,但還是會有少數節點(node)無法透過此方式進行拓樸修正,在國外論壇的文章我查到一種很有趣的也很簡單的處理方式,該網友把經過「fix geometries」處理後,但還是有自我交會錯誤的圖層,使用buffer演算法並在距離參數輸入「0」進行運算後,問題就完美解決了。

QGIS內建的「buffer」演算法,中文名稱為「輪廓」

使用buffer演算法時,記得要先把投影座標系統(EPSG)設定成以「公尺」為單位的投影座標系統,像是EPSG:3826。

除了距離調整為0以外,EPSG也記得要一起檢查


這方法實在是跌破我的眼鏡,過往我還要用手動修改節點的方式,把每個點的位置調整好才能順利完成拓樸校正,想不到有如此簡單的方法!!!


 第四部分:使用「v.clean」進行拓樸修正

「v.clean」是grass提供的演算法,對於shp與拓樸錯誤種類有更詳細的設定要求,也假設了更多拓樸錯誤的情境,例如:Remove or change bridges connecting an area and an island or two islands(拆除連結一個地區的橋樑)。有許多設定我並沒有看懂,「v.clean」詳細的解釋可以參考此連結

通常當我「fix geometries」與「buffer」的方法無法解決我遇到的問題時,我才會使用「v.clean」進行處理。還是建議大家可以用「fix geometries」處理時就用他。


「v.clean」搜尋位置

「v.clean」演算法視窗畫面


「v.clean」選擇輸入shp圖層的種類與類型。

「v.clean」解決拓樸錯誤時,可選擇的方法

   

第五部分:使用「頂點編輯器」進行拓樸錯誤處理

當你用盡了現有的所有工具,還是無法解決問題時,建議再用此方法,把他當成是最後手段,因為此方法除了很浪費你的時間以外,也很容易吃電腦資源(尤其是圖層很大時)。

打開頂點編輯器(vertex tool)前,需要先開啟圖層的編輯狀態,點選「Toggle Editing」選項,就可以進行圖層編輯。

「Toggle Editing」的點及按鈕,黃色的鉛筆

打開「Toggle Editing」後,找到頂點編輯器(vertex tool)的按鈕,並選擇「All Layers」




頂點編輯器打開後,可以看到組成這個多邊形的所有節點(node),並親自增加、刪除或移動節點的位置,改變多邊形的同時,也手動校正拓樸錯誤。

            

畫面中的圖層存在自我交會的錯誤,另外紅色點就是節點。

 

手動調整節點位置,修正拓樸錯誤


以上就是我目前解決拓樸錯誤的方法,如果這三種方法還是無法解決你的問題,請在下方留言跟我說。




沒有留言:

張貼留言