解决python ogr shp字段写入中文乱码的问题
作者:铭净止水 发布时间:2023-07-05 00:40:17
标签:python,ogr,shp,中文,乱码
首先,先确认一下你的字段值是不是乱码,如果是,按照以下方法:
我的字段值是来自于一个geojson字符串,我在对它解析时做了如下处理:
properties = fea.get("properties")
pro_json=json.dumps(properties)
pro_json.replace('u\'','\'')#将unicode编码转化为中文先处理一下
pro_json=pro_json.decode("unicode-escape") #将unicode编码转化为中文
properties=json.loads(pro_json)
这样即可消除字段值中的中文乱码。
字段值没有乱码了,可是这样写入shp,shp中会出现乱码,使用如下方法解决:
首先,你需要用driver方法创建shp文件而不是直接用ogr.open:
driver=ogr.GetDriverByName("ESRI Shapefile")
ds =driver.CreateDataSource(shp_path)#打开要写入的数据源
然后,在driver创建之前加入如下两句:
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
成了。
源码如下:
def create_shp_with_geoJson2(a,shp_path):
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
driver=ogr.GetDriverByName("ESRI Shapefile")
ds =driver.CreateDataSource(shp_path)#打开要写入的数据源
if ds is None:
sys.exit('Could not open this folder!')
if ds.GetLayer('test_polygon'):
ds.DeleteLayer('test_polygon')#如果存在,就删除该数据
feature0=a['features'][0]
geo = feature0.get("geometry")
geo_type = geo.get('type')#获取图层类型
properties = feature0.get("properties")
keys=properties.keys()#获取字段名称数组
if geo_type=='Polygon' or 'MultiPolygon':
ogr_type=ogr.wkbPolygon
else:
if geo_type=='Point':
ogr_type=ogr.wkbPoint
else:
if geo_type=='LineString' or 'MultiLineString':
ogr_type=ogr.wkbLineString
out_lyr=ds.CreateLayer('test_polygon',None,ogr_type)#创建图层
#接下来往图层中写入feature
for key in keys:
field_testfield = ogr.FieldDefn(key, ogr.OFTString)#创建字段
field_testfield.SetWidth(254)
out_lyr.CreateField(field_testfield)
for fea in a['features']:
geometry_json=fea.get("geometry")
properties = fea.get("properties")
pro_json=json.dumps(properties)
pro_json.replace('u\'','\'')#将unicode编码转化为中文先处理一下
pro_json=pro_json.decode("unicode-escape") #将unicode编码转化为中文
properties=json.loads(pro_json)
geom=ogr.CreateGeometryFromJson(str(geometry_json))
out_defn=out_lyr.GetLayerDefn()
out_feat=ogr.Feature(out_defn)
out_feat.SetGeometry(geom)#创建geometry
for i in range(len(keys)):
value=properties.get(keys[i])#获取属性值
print(value)
out_feat.SetField(i,value)
out_lyr.CreateFeature(out_feat)#在图层中插入该要素
if __name__ == '__main__':
create_shp_with_geoJson2(a,'web')
来源:https://blog.csdn.net/jin80506/article/details/80973883


猜你喜欢
- 本文实例为大家分享了python傅里叶变换FFT绘制频谱图的具体代码,供大家参考,具体内容如下频谱图的横轴表示的是 频率, 纵轴表
- 本文实例讲述了PHP实现对图片的反色处理功能。分享给大家供大家参考,具体如下:今天有个需求用php对图片进行反色,和转灰,之前不知道可不可行
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 本文实例讲述了Python实现基于C/S架构的聊天室功能。分享给大家供大家参考,具体如下:一、课程介绍1.简介本次项目课是实现简单聊天室程序
- 1.相关函数df.dropna()df.fillna()df.isnull()df.isna()2.相关概念空值:在pandas中的空值是&
- 本文实例讲述了Python时间和字符串转换操作。分享给大家供大家参考,具体如下:例子:#!/usr/bin/python# -*- codi
- 本文为大家分享了python2.7.14的安装教程,供大家参考,具体内容如下1.下载python2.7.14下载地址根据自己电脑配置进行选择
- 一般打印就用window.print();就OK了 但是一般都是选择性打印所以会调用方法: function preview() { bdh
- 注:IE8以前的版本均不支持该特性为了向文档中插入生成内容,可以使用:before与:after伪元素。如,我想在所有链接的后面加上&quo
- 简单的一个例子,是以前用Dephi写的,前不久刚实现了一个在Python中使用Delphi控件来编写界面程序,于是趁热写一个类似的的查询方案
- *args与**kwarsg及闭包和装饰器过程先理解闭包,再理解装饰器,不要忘了不定长参数def func():
- 前言查询是数据操作至关重要的一部分,比如说在所有商品中查找出价格在规定范围内的所有商品,要想把数据库中的数据在客户端中展示给用户,一般都进行
- 0.前提JavaScript对象的属性分为两种存在形态. 一种是存在实例中, 另一是存在原型对象中.根据上述, 检测属性的时候会出现4种情况
- 项目进行到和服务器交互,通过post访问服务器端jsp,jsp访问服务器端mysql数据库,最终返回到客户端的中文出现乱码问题。在整个流程中
- 在日常运维中,如果涉及到用户管理,就一定会用到给用户设置密码的工作,其实吧,平时脑子里觉得设置个密码没什么,但要真让你随手敲一个12位带特殊
- 一、JS介绍  Javascript是一种由Netscape(网景)的LiveScript发展而来的原型
- 需求描述我们需要登录考勤系统(网页端,非手机端)进行签到,如果不想每天都早早起来打卡签到,就可以通过写程序实现这一功能。业务梳理通过长时间的
- 插值主要用于物理学数学中,逼近某一确定值的方法(1)插值是通过已知的离散数据求未知数据的方法。(2)与拟合不同,插值要求曲线通过所有的已知数
- hasattr(object, name)作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(oj
- 在 Python 的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份“requirements.txt”,记录下依赖库的名字及其版