首页 > 编程语言 >【Python&GIS】解决GIS属性表、矢量字段乱码,中文乱码

【Python&GIS】解决GIS属性表、矢量字段乱码,中文乱码

时间:2023-09-15 15:59:39浏览次数:88  
标签:文件 GIS 编码 Python cpg 乱码 ----- dbf

        我们平时在使用代码处理矢量数据时,可能会出现矢量字段出现乱码的情况。同样有什么打开别人发的矢量文件有可能也会出现这种情况。那么我们该如何解决这个问题,让我们属性表中的中文字符正常显示呢?今天就和大家一起分享一下。

1.原因

        ArcGIS10.2之前版本,Shapefile根据Locale进行编码,即注册表中的common—codepage—dbfDefault。而ArcGIS10.2之后版本(常用的10.6、10.7等),Shapefile一般是UTF-8编码,ArcGIS会先读取dbf头文件LDID中的编码,然后是cpg文件,最后是codepage。简单理解就是读取文件使用的编码类型和文件实际存储的编码类型不一致!

2.Shapefile文件的构成

  • 主文件(.shp)-----存储地理要素的几何图形
  • 索引文件(.shx)-----存储图形要素与属性信息索引
  • dBASE表文件(.dbf)-----存储要素信息属性的dBase表,包含各个实体的属性特征记录
  • 空间参考文件(.prj)-----存储投影信息
  • 仿射变换参数文件(.tfw)-----存储左上角的仿射地理变换参数
  • 几何体的空间索引文件(.sbn 和 .sbx)
  • 字符编码的描述文件(.cpg)-----存储字符编码类型的信息

3.解决方案

 1)修改cpg文件(不推荐)

        cpg文件中定义了字符编码的描述,即字符是使用什么类型进行编码的。在同目录下里创建同名的.cpg 文件,文本内容写oem或者936。内容具体的需要对照dbf的编码来,下面有可以查询编码类型的代码。结果需要去编码查询网站中找到对应的类型。

import struct

path_dbf = 'B:/绿地.dbf'
dat = open(path_dbf, 'rb').read(30)[29:]
code = struct.unpack('B', dat)[0]
print(code, hex(code))

 2)增加定义编码的代码(推荐)

        这个方法首先你要会使用Python,如果你是存依赖于GIS工作学习的,就不用看这个方法了。我们只需要在代码中添加编码类型即可!二选一,都试一试。这行代码放在创建矢量图层之前即可,你可以放在最前面。

gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")
# gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
# 中文路径问题

 

        有些博主分享的什么修改注册表啥的,我没搞成功过,所以这里就不分享给大家了。同时修改.cpg这个文件成功率也很低,因为ArcGIS好像读取并使用它的优先率低,如果shp的元数据里定义了类型,你修改cpg文件它也不读。所以还是推荐大家用代码搞定,目前为止,每次都能成功!

标签:文件,GIS,编码,Python,cpg,乱码,-----,dbf
From: https://www.cnblogs.com/RSran/p/17705153.html

相关文章

  • Python——19days
    模块的简介**模块导入的方式             import句式,from……import…句式模块的其他用法补充循环导入(现象)判断文件类型———————————————————————————————————                 ......
  • 关于python中os模块指向软链路径
    关于pythonos模块获取路径问题如果py文件放在软链路径下,那么无法获取当前路径,只能获取软链对应的真实路径Python3.8.2创建软链路径#1.在/System/Volumes/Data创建ccc目录mkdir-p/System/Volumes/Data/ccc#2.创建软链:test_ccc->/System/Volumes/Data/ccccd~&......
  • linux里python读写mssql数据库的笔记
    1、安装pyodbcpip3installpyodbc我用的debian12,可以直接aptinstallpython3-pyodbc2、还需要安装linux版的mssqlclient参考这里:https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver......
  • 【Python】Python 发布订阅模式实现松耦合
    Python发布订阅模式实现松耦合发布订阅模式(publish/subscribe或pub/sub)是一种编程模式,消息的发送者(发布者)不会发送其消息给特定的接收者(订阅者),而是将发布的消息分为不同的类别直接发布,并不关注订阅者是谁。而订阅者可以对一个或多个类别感兴趣.且只接收感兴趣的消息,并且......
  • 一个简单的 Python 实现希尔伯特-黄变换(Hilbert-Huang Transform,简称HHT)的例子
     importnumpyasnpfromscipy.signalimportargrelextremadefemd(data):"""经验模式分解(EmpiricalModeDecomposition,EMD)"""#找到极值点max_points,min_points=argrelextrema(data,np.greater,axis=0)max......
  • 「乱搞」用 Python 处理 word 文档
    目录写在前面代码写在最后写在前面大家好啊,我是过气up主Luckyblock,今天给大家来点想看的东西。简单记录如何使用Python中的python-docx模块快速处理word文档。周末就是省赛了,然而板子还没整合起来。因为我是一个懒狗,懒得把代码再慢慢复制进文档里了,于是来学了这个。......
  • 基于python的医疗问诊服务数据采集及可视化分析系统-计算机毕业设计源码+LW文档
    选题的目的、理论与实践意义:选题的目的:随着“互联网+”概念的兴起,有很多传统行业获得了新的发展契机。根据数据统计,用户足不出户就能享受优质的医疗服务,看病贵和看病难这样的问题通过线上医疗问诊得到有效的缓解。系统通过对网站你用户及为平台提供服务的医生,医疗服务数据,评价信息......
  • Python学习笔记-Python异常、模块与包
    了解异常什么是异常当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG。bug单词的诞生早期计算机采用大量继电器工作,马克二型计算机就是这样的。1945年9月9日,下午三点,马克二型计算机无法正常工作了,技术人员试......
  • Python开发实例(二十)网站检测工具:创建一个测量网站的工具,检查页面加载时间等指标
    在这个实例中,我们将创建一个简单的网站检测工具,使用Python的requests库来测量网站,包括页面加载时间等指标。首先,请确保你已经安装了requests库。如果没有安装,可以通过以下命令来安装:pipinstallrequests下面是一个网站检测工具的Python程序:importrequestsimporttimedefmeasu......
  • python利用openpyxl实现利用excel每行数据填入对应模板批量生成excel
    一、openpyxl常见操作可以参考:https://blog.csdn.net/JunChen681/article/details/1260532061、openpyxl把excel分成了三层Workbook是对工作簿的抽象(工作簿,一个excel文件包含多个sheet。)Worksheet是对表格的抽象(工作表,一个workbook有多个,表名识别,如“sheet......