在arcgis中編碼方式改變引起的shp文件亂碼、字符截斷問題處理

我們有時候使用arcgis讀取shp文件的時候,打開屬性表發現存在中文亂碼的情況,或者屬性表中字符項長度縮減的情況,這都是arcgis版本升級後,使用不同編碼方式讀取 數據造成的。

1、亂碼問題

Shapefile是上個世紀90年代的數據格式。Shapefile文件的頭文件(dBase Header)中,一般會包含shapefile使用的編碼類型的信息,這個信息成爲 LDID ( Language Driver ID),這樣在使用應用程序打開 shapefile 的時候,應用程序就知道用何種編碼類型去正確讀取它,而不會發生亂碼。 在 ArcGIS Desktop 生產的 shapefile 數據中通常會包含這項信息。在Shapefile的子文件中,有時我們還會發現同名 *.cpg 文件,文件中也存儲了編碼信息,用記事本打開,看到例如 utf-8。

二者被ArcGIS 識別的優先順序是,LDID 優先於 CPG文件。也就是如果頭文件中沒有約定讀shapefile的編碼類型時,如果這時剛好有個CPG文件,那麼ArcGIS就會使用這裏的編碼類型讀取。

使用 ArcGIS for Desktop 打開 dBase 表文件時,程序先去讀頭文件中的  Language Driver ID (LDID) 或者是同名 *.CPG文件。前面二者都是用來在讀文件之前,決定用什麼編碼類型來正確讀出文件。如果有必要, ArcGIS for Desktop 會進行編碼轉換來顯示字符串。

如果文件缺失 LDID 或者  .CPG 文件,編碼就會被假定爲 Windows (ANSI/Multi-byte)。也是因爲這個原因,如果文件是 OEM 編碼的,並且沒有寫入 LDID 或者 .CPG,字符就會出現亂碼。 也就說 ArcGIS 把 OEM 文件當成 ANSI 文件來處理了。

多數情況下, shapefiles 和 dBASE 文件都會存儲編碼頁信息。 但是有些程序的 OEM 文件沒有包含編碼頁信息,例如 Microsoft Access 2000 and Excel 2000,所以這些文件讀取時,就會亂碼。爲了避免這個問題,用戶可以給沒有編碼頁信息的文件設置
dbfDefault

在註冊表中設置 ‘dbfDefault’ ,可以決定導出的 shapefile 和 dBASE 的編碼類型。例如,把 ‘dbfDefault’ 設置爲 OEM ,那麼用 ArcMap, ArcCatalog, ArcToolbox 生成出來的 shapefile 和 dBASE 文件就是以 OEM編碼的,設置成 ANSI ,那 shapefile 和 dBASE 文件就是 ANSI 編碼的。

讀 shapefile 和 dBASE 文件的邏輯與寫是相同的,如果缺失編碼信息,ArcGIS 讀取文件的編碼類型由 dbfDefault決定。

我們知道 shapefile 是個開放格式,只要你瞭解了數據規範,完全可以脫離ArcGIS自己生產出來。在Windows中文語言設置下,假設你自己寫代碼或者使用第三方的程序生產了shapefile,例如MapGIS,默認使用 CP936(GBK)編碼存儲,但是無論粗心大意還是有意爲之沒有在數據頭文件中約定“我用了936!”。如果是 ArcGIS 10.2 和之前的版本,那麼沒問題,ArcGIS 默認就是以這種方式識別,沒有亂碼。可是拿到 ArcGIS 10.2.1 ,ArcGIS 10.2.2,ArcGIS 10.3.x 這幾個版本中發現亂!碼!了!在缺失 LDID 和 CPG時,這幾個版本默認使用 UTF-8 來讀取 shapefile,這樣必然亂碼

解決方法

在shapefile子文件旁邊創建個記事本,修改爲同名的CPG文件,文本內容oem或者936

再次打開,沒有亂碼。

 

字符截斷問題

ArcGIS 10.2 以及更早的版本,ArcGIS寫shapefile的時候,遇到中文默認使用Windows當前語言 字符集編碼(也稱 代碼頁/CodePage/OEM CodePage),例如中文一般使用的是 CodePage 936(GBK)

ArcGIS 10.2.1 以及之後的版本,ArcGIS寫shapefile的時候,默認使用的是 UTF-8 編碼類型。

這兩種編碼類型存儲漢字所使用的字節數是不相同的,上面的關鍵字中我也給出了 wiki 的鏈接,有興趣點進去看看詳情。簡言之,shapefile自身的限制是字段爲9個字節,CP936編碼下漢字通常爲雙字節存儲,因此可以存儲 9/2=4 個漢字;UTF-8 編碼下漢字至少需要3個字節存儲,因此最多隻能存儲 9/3=3 個漢字了。

解決方法

Perfect Solution

使用地理數據庫,放棄shapefile,避免各種截斷問題,這也是存儲地理數據的康莊大道。

但是,shapefile的擁躉說“我的需求是恢復以前存儲4個漢字的shapefile,我不想用地理數據庫,我希望得到老版本的shapefile的結果,我不在乎shapefile的編碼類型是什麼 ……bla bla……”好吧,方法還是有的。

Workaround

這裏還有個注意事項:
如果你用的剛好是 10.2.1 和10.2.2 這兩個版本,那麼要打補丁後以下設置才生效。以前寫過另外一篇,詳情點 這裏
如果你用的是 10.3.x ,那麼直接向下進行。

  1. 打開註冊表,定位到 ‘My Computer\HKEY_CURRENT_USER\Software\ESRI\Desktop 10.x
  2. 創建項 ‘Common‘, 接着在其下創建 ‘CodePage‘ 項, 添加 ‘字符串’,名稱: dbfDefault,健值:oem(或者 936)

這樣ArcGIS Desktop 讀、寫 shapefile的默認方式就將是Windows當前語言 OEM CodePage 936

當然這種方法,也可以解決第一個問題,並且不需要爲缺失oem編碼信息的數據增加cpg文件了。兩種方法,任君選擇。

‘dbfDefault’ 設置方法

  1. 開始 – 運行,輸入”Regedit“,打開 註冊表

  2. 如是用的是 10.x 版本 ArcGIS Desktop,定位到 My Computer\HKEY_CURRENT_USER\Software\ESRI\Desktop 10.x. 如果是9.3.1之前的版本,定位到 'My Computer\HKEY_CURRENT_USER\Software\ESRI'

  3. 創建項 Common, 接着在其下創建 CodePage 項, 添加 字符串 ,名稱: dbfDefault ,健值: oem (或者936

 

如下爲支持的編碼值:

OEM Code Page Values:

OEM, 437, 708, 720, 737, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 932, 936, 950

ANSI Code Page Values:

ANSI, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, Big5, SJIS 

ISO Code Page Values:

ISO, 88591, 88592, 88593, 88594, 88595, 88596, 88597, 88598, 88599, 885910, 885913, 885915, EUC

Unicode Values:

UTF-8

 

現在,Shapefiles 可以以 UTF-8 存儲,但是,只有在 ArcGIS Desktop 中才能被識別。

附:shape文件的原生侷限性

Shapefile 是一種開放的非拓撲的簡單幾何數據類型,深受數據處理人員的喜愛。 Shapefile 利用 dBASE 文件格式(.dbf 文件)來存儲屬性,dBase這種上世紀80年代的數據格式,現在基本淡出舞臺。 雖然Shapefile有萬般好,但是,今天還是要來說說shapefile的侷限性,也就是使用限制有什麼,以便合理的選擇使用Shapefile數據。

1. 文件容量限制:

Shapefile 每個子文件都有大小最大不能超過 2 GB ,以點要素爲例,最多約能存儲 7000 萬個。

2. 不支持高級對象:

Shapefile不支持註記要素類、關係類、拓撲關係、屬性域和子類、座標精度和分辨率等。

不支持通過參數定義的曲線(也稱爲圓弧曲線)。

3. 字段存儲限制:

Shapefile無法存儲:空值,無法向上舍入數字,對 Unicode 字符串的支持不足,字段名稱最長只能爲 10 個字符,且在同一字段中無法同時存儲日期和時間。

Shapefile支持的最大字段數爲 255。若超出此上限,當轉換爲 shapefile 時只會轉換前 255 個字段。

dBASE 文件不支持類型 blob、guid、全局 ID、座標 ID 或柵格字段類型。

 

包含空值的數據類型 空值替換
數字 - 當工具需要輸出“空”、無窮大或 NaN(非數字)時 -1.7976931348623158e+308(最大負值的 IEEE 標準)
數字(所有其他地理處理工具) 0
文本 “ ”(空白 - 無空格)
Date 存儲爲零,但顯示爲“<空>”

4. 字段寬度限制:

地理數據庫數據類型 dBASE 字段類型 dBASE 字段寬度(字符數)
對象 ID 數值 9
短整型 數值 4
長整型 數值 9
浮點型 浮點型 13
雙精度 浮點型 13
文本 字符 254
Date Date 8

5. 性能限制 

由於形狀壓縮方法的不同,shapefile 所佔用的空間可能爲文件地理數據庫或 SDE 的三到五倍。

Shapefile 的空間索引效率較數據庫低。這就意味着,同地理數據庫要素類相比,空間查詢耗時更長。當處理大量要素時,效率低。

dBASE 文件不支持 WHERE 子句,也不支持 SQL。

當保存所做編輯時屬性索引會被刪除,因此必須重新創建屬性索引。

6. 多面體存儲限制

Shapefiles 支持多面體,但不支持以下多面體的高級功能:紋理座標、紋理及部分色帶、光線法向量。

 

shp文件說明

shapefile 是存儲地理信息的簡單文件格式,但是工作中,常會接到用戶的很多問題,這裏把常見的彙總下。

一、shape 文件到底可以多大?

shapefile 的每個文件都不能超過 2 GB。也就是說,存儲數據的 .dbf 與.shp 分別不能超過 2GB。但是,所有文件的總大小可以超過 2 GB。

二、 shape 文件是怎麼構成的?

shape 文件用 ArcGIS 查看僅顯示一個文件,但是用 windows 資源管理器查看就可能看到以下文件。

  • .shp - 存儲要素幾何的主文件;必需文件。
  • .shx - 存儲要素幾何索引的索引文件;必需文件。
  • .dbf - 存儲要素屬性信息的 dBASE 表;必需文件。
  • .prj - 存儲座標系信息的文件;由 ArcGIS 使用。
  • .xml - ArcGIS 的元數據 - 用於存儲 shapefile 的相關信息。
  • .sbn 和 .sbx - 存儲要素空間索引的文件。
  • .fbn 和 .fbx - 存儲只讀 shapefile 的要素空間索引的文件。
  • .ain 和 .aih - 存儲某個表中或專題屬性表中活動字段屬性索引的文件。
  • .atx - .atx 文件針對各個 shapefile 或在 ArcCatalog 中創建的 dBASE屬性索引而創建。
  • .ixs - 讀/寫 shapefile 的地理編碼索引。
  • .mxs - 讀/寫 shapefile(ODB 格式)的地理編碼索引。
  • .cpg - 可選文件,指定用於標識要使用的字符集的代碼頁。
  • 強烈建議,對shape操作時,在 ArcGIS 中進行。

三、 shape 中創建字段注意什麼?

不能對現有字段修改,可以新建字段包括自定義數據類型;字段名長度不要超過10,超過會被截斷。

新建字段時,有三個參數可供設置:

  • precision(精度)—— 數字字段中可存儲的位數;
  • scale(標度)—— 浮點或雙精度類型字段中數值的小數點右側的位數;
  • length(長度)—— 字符型字段的文本字段的長度。

注意,long integer 當精度超過 10 時,會自動轉爲 Double 型。

      Geodatabase是用來表達和管理地理信息的複雜數據模型,是ArcGIS的主要存儲數據方式,主要存儲了 featureclasses、 rasterdatasets、attributes、具有行爲的高級GIS數據對象、 管理空間完整性的規則、要素柵格屬性關係工具。

Geodatabase

就其種類呢,無非是三種:File Geodatabase,PersonalGeodatabase,ArcSDEGeodatabase。 

1、 FileGeodatabase:以文件夾形式存儲。每個Dataset作爲一個文件存儲,最大可達1T。對於PGDB更推薦FGDB。單用戶,同一個Dataset 、獨立的featureclass或者table,併發只能有一人寫操作,可以多人讀操作。支持跨平臺。

2、PersonalGeodatabase:所有的Dataset都存儲在MicrosoftAccess數據文件中,最大大小不超過2 GB。單用戶,一個人寫多人讀。僅支持Windows。

3、ArcSDEGeodatabase:儲存在關係數據庫中,可使用 Oracle,MicrosoftSQL Server, IBM DB2, IBM Informix,PostgreSQL。這些多用戶的數據庫要求使用ArcSDE,不限制大小和用戶的數量。平臺支持:Windows, UNIX,Linux。

二、Geodatabase中的Dateset

Geodatabase 中包含基本的dataset,包括:feature classes、 rasterdatasets、attributes。還包含高級地理數據類型:coordinate systems, coordinateresolution, feature classes,topologies, networks, raster catalogs,relationships, domains。

1、Table
用於存儲屬性等。字段類型包含:Numbers(長整型、短整型、單精度、雙精度)、Text、Date(日期時間型)、BLOBs(二進制大對象,例如Symbol、CAD幾何要素)、GlobalID(全局標識符)、XML。

2、Feature Class
Feature Class以一張單獨的表存儲,每個要素是一條記錄。種類: Points、Lines、Polygons、Annotation、 Dimensions(尺寸)、MultiPoints(由多個點組成的要素,如雷達激光點)、MultiPatches(多面體)。
其中要素座標可包含Z值,表示垂直測量結果;線狀要素可以包含M值,表示線性測量結果。路徑是指具有唯一標識符和通用測量系統的任意線狀要素(如城市街道、公路、河流或管線)。
與FeatureClass相關的:FeatureDataset,subtype,AttributeDomain,RelationshipClasses,Topology,Network Dataset,Geometric network,TerrainDataset,Linear referencing,Cartographicrepresentation,versioning。

3、Raster
柵格的地理屬性通常包括:座標系,參考座標或 X,Y 位置(通常在柵格左上角或左下角),單元大小,行計數和列計數。
地理數據庫可以針對多種用途管理柵格:作爲單個數據集、數據集的邏輯集合和表中的圖片屬性.
 

轉:http://kikitamap.com/2015/12/21/TroubleshootingShapefile/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章