首先,先确认一下你的字段值是不是乱码,如果是,按照以下方法:
我的字段值是来自于一个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