屬性的連結 (join)

屬性的連結是一個很常進行的操作過程。概念上是,有一個空間圖層資料,例如縣市資料;另一方面有一個表單,表單內容的每一筆(row)是一個個縣市,欄位包含了其他空間圖層資料所沒有的屬性資料 (例如外籍配偶數之類)。這時候需要讓 QGIS 幫我們將這些表單中的資料依縣市連結到空間圖層的屬性資料中。

這過程順利的話很快就完成了,但常常會遇到一些狀況,以下舉一些常出現的疑難雜症及其對應的解決方案供大家參考。

以下用縣市資料 以及外籍配偶的csv 作說明。

資料

縣市資料: 界面000


待連結的表單資料: 界面001


將表單資料匯入 QGIS 中

將表單資料 (csv) 匯入的方法主要是點左邊的逗號: 界面002


選到 csv 檔案: 界面003


這時候發現一個問題,就是 讀進來的檔案中的中文變成亂碼: 界面004


透過右邊的下拉選單(Encoding),選到 Big5 (以這個檔案為例): 界面005


這時候中文字就可以看得到了,不過看起來還無法按確認: 界面006


這是因為目前的匯入過程並沒有告訴 QGIS 這檔案的空間資訊(geometry)。因為這個表單中沒有空間資訊(例如經緯度),所以要宣導 No geometry (無幾何資訊),然後就可以按 OK 確認匯入: 界面007
直接將 csv 檔拖拽到圖層的位置雖然也可以匯入,不過這時候 QGIS 會預設使用者是在加入圖層,所以這時候軟體會當作這個資料中都是「字串」。以我們的例子是要將外籍配偶人數(也就是整數資料)匯入,所以不能用這種方式,而應該用上面建議的方法。

觀察並確認連結的依據欄位:

打開屬性表: 界面008


看起來 csv 的「縣市代碼」欄位是縣市的 ID: 界面009


再打開縣市圖層的屬性表,看起來 「COUNTYCODE」 是一樣的縣市 ID: 界面010
這時候發現一個問題,就是縣市圖層的中文字是亂碼,所以以下稍微調整圖層的 encoding。

來到圖層的 properties: 界面011


在 Data source encoding 的部分,改成 Big5: 界面012


看起來中文是沒問題了: 界面013


連結表單

連結表單的地方在 圖層的 properties,進入 Joins 分頁: 界面014


點一下下方的「 + 」號按鈕,然後在 Join layer 選擇剛剛匯入的 csv,Join field 是 csv 中的連結欄位, Target field 則是圖層的連結欄位。點開 Choose which fields are joined,這裡示範的是將所有 csv 中的欄位都連結到圖層中: 界面015


再打開圖層的屬性表,連結這個動作算是完成了: 界面016
不過還有一些問題,以下分別說明。

問題一 - 有些縣市的 COUNTYCODE 不完整:

這部分看起來是圖層的 COUNTYCODE 不知道什麼時候發生問題,在臺北市、臺中市等,6字開頭的代碼都只剩兩位數字: 界面016


觀察一下 csv 表單,這些地方的代碼後面有 3個0: 界面017


所以要修正圖層的屬性表中的代碼: 界面018


打開編輯模式: 界面019


在COUNTYCODE 的各個需要修正的代碼,點兩下,然後加入 “000”: 界面020


就像這樣: 界面021


修正好這樣: 界面022


儲存編輯: 界面023


關閉編輯模式: 界面024


習慣上,先把原本的 Join 給關掉: 界面026


再重新 Join 一次: 界面027


套用,確認: 界面028


原本那些臺中市等地區都 Join 好了: 界面029
但還有另一些問題,兩個外島Join不到。

問題二 - 有些縣市的在 csv 不完整:

這邊看起來外島的 COUNTYCODE 前面有 0,這在 csv 或 excel 表單中可能會少了這種在前面的 0: 界面029


觀察 csv 的代碼,果然是前面少了 0: 界面030
不過這時候沒辦法直接在 qgis 中作修改,需要到文字編輯器來處理。

先把 Join 移除: 界面031


先把匯入的表單也關掉: 界面032


從文字編輯器打開,然後補上 0: 界面033


補完之後,儲存並關掉: 界面034


試著重新匯入: 界面035


把 csv 的表單打開來看看,卻發現縣市代碼沒有被修正好: 界面036
這問題很常見,是因為這個欄位都是數字, QGIS 自動將這個欄位當作是整數(Interger),可是這欄位應該要是文字(String)。以下說明如何先給定 csv 各個欄位的資料格式。

先將這表單關掉: 界面037


設定好 csv 的欄位的資料格式

產生一個文字檔: 界面038


文字檔的檔名跟 csv 要一樣,副檔名要改成 .csvt: 界面039


因為從 .txt 改成 .csvt ,所以 Windows 會提醒並向你確認「你真的要作這樣的修改嗎」,點確認: 界面040


這時候可以同時打開 csv 檔及 csvt 檔案,然後一個個將欄位的資料格式寫入,例如: 界面041
其中,String 表示這欄是文字,Integer 表示是 整數, Real 表示是實數(包括小數位數)。用英文的雙引號包起來,然後用逗點分隔。

csv 中總共有 9個欄位,所以這檔案也要有 9個資料格式: 界面042
完成後,儲存,關閉。

再一次匯入 csv 檔: 界面043


一樣的設定: 界面044


打 csv 的開屬性表,這時候可以發現代碼欄位是靠左的,表示是文字格式,兩個 rows 前面的 0 也出現了: 界面045


再一次進行 Join: 界面046


界面047


界面048


界面049


這時候金門連江的問題都解決了: 界面050


將 Join 好的空間圖層匯出 + 修改匯出後的欄位名稱:

對 Join 好的圖層點右鍵,選 Save as... 界面051


確認 Format 是 ESRI Shapefile: 界面052
若需要選其他類型的輸出檔案,也可以在這調整,例如 Geojson 之類。確認好匯出圖層的位置與檔名,以及 Encoding、投影座標系統等之後,就可以按 OK 確認匯出。

修改欄位名稱

匯出完成後,可以發現預設是修改了 Join 的欄位名稱: 界面053
跟原來 Join 的圖層(未匯出) 比對,可以發現這些預設的欄位名稱其實順序跟原來 Join 好是一樣的。

對匯出的圖層點右鍵, Properties: 界面054


去到 Field 分頁,點那隻筆的按鈕進入編輯模式: 界面055


在這裡,可以直接對欄位名稱點兩下,進行欄位名稱的修改: 界面056


照著順序修改好後,可以再點一次那隻筆,結束編輯模式: 界面057


點儲存編輯: 界面058


這時候可以點套用、確認來完成欄位名稱的編輯: 界面059


再次打開匯出後的圖層,欄位名稱已修正: 界面060


刪除不必要欄位

發現有兩個欄位是重複的,這是前面在 Join 的時候為了確認而特意留下的,不過這時候已經確認 Join 沒問題,所以可以將他們刪除。打開編輯模式: 界面061


點工具欄中,倒數第三個,有紅色的按鈕: 界面062


將從 csv 連結過來而產生的縣市名稱與代碼選取,並點 OK確認: 界面063


那兩個欄位就被刪除了: 界面064


點儲存編輯: 界面065


結束編輯模式: 界面066


完成整個 Join + 匯出圖層 + 欄位修正 + 欄位刪除的動作: 界面067