|
|
|
|

用GeoTools读取Shapefile的属性数据

GeoTools是最重要的开源JavaGIS工具包,其中提供了很多实用的工具。但是苦于其文档实在不完整,故在这里简单地介绍GeoTools读取Shapefile属性数据的方法,也算是为和我一样想学习GeoTools但又不知如何下手的朋友们打开一个思路。其实这个很简单。使用GeoTo...

作者:classicning来源:GIS大学论坛|2007年11月08日
GeoTools是最重要的开源JavaGIS工具包,其中提供了很多实用的工具。但是苦于其文档实在不完整,故在这里简单地介绍GeoTools读取Shapefile属性数据的方法,也算是为和我一样想学习GeoTools但又不知如何下手的朋友们打开一个思路。

其实这个很简单。

使用GeoTools,我们今天要做的事情需要将gt2-shapefile-2.3.1.jar加到你的Build Path中。
众所周知,要属性数据保存在dbf文件中,因此为了能够读取属性数据,我们需要导入以下几个包:

import java.io.IOException;
import java.io.FileInputStream;
import java.nio.channels.FileChannel;

import org.geotools.data.shapefile.dbf.DbaseFileReader;
import org.geotools.data.shapefile.dbf.DbaseFileHeader;

GeoTools用Java.nio包中的FileChannel读取文件,这样初始化:

FileChannel in = new FileInputStream("data/res1_4m.dbf").getChannel();

于是初始化DbaseFileReader和DbaseFileHeader

DbaseFileReader dr = new DbaseFileReader(in, true);
DbaseFileHeader dh = dr.getHeader();
DFileReader构造函数的第二个参数是useMemoryMappedBuffer,具体的作用我也没有深入研究,只是从字面推断而已。
接下来从dh中获得字段数

fields = dh.getNumFields();
开始遍历dr,每次取出一行,行被封装在DbaseFileReader的内部类Row中。

while(dr.hasNext()){
        DbaseFileReader.Row row = dr.readRow();
}
遍历每一行中的每个域,读出其中的数据,打印出来,OK

while(dr.hasNext()){
        DbaseFileReader.Row row = dr.readRow();
        for (int i=0;i<fields;i++){
                Object data = row.read(i);
                if(dh.getFieldName(i).equals("NAME")){
                        // TO-DO:  charset error here.
                        String name = new String(data.toString().getBytes(),"utf-8");
                        System.out.print(name);
                }else{
                        System.out.print(data);
                }
                System.out.print("\t");
        }
        System.out.println();
}
上面的一段是因为我的dbf中含有中文,打印出是乱码,这个问题还是有待解决。
最后关闭dr。

dr.close();
还有别忘了给FileInputStream加上try...catch就行了。

上面介绍的是最简单的dbf读法。
GeoTools博大精深,但是其中包、类数量非常多,结构复杂,要想弄清还是要下一番功夫的。

上一篇:经纬度与高克投影转换代码(VB)

下一篇:计算几何常用算法