zoukankan      html  css  js  c++  java
  • 解决GDAL中文乱码问题--转载

    转自:https://blog.csdn.net/jiaowoyege/article/details/46119003?locationNum=10 

    我在使用此文中方法虽然解决了属性乱码问题,但是编码为CP936以后字段名就无法新建成中文的,字段名必须为英文。否则无法创建shp,具体原因正在寻找中。

    最近在JAVA上调用GDAL来对矢量数据进行操作,中文字段和中文属性值的乱码问题困扰已经,又要被老杜说没进展啦。。。苦不堪言啊!!!!好在经过这个早上的倒腾,终于给他怼出来了。在JAVA环境下怎么配置GDAL随手百度一发吧,我就不废话了。直接贴代码:

     
    1. package shapefileProcess;  
    2.   
    3. import java.io.UnsupportedEncodingException;  
    4.   
    5. import org.gdal.gdal.gdal;  
    6. import org.gdal.ogr.DataSource;  
    7. import org.gdal.ogr.Feature;  
    8. import org.gdal.ogr.FeatureDefn;  
    9. import org.gdal.ogr.FieldDefn;  
    10. import org.gdal.ogr.Layer;  
    11. import org.gdal.ogr.ogr;  
    12. import org.gdal.osr.SpatialReference;  
    13. import org.gdal.osr.osr;  
    14.   
    15. public class ShapeReader {  
    16.   
    17.     /** 
    18.      * @param args 
    19.      * @throws UnsupportedEncodingException  
    20.      */  
    21.     public static void main(String[] args) throws UnsupportedEncodingException  
    22.     {  
    23.         // TODO Auto-generated method stub  
    24.       
    25.         String hunanxsPath="E:\硕士阶段\项目\实验数据\临时测试\hunanSX_WGS84.shp";  
    26.         String hunanxPath="E:\硕士阶段\项目\实验数据\洪涝相关\湖南省.shp";  
    27.       
    28.   
    29.         ogr.RegisterAll();   
    30.         //支持中文路径  
    31.         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");   
    32.         //String nameString=gdal.GetConfigOption("SHAPE_ENCODING");  
    33.         //支持中文字段  
    34.         gdal.SetConfigOption("SHAPE_ENCODING","CP936");   
    35.           
    36.       
    37.           
    38.           
    39.         DataSource hunanStream=readShapeFile(hunanxsPath);  
    40.         Layer hunanSreamLayer=hunanStream.GetLayerByIndex(0);  
    41.           
    42.         DataSource hunanProvince=readShapeFile(hunanxPath);  
    43.         Layer hunanProvinceLayer=hunanProvince.GetLayer(0);  
    44.           
    45.         DataSource tempDataSource=ogr.GetDriverByName("ESRI Shapefile").CreateDataSource("E:\gjy\Test",null);  
    46.         MyClipFeature(hunanSreamLayer, hunanProvinceLayer,tempDataSource);  
    47.     }  
    48.       
    49.   
    50.     private static DataSource readShapeFile(String path)  
    51.     {  
    52.           
    53.         ogr.RegisterAll();  
    54.         //支持中文路径  
    55.         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");   
    56.     //  String nameString=gdal.GetConfigOption("SHAPE_ENCODING");  
    57.         //支持中文字段  
    58.         gdal.SetConfigOption("SHAPE_ENCODING","CP936");   
    59.           
    60.         DataSource inputSource=ogr.Open(path);  
    61.         return inputSource;  
    62.     }  
    63.       
    64.   
    65.     private static void MyClipFeature(Layer inputLayer,Layer extentLayer,DataSource tempDataSource) throws UnsupportedEncodingException  
    66.     {  
    67.           
    68.   
    69.         ogr.RegisterAll();  
    70.   
    71.         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");   
    72.   
    73.         gdal.SetConfigOption("SHAPE_ENCODING","CP936");  
    74.   
    75.           
    76.   
    77.   
    78.         for(int i=0;i<extentLayer.GetFeatureCount();i++)  
    79.         {  
    80.             Feature iFeature=extentLayer.GetFeature(0);  
    81.             FieldDefn mFieldDefn=new FieldDefn("名称", ogr.OFTString);  
    82.             mFieldDefn.SetWidth(60);  
    83.             //extentLayer.CreateField(mFieldDefn, 1);  
    84.             Layer tempLayer=tempDataSource.CreateLayer("temp3",new SpatialReference(osr.SRS_WKT_WGS84));  
    85.             tempLayer.CreateField(mFieldDefn,1);  
    86.             FeatureDefn iFeatureDefn=extentLayer.GetLayerDefn();  
    87.             Feature mFeature=new Feature(iFeatureDefn);  
    88.           
    89.             mFeature.SetField(0,iFeature.GetFieldAsString(0));  
    90.             System.out.print(iFeature.GetFieldAsString(0).getBytes().getClass().toString());  
    91.             //mFeature.SetField(1, iFeature.GetFieldAsString(1));  
    92.             mFeature.SetGeometry(iFeature.GetGeometryRef());  
    93.       
    94.               
    95.       
    96.            tempLayer.CreateFeature(mFeature);     
    97.             tempLayer.SyncToDisk();  
    98.     //  }  
    99.     }  
    100.   
    101. }  

    上面这段程度的功能主要是实现矢量的裁剪功能,具体是用左图对右图实现按县级行政区划的裁切,其中行政区划字段值为中文:

    注意:gdal.SetConfigOption("SHAPE_ENCODING","CP936");  

    很多其他博客都没有显式指定SHAPE_ENCODING的值,直接为gdal.SetConfigOption("SHAPE_ENCODING",""); 理由是:操作系统的默认编码方式就是CP936()

    然而我经过调试发现/String nameString=gdal.GetConfigOption("SHAPE_ENCODING");返回值为null,并不是传说中的CP936,因此将它设为CP936解决中文乱码问题;

  • 相关阅读:
    记一下后续要看的点
    vue 封装request.js
    shuf命令简单用法
    Redis string 字符串
    Redis 事务操作
    Redis Zset 有序集合
    php操作redis的一些基本操作
    pytest自动化测试入门介绍
    idea&myeclipse 自动生成serialVersionUID
    leetCode1104. 二叉树寻路(medium)
  • 原文地址:https://www.cnblogs.com/niudieyi/p/8707982.html
Copyright © 2011-2022 走看看