zoukankan      html  css  js  c++  java
  • Arcgis-Wiki_03-属性表编码

    前言

    主要分析dbf属性表,存储在数据库中的表略作解释。

    dbf的局限性

    无论是矢量数据还是栅格数据都可以拥有属性表,当未存储在数据库时,以dbf文件来存储,而dbf作为上世纪80年代的一种数据库存储格式在目前已存在一定的落后性。无论是字段长度、字段个数还是存储大小,以及编码方式上经常带来一些问题,Arcgis官方也是建议以数据库存储。官方是这样说的:

    它们无法存储空值,无法向上舍入数字,对 Unicode 字符串的支持不足,字段名称最长只能为 10 个字符,且无法在日期字段中存储时间。这些只是其中的主要问题。此外,它们不支持在地理数据库中的某些功能,如:属性域和子类型。因此,除非是简单的属性且不需要使用地理数据库功能,否则请不要使用 shapefile。

    但考虑到数据交换、便捷性等方面,大家在少量数据存储时还是以shp文件为主,这里就有必要综合的介绍一下dbf这种格式的相关信息,包括文件头信息、编码解码,以及提出解决方案。

    dbf格式认识

    dbf格式是dBase和FoxPro所使用的数据库格式,dBase格式可以直接使用Excel打开,FoxPro使用Excel打开会是一对乱码字符,Arcgis使用的是dBase格式,而许多政府机构开发的的数据库管理软件多使用FoxPro。

    一个dbf文件存储单个表,在其中存储着数据库描述、字段描述和记录数据。以前的文件只有一个,而后为了存储大型文本字段,会附带一个特殊文件,多为.dbt或者.fpt。

    一个dbf文件一般内部分为三个部分,文件头信息、字段描述和记录数据。

    文件头

    在这里不做详细介绍,有兴趣可自行了解。

    文件头中存储着dbf版本(dBaseII、dBaseIII、visual FoxPro等)、最后一次更新时间(距离1900的年月日信息)、记录数等信息。

    字段描述

    每个字段描述符固定为32个字节,虽然有一些未被使用。

    里面存储了字段名、字段类型、字段长度、小数位数等信息。

    字段名称不允许为空、不能包含特殊字符、不能以数字开头、不能超过11个字符(Arcgis规定10个)。

    字段类型参照下表(数值型有符号字段宽度-1):

    地理数据库数据类型 dBASE 字段类型 dBASE 字段宽度(字符数) dBASE数值范围
    对象 ID(即FID) 数值 10 1-2147483647(2E31-1)
    短整型 数值 5 -9999~99999
    长整型 数值 10 -999999999~2147483647(2E31-1)
    浮点型 数值 14 -3.4E38~1.2E38
    双精度 数值 14 -2.2E308~1.8E308
    文本 字符 254 127个汉字,254个英文或者数字
    日期 日期 8

    以上与官方介绍不一致,为实测范围。

    选择短整型不选择精度,实际创建类型是长整型,默认范围即-9999~99999;

    长整型范围官方介绍为-2147483647~2147483647,实际并不是这样,结合短整型范围猜测可能只是限制了数字个数而不是这个范围,但长整型最大值却又不是9999999999,着实古怪。

    当创建字段时,选择的字段精度不同就会创建不同类型的数值类型,而不是上面选择的字段类型,总之不论你精度多少Arcgis总会给你创建成功,在精度超过当前数据类型时,Arcgis会帮助你选择具有这一精度的数据类型,如果没有则会使用默认该类型最大精度。

    记录数据

    包含两部分删除标记和记录。

    删除标记表示该记录是否被删除。

    使用dbf要知道些什么

    • 字段名称的长度不能超过 10 个字符。
    • 属性的最大记录长度为 4000 字节。记录长度是用于定义全部字段的字节数,而非用于存储实际值的字节数。
    • 最大字段数为 255。若超出此上限,当转换为 shapefile 时会转换前 255 个字段。
    • dBASE 文件必须至少包含一个字段。当您新建 shapefile 或 dBASE 表格时,默认会创建一个整数 ID 字段。
    • dBASE 不支持空值。
    • dBASE文件和shp文件存储大小不能超过2g。

    Arcgis是怎样解析的

    读取

    在Arcgis10.1之后,会先读取.cgp文件来决定读取时解码方式,如果没有.cpg文件,10.1之前版本则会采用系统的默认编码去解码,10.1之后版本会默认采用UTF-8去解码。而多数都是可以直接在Excel中查看的,正常查看的采用的是GBK编码,当用UTF-8去解码当然就会出现乱码了。

    写入

    在Arcgis10.1之前默认编码使用系统的默认编码(中文简体系统为GBK),10.1之后版本会默认采用UTF-8。这也就会出现很多使用了高版本导出的dbf在Excel中打开乱码,因为Excel并不会去读取cpg文件,这是Arcgis独有的。

    怎么解决Arcgis的编码问题

    既然知道了读取和写入的解码及编码方式,那问题就迎刃而解了。

    为了让导出的dbf在Excel中正常打开,高版本把默认编码改为系统编码就行了。

    在Arcgis中查看属性表乱码,增加一个同名.cpg文件(新建TXT改后缀),里面写上正确的编码方式就可以,如GBK、UTF-8等。

    修改默认编码

    实质上就是添加注册表

    @ECHO OFF
    IF "%1"=="" GOTO :EOF 
    reg add HKEY_CURRENT_USERSoftwareESRIDesktop10.5CommonCodePage /v dbfDefault /t REG_SZ /d 936  /f
    

    使用方法:

    1、使用的版本不同相应的Desktop10.5的版本号要相应更改

    2、以管理员身份运行cmd,复制进去上述相应代码回车运行,提示成功

    问题场景

    有一个shp文件,Arcgis默认编码也改了,仍出现打开属性表乱码,在Excel中打开也乱码。

    问题所在就是文件真实编码使用的UTF-8,而改了默认编码而cpg文件又不存在(或者cpg文件里描述错误),就会采用系统编码GBK去解码。

    新建同名.cgp文件,里面内容为UTF-8,再导出dbf文件,这时再用Excel打开就会正常了。

    使用转换工具

    很多大佬也都讲过这个问题,但还是有些人总是搞不明白这些编码解码,就写了个工具用来转换dbf编码,其实最初是用来转换FoxPro的dBase和dBase III之间的问题的。

    这里再介绍一个更强大的dbf转换工具(里面附带注册码),可以将dbf文件转换为csv、xlsx、xml等格式。

  • 相关阅读:
    获取Mysql-jdbc驱动Driver类的两种方式
    Misha and Changing Handles
    What Are You Talking About (map)
    Let the Balloon Rise <map>的应用
    ignitius and princess 2(全排列)
    大一下学期计划
    大一上学期总结
    algorithm的基本注意事项
    STL的注意事项
    STL的基本操作指令
  • 原文地址:https://www.cnblogs.com/bigmonk/p/12362997.html
Copyright © 2011-2022 走看看