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博大精深,但是其中包、类数量非常多,结构复杂,要想弄清还是要下一番功夫的。
其实这个很简单。
使用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博大精深,但是其中包、类数量非常多,结构复杂,要想弄清还是要下一番功夫的。