arcgis中shp文件中文乱码、字符截短问题解析

我们有时候使用ArcGIS读取shp文件的时候,打开属性表后,属性值存在中文乱码的情况,或字段项存在长度缩减的情况,这都是使用不同版本的arcgis读取数据时编码方式不同造成的。

我们事先需要知道的是,数据在传输、存储、显示的时候,都是需要一定的字符编码方式支持的,如:ANSI、GB2312、Big5、UTF-8等等,如果软件在操作数据时,前后使用的编码方式不一样(也有可能字符编码信息丢了),那么就会出现乱码

字符编码介绍参考:编码与解码:从计算机字符编码到地理信息编码_冰清-小魔鱼的博客-CSDN博客

字符编码代码表:编码表 - 百度文库

OEM:Original Equipment Manufacturer(原始设备产商),该词用在计算机中,表示早期IBM与微软为了支持不同国家、不同语言的字符编码而写入BIOS的固化字符编码,也就是OEM字符集编码。OEM字符集编码将不同语言的字符集分别用一个数字表示,并将这些数字编辑成页,叫做字符编码页code page 。字符编码页用于将当前字符转换识别出来,并在图形操作系统上显示。它包含437, 708, 720, 737, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 932, 936, 950等字符编码表,其中,437为美国IBM编码转换代码,708、720为阿拉伯数字编码转换代码,737希腊字母转换代码,860为葡萄牙语转换代码,874为泰语转换代码,932为日语转换代码, 936为简体中文转换代码,950为繁体中文转换代码,65001用于表示UTF-8转换代码。

对于操作系统或者软件而言,一般都会有字符编码转换功能,或者使用宿主机操作系统的编码页转换功能,您或许也见到过很多软件在设置路径的时候,需要设置为英文路径,这是因为该软件本就不支持中文编码。

一、shp乱码问题

对于Shapefile而言:

在Shapefile头文件(dBase Header)中,一般会包含字符编码信息,这个信息称为 LDID ( Language Driver ID)。在使用arcgis 打开Shapefile时,会读取LDID 存储的字符编码信息,再打开 shapefile。

在Shapefile子文件中,有时我们还会发现同名 *.CPG 文件,该文件中也存储了字符编码信息,用记事本打开该文件,可以看到 UTF-8或者OEM字样。

二者被ArcGIS 识别的优先顺序是:LDID 优先于 CPG文件。也就是说,如果在Shapefile头文件中没有约定字符编码方式时,那么ArcGIS会使用.CPG设置的字符编码方式打开shapefile。

如果shapefile文件缺失 LDID 或者.CPG 文件,那么编码类型就会使用OEM编码类型,也就是操作系统默认编码类型(操作系统默认编码是个很神奇的编码,变数很多,比如:ANSI、mul-Language多国语言版还有不同操作系统、同一操作系统不同编码类型的区别)。换句话说,此时操作系统使用什么样的编码方式,那么Shapefile也会使用相同的编码方式。如果Shapefile使用的编码方式与操作系统默认编码方式不一致,那么就会出现乱码。

一般而言, shapefiles 和 dBASE 文件都会存储字符编码信息, 但有些程序 OEM 文件没有包含字符编码页信息(例如: Microsoft Access 2000 and Excel 2000),程序会给没有编码页信息的文件设置为操作系统默认OEM 编码,字符就会出现乱码。

在 ArcGIS Desktop (ArcMap, ArcCatalog, and ArcToolbox) 中,利用编码页转换功能可以读写多种字符编码的 shapefile 和 dBASE 表。在系统注册表中,编码页转换功能命名为 'dbfDefault',可以修改这个值。

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或者UTF-8。

再次打开,没有乱码。

假定你的shapefile编码方式是UTF-8的,而LDID 和 CPG编码信息有是丢失的,那么还是按照上面的步骤,创建一个同名的CPG文件,写入UTF-8,保存。

二、字符截断问题

ArcGIS 10.2 以及更早的版本,ArcGIS写shapefile的时候,遇到中文默认使用Windows当前语言 字符集编码(也称 代码页/CodePage/OEM CodePage),例如中文一般使用的是 CodePage 936(GBK)

ArcGIS 10.2.1 以及之后的版本,ArcGIS写shapefile的时候,默认使用的是 UTF-8 编码类型。

这两种编码类型存储汉字所使用的字节数是不相同的。其中,shapefile自身的限制是字段为9个字节,CP936编码下汉字通常为双字节存储,因此可以存储 9/2=4 个汉字;UTF-8 编码下汉字至少需要3个字节存储,因此最多只能存储 9/3=3 个汉字了。

解决方法

使用地理数据库,放弃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

以下dbfDefault支持的字符编码值:

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

附件一: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
DateDate8

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 位置(通常在栅格左上角或左下角),单元大小,行计数和列计数。
地理数据库可以针对多种用途管理栅格:作为单个数据集、数据集的逻辑集合和表中的图片属性.
 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值