在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/

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