首先,先确认一下你的字段值是不是乱码,如果是,按照以下方法:
我的字段值是来自于一个geojson字符串,我在对它解析时做了如下处理:
1
2
3
4
5
|
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:
1
2
|
driver = ogr.GetDriverByName( "ESRI Shapefile" )
ds = driver.CreateDataSource(shp_path) #打开要写入的数据源
|
然后,在driver创建之前加入如下两句:
1
2
|
gdal.SetConfigOption( "GDAL_FILENAME_IS_UTF8" , "YES" )
gdal.SetConfigOption( "SHAPE_ENCODING" , "GBK" )
|
成了。
源码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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' )
|
以上这篇解决python ogr shp字段写入中文乱码的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/jin80506/article/details/80973883