`

GEOTOOLS 2.4对中文编码的支持

阅读更多
困扰了好几天,一直在尝试各种方法解决Geotools读取shp格式对中文编码的问题。可是昨天一个无意的举动居然让我发觉自己做了太多的无用之功。仔细的看了JavaDoc以及shapefile源代码之后,可以可以明显的看到ShapefileDataStore的构造函数已经发生了很大的变化:
     public static final Charset DEFAULT_STRING_CHARSET = Charset.forName("ISO-8859-1");
    这个是ShapefileDataStore对象中定义的字符编码。也正是由于其使用ISO-8859-1编码作为默认编码,所以一直以来,解决geotools抑或geoserver的中文问题总是连绵不绝。
   来看看我在2.4中看到的ShapefileDataStore的新的构造函数(当然,贝塔和我聊天说过好像2.3也是作出了同样修改的,可惜我没下2.3的源码,呵呵,但是2.2以前的版本这一块貌似是不同的。权当其是2.4中的“新增”之处吧)
1    public ShapefileDataStore(URL url, boolean useMemoryMappedBuffer)
2        throws MalformedURLException
3    {
4        this(url, useMemoryMappedBuffer, DEFAULT_STRING_CHARSET);
5    }
6
7    public ShapefileDataStore(URL url, boolean useMemoryMappedBuffer, Charset dbfCharset)
8        throws MalformedURLException
9    {
10        readWriteLock = new Lock();
11        namespace = null;
12        this.useMemoryMappedBuffer = true;
13        String filename = null;
14        shpURL = ShapefileDataStoreFactory.toShpURL(url);
15        dbfURL = ShapefileDataStoreFactory.toDbfURL(url);
16        shxURL = ShapefileDataStoreFactory.toShxURL(url);
17        prjURL = ShapefileDataStoreFactory.toPrjURL(url);
18        xmlURL = ShapefileDataStoreFactory.toXmlURL(url);
19        this.dbfCharset = dbfCharset;
20    }    
  



     列下使用Geotools 2.4操作shp格式的代码如下:
    代码1:  1public class ReadShape  {
2    public static void main(String[] args)
3        throws FileNotFoundException,MalformedURLException,IOException{
4       
5        File shpFile=new File("shp/市区地物_point.dbf");
6        ShapefileDataStore shpDataStore=new ShapefileDataStore(shpFile.toURL());
7        shpDataStore.setStringCharset(Charset.forName("GBK"));
8        FeatureSource fs=shpDataStore.getFeatureSource();
9        FeatureCollection collection = fs.getFeatures();
10        FeatureIterator iterator = collection.features();
11        int numOfAttr=0;
12        try {
13           while( iterator.hasNext() ){
14                Feature feature = iterator.next();
15                numOfAttr = feature.getNumberOfAttributes();
16                for(int i=0;i<numOfAttr;i++){
17                    String temp=feature.getAttribute(i).toString();
18                    System.out.print(temp+"\t");
19                }
20               
21                System.out.println();
22           }
23        }
24        finally {
25           iterator.close();
26        }
27    }
28}    代码2:
1public class ReadSHP  {
2    public static void main(String[] args)
3        throws FileNotFoundException,MalformedURLException,IOException{
4
5        //初始化FileChannel对象
6        FileChannel in = new FileInputStream("shp/市区地物_point.dbf").getChannel();
7        DbaseFileReader dr=new DbaseFileReader(in, true,Charset.forName("UTF-8"));
8        DbaseFileHeader dh = dr.getHeader();
9        int fields = dh.getNumFields();
10        for(int i=0;i<fields;i++){
11            System.out.print(dh.getFieldName(i)+" ");//打印当前属性名
12        }
13        System.out.print("\n");
14        while(dr.hasNext()){
15            DbaseFileReader.Row row = dr.readRow();
16            for (int i=0;i<fields;i++){
17                    Object data = row.read(i);
18                    if(dh.getFieldName(i).equals("NAME")){
19                            System.out.print(data);
20                    }else{
21                            System.out.print(data);
22                    }
23                    System.out.print("\t");
24            }
25            System.out.println();
26        }
27        dr.close();
28    }
29}   
    两段代码都可以直接运行。当然,从个人角度来看,代码2是我比较推荐的。不管是效率还是安全性,FileChannel对象比File对象应该还是强一些。
    算是又解决了一个问题。
    十一期间准备自己写一个shp2svg和shp2sql的小程序。第一呢,geoserver生成的svg样式也好,标注名称也好都好像不太好(也许是我自己对geoserver不熟悉的原因);第二呢,严重怀疑postgis自带的shp2pgsql这个程序对编码的支持度。除非我的数据库编码是EUN_CN,否则导入的数据是肯定有问题。

    不在考虑那些让我烦心的事情,也不想做一个“人无远虑,必有近忧”的思想者。一心一意专注于自己的爱好。其他时间也许“身不由己”,但是十一长假还是可以做到的。准备回乡下,到我的那间田间小屋去,断网6天!
分享到:
评论

相关推荐

    geotools 地理编码工具类

    geotools提供的地理编码工具类,不仅能够进行地址转换,还能对这些坐标点进行更高级的空间操作,比如判断点是否位于特定区域内。 在描述中提到,geotools可以用于判断经纬度点是否在特定区域内。这一功能的实现依赖...

    geotools对wms的实现支持

    GeoTools 对 WMS 的实现支持 GeoTools 是一个遵循 OGC 规范的开源 GIS 工具包,提供了地理信息数据读写、处理、坐标转换、查询分析、格式化输出等多个方面的功能。在 GeoTools 的基础上,我们可以实现一个简单的 ...

    geotools汉语版资料

    这个目录下的内容可能是社区成员对GeoTools英文文档的中文翻译尝试,尽管可能不够正式,但对于中文用户来说,这是理解和学习GeoTools的重要桥梁。即便翻译质量有限,也能提供基本的理解帮助。 6. **JTS** JTS...

    geotools中文资料,我学习时候,整理的资料,

    - **中文简陋的翻译**:这是对GeoTools官方文档或相关资料的中文翻译,尽管可能不够完善,但对于中文使用者来说,是宝贵的参考资料。 - **uml**:UML(统一建模语言)文件可能包含了GeoTools的类图或系统架构,有...

    Geotools Java API 开发gis的参考资料

    org.geotools org.geotools.arcsde org.geotools.arcsde.data org.geotools.arcsde.data.versioning org.geotools.arcsde.data.view org.geotools.arcsde.filter org.geotools.arcsde.gce org.geotools....

    GeoTools API

    org.geotools org.geotools.arcsde org.geotools.arcsde.data org.geotools.arcsde.data.view org.geotools.arcsde.filter org.geotools.arcsde.jndi org.geotools.arcsde.logging org.geotools.arcsde....

    geotools所需jar包合集

    GeoTools是一个开源的Java库,它提供了对地理信息系统(GIS)数据的访问和操作能力。这个库主要用于处理地理空间数据,包括地图、矢量数据和栅格数据。在Java开发中,GeoTools是一个不可或缺的工具,特别是在需要...

    Geotools API 手册

    Geotools API是构建GIS应用程序的基础,它支持多种GIS标准和数据格式,如OGC(开放地理空间联盟)的标准。 **Geotools API核心概念**: 1. **Module体系**:Geotools由多个模块组成,每个模块专注于特定的功能,如...

    geotools18.1依赖jar包

    1. 数据读取与写入:GeoTools支持多种GIS数据格式,如ESRI Shapefile、GeoTIFF、GML、KML、WFS、PostGIS数据库等,能够方便地进行数据导入导出操作。 2. 地图渲染:GeoTools可以将地理数据渲染成地图,支持多种地图...

    geotools依赖包

    这个“geotools依赖包”包含了一组模块,用于支持各种地理信息系统(GIS)的功能,如读取、写入和操作地理空间数据。GeoTools库遵循Java Community Process (JCP) 规范,特别是JSR 173 - Simple Features for Java,...

    geotools学习指南

    GeoTools学习指南 GeoTools是一款功能强大的开源GIS(Geographic Information System)工具包,提供了丰富的API和插件,帮助开发者快速构建GIS应用程序。在本指南中,我们将详细介绍GeoTools的基本概念、库函数、...

    geotools稳定版本geotools-19.4-bin.zip

    import org.geotools.data.FileDataStore; import org.geotools.data.FileDataStoreFinder; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.map.FeatureLayer; import org.geotools.map...

    geoTools所需jar包

    GeoTools库依赖于一系列的jar文件,这些文件提供了丰富的功能,包括读取和写入各种GIS数据格式,进行空间分析,以及支持OGC(开放地理空间联盟)标准。 1. **GeoTools库介绍**:GeoTools是一个遵循Apache 2.0许可的...

    geotools18.4开发离线jar包

    3. **几何对象操作**:GeoTools包含了对点、线、面等基本几何对象的创建、修改和分析功能,能够进行复杂的空间关系判断和几何操作。 4. **地图渲染**:GeoTools可以将地理数据渲染成地图,支持多种输出格式,如PNG...

    geotools相关jar包

    在GIS领域,开发者需要处理地图、空间数据、坐标系统转换等复杂任务,GeoTools提供了丰富的API和类来支持这些功能。 GeoTools的核心功能包括: 1. 数据读取与写入:GeoTools支持多种GIS数据格式,如Shapefile、GML...

    geotools依赖.rar

    4. **JDBC 驱动**:GeoTools支持多种数据库系统,如PostGIS,MySQL等,需要相应的JDBC驱动来连接和操作这些数据库中的空间数据。 5. **SIS (Spatial Information System)**:由Apache提供的库,为GeoTools提供了元...

    geotools相关jar包集合

    这个压缩包文件“geotools-18.4”包含了`geotools`库的一个特定版本,即18.4,这将对那些需要在项目中使用`geotools`功能的开发者非常有用。 `geotools`库的核心目标是实现OGC(开放地理空间联盟)标准,这些标准...

    geotools.rar

    这两个版本代表了Geotools的发展历程,24版本尤其引人注目,因为它增加了对坐标转换的强大支持。 坐标转换是GIS中一项关键任务,涉及到将地理坐标从一个坐标系转换到另一个坐标系。在描述中提到的3857、4490、4525...

Global site tag (gtag.js) - Google Analytics