2021年6月17日 星期四

QGIS疑難雜症-csv資料無法joins到shp檔

「為什麼我的csv檔無法joins到shp檔中?」「joins後為什麼表格欄位還是一片空白?」 

csv資料joins到shp檔,這個功能是很常被使用到的。QGIS部分核心算法是使用python語法運行,因此也會產生出部分python語法問題。這個情況在csv資料joins到shp檔中很常發生。

解決這個問題前,需要對於python與QGIS資料類型有一定的認識

第一部分:python資料型態的類別

在python環境中資料型態被分類為幾種,例如:字串(string)、整數(int)、浮點數(float)。


這種分類資料型態的方式,excel中也可以被看到,只不過excel是分類的更加詳細。

字串(string):就是文字的意思,這種資料類型無法被+-*/運用。例如:「新北市」。

整數(int):可以進行數學運算,不會有小數點。例如:「10」

浮點數(float):也可以進行數學運算,會有小數點。例如:「3.14159」

布林值(Boolean):布林值的結果只有True與Flase,就像是投擲硬幣會產生的結果一樣,只有正面與反面。

當然還有更多資料類型,這裡我只列舉最常會用到的。

 第二部分:QGIS資料型態的類別


QGIS資料型態的類別
  1. Date:日期。可以接受的格式像是2021/06/18或者2021-06-18。部分符號使用的細微差異端看使用演算法的接受度。
  2. DateTime:日期與時間。與Date不同點在於加入時間,例如「2021/06/18 11:58:30」,格式還是會有細微的差異,例如要不要加入AM,PM與使用12小時或使用24小時制。有關於Date與DateTime的資料使用,之後我會再寫一篇關於「Temporal」套件的文章。
  3. Double:浮點數的一種。於其他程式語言中Double與Floatt都是很常被使用到的資料類型。差別在於精度。例如:「3.14159」。
  4. Real:實數,整數的一種。
  5. Integer:整數的一種。例如:「10」。
  6. Integer64:整數的一種。與Integer差別在於資料精度。
  7. String:字串。除了文字可以作為字串外,數字也可以。例如:「100」。
  8. Boolean:布林值。數值表現只會有兩種。

第三部分:如何判斷資料的格式型態

  1. Source Fields:
    1. 點及圖層滑鼠右鍵 -> Properties -> Source Field



  2. 開啟屬性表格:
    1. 點及圖層滑鼠右鍵 -> 開啟屬性表格

    2. 「ID」與「建物樓層數」數字都是靠右,「圖名代碼」、「房屋型態碼」與「房屋結構碼」都是靠左。代表靠右的資料型態是Real或Integer(數值),靠左的資料型態是String(字串)。

第四部分:為何csv資料無法joins到shp檔?

csv檔匯入GIS後,資料一律會被視為String(字串),不論一開始csv檔中的資料格式設定是什麼,都會產生這個結果。

如果你要進行joins的資料欄位其中一個是Real(整數)(要被加入csv資料shp圖層的欄位),另一個是String(字串)(csv資料的欄位),那就不會加入成功。

第五部分:解決方法1「重構欄位


使用功能「重構欄位」,於地理運算工具列輸入「Refactor fields」或「重構欄位」

更改csv資料或是shp檔的資料類型,確保兩個檔案要進行joins的欄位資料類型一致,可以都是string,也可以都是Integer。

第六部分:解決方法2「新增欄位」

舉例來說,假如我要使用shp檔「ID」的欄位進行joins,現在「ID」的資料型態為Real。csv檔的資料型態為String。需要創造一個資料型態為String的「ID」

  1. 點及圖層滑鼠右鍵 -> 開啟屬性表格 ->開啟欄位計算(屬性表格的右上方,一個長的像是計算機的符號)。


  2. 新增欄位「ID2」(QGIS表格中不建議欄位名稱一樣),修改欄位資料型態為文字(字串)。


  3.     點及「欄位與值」,會看到shp檔中所有的欄位,將「ID」欄位加入到旁邊的表示式。
  4. 按右下角「OK」進行輸出。
  5. 之後就會在shp檔中創立一個欄位「ID2」,數值與「ID」一模一樣,差別在於資料類型不同而已,這樣就可以把csv資料joins到shp中了。

如果按照這個方法問題還是無法解決,請留言告訴我





3 則留言:

  1. 您好,近期遇到此問題而找到您的方法,嘗試利用重構將join欄位均用為文字(字串)後,仍無法顯示屬性。
    將shp和csv的join欄位資料利用excel校對後已確認均有相同的資料內容及數量,但就是無法順利join顯示屬性,目前仍找不出解決辦法......

    回覆刪除
  2. 您好我是剛才匿名留言的人,
    多方嘗試後發現,因csv係由excel轉換而來,若欄位名稱保留有excel單一儲存格多行文字的情況會造成join無法顯示屬性資料,把多行改為單行後join就成功了。

    回覆刪除
    回覆
    1. 抱歉現在才看到您的留言,謝謝您的分享~

      我以前的csv的欄位名稱都是單行,還是第一次看到這樣的狀況

      除了我的部落格,下次遇到時也可以QGIS小學堂上問問看,裡面的人都還挺友善的

      刪除