JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2)
(后面添加对应geotools 10.0版本的写法)
读shape文件。
shape格式文件最少包含3个文件,他们的后缀是:.shp, .dbf, .shx。
.shp存储地理形状和位置信息,.dbf存储属性信息,.shx是索引文件。
单独读取DBF文件
public void readDBF(String path) {
Java代码
DbaseFileReader reader = null;
try {
reader = new DbaseFileReader(new ShpFiles(path), false, Charset.forName("GBK"));
DbaseFileHeader header = reader.getHeader();
int numFields = header.getNumFields();
//迭代读取记录
while (reader.hasNext()) {
try {
Object[] entry = reader.readEntry();
for (int i=0; i
String title = header.getFieldName(i);
Object value = entry[i];
System.out.println(title+"="+value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
//关闭
try {reader.close();} catch (Exception e) {}
}
}
}
读取3个文件,以point为例:
public void readSHP(String path) {
Java代码
ShapefileDataStore shpDataStore = null;
try{
shpDataStore = new ShapefileDataStore(new File(path).toURI().toURL());
shpDataStore.setStringCharset(Charset.forName("GBK"));
String typeName = shpDataStore.getTypeNames()[0];
FeatureSource featureSource = null;
featureSource = (FeatureSource)shpDataStore.getFeatureSource(typeName);
FeatureCollection result = featureSource.getFeatures();
System.out.println(result.size());
FeatureIterator itertor = result.features();
while(itertor.hasNext()){
SimpleFeature feature = itertor.next();
Collection p = feature.getProperties();
Iterator it = p.iterator();
while(it.hasNext()) {
Property pro = it.next();
if (pro.getValue() instanceof Point) {
System.out.println("PointX = " + ((Point)(pro.getValue())).getX());
System.out.println("PointY = " + ((Point)(pro.getValue())).getY());
} else {
System.out.println(pro.getName() + " = " + pro.getValue());
}
}
}
itertor.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch(IOException e) { e.printStackTrace(); }
}
写shape文件,以point为例:
Java代码
public static void main(String[] args) {
try{
//定义属性
final SimpleFeatureType TYPE = DataUtilities.createType("Location",
"location:Point," + //
"POIID:String," + //
"MESHID:String," + // a number attribute
"OWNER:String"
);
SimpleFeatureCollection collection = FeatureCollections.newCollection();
GeometryFactory geometryFactory = new GeometryFactory();
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
double latitude = Double.parseDouble("116.123456789");
double longitude = Double.parseDouble("39.120001");
String POIID = "2050003092";
String MESHID = "0";
String OWNER = "340881";
/* Longitude (= x coord) first ! */
Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));
Object[] obj = {point, POIID, MESHID, OWNER};
SimpleFeature feature = featureBuilder.buildFeature(null, obj);
collection.add(feature);
feature = featureBuilder.buildFeature(null, obj);
collection.add(feature);
File newFile = new File("D:/newPoi.shp");
ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
Map params = new HashMap();
params.put("url", newFile.toURI().toURL());
params.put("create spatial index", Boolean.TRUE);
ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
newDataStore.createSchema(TYPE);
newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84);
Transaction transaction = new DefaultTransaction("create");
String typeName = newDataStore.getTypeNames()[0];
SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
if (featureSource instanceof SimpleFeatureStore) {
SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
featureStore.setTransaction(transaction);
try {
featureStore.addFeatures(collection);
transaction.commit();
} catch (Exception problem) {
problem.printStackTrace();
transaction.rollback();
} finally {
transaction.close();
}
} else {
System.out.println(typeName + " does not support read/write access");
}
} catch (Exception e) {
e.printStackTrace();
}
}
以下代码对应geotools10.0版本
一、读shp文件(图形信息+属性信息)的写法:
Java代码
import java.io.File;
import java.nio.charset.Charset;
import java.util.Iterator;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.opengis.feature.Property;
import org.opengis.feature.simple.SimpleFeature;
public class ShpNew {
public static void main(String[] args) {
ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
try {
ShapefileDataStore sds = (ShapefileDataStore)dataStoreFactory.createDataStore(new File("D:\\work\\shpdir\\Poi.shp").toURI().toURL());
sds.setCharset(Charset.forName("GBK"));
SimpleFeatureSource featureSource = sds.getFeatureSource();
SimpleFeatureIterator itertor = featureSource.getFeatures().features();
while(itertor.hasNext()) {
SimpleFeature feature = itertor.next();
Iterator it = feature.getProperties().iterator();
while(it.hasNext()) {
Property pro = it.next();
System.out.println(pro);
}
}
itertor.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、读图形信息
Java代码
try {
ShpFiles sf = new ShpFiles("D:\\Poi.shp");
ShapefileReader r = new ShapefileReader( sf, false, false, new GeometryFactory() );
while (r.hasNext()) {
Geometry shape = (Geometry) r.nextRecord().shape(); //com.vividsolutions.jts.geom.Geometry;
System.out.println(shape.toString());
}
r.close();
} catch (Exception e) {
e.printStackTrace();
}
三、读dbf文件
Java代码
public void readDBF() {
try {
FileChannel in = new FileInputStream("D:\\Poi.dbf").getChannel();
DbaseFileReader dbfReader = new DbaseFileReader(in, false, Charset.forName("GBK"));
DbaseFileHeader header = dbfReader.getHeader();
int fields = header.getNumFields();
while ( dbfReader.hasNext() ){
DbaseFileReader.Row row = dbfReader.readRow();
// System.out.println(row.toString());
for (int i=0; i
System.out.println(header.getFieldName(i) + " : " + row.read(i));
}
}
dbfReader.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
四、写shape文件
Java代码
public void write(String filepath) {
try {
//创建shape文件对象
File file = new File(filepath);
Map params = new HashMap();
params.put( ShapefileDataStoreFactory.URLP.key, file.toURI().toURL() );
ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
//定义图形信息和属性信息
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
tb.setCRS(DefaultGeographicCRS.WGS84);
tb.setName("shapefile");
tb.add("the_geom", Point.class);
tb.add("POIID", Long.class);
tb.add("NAMEC", String.class);
ds.createSchema(tb.buildFeatureType());
ds.setCharset(Charset.forName("GBK"));
//设置Writer
FeatureWriter writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
//写下一条
SimpleFeature feature = writer.next();
feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate(116.123, 39.345)));
feature.setAttribute("POIID", 1234567890l);
feature.setAttribute("NAMEC", "某兴趣点1");
feature = writer.next();
feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate(116.456, 39.678)));
feature.setAttribute("POIID", 1234567891l);
feature.setAttribute("NAMEC", "某兴趣点2");
writer.write();
writer.close();
ds.dispose();
//读取刚写完shape文件的图形信息
ShpFiles shpFiles = new ShpFiles(filepath);
ShapefileReader reader = new ShapefileReader(shpFiles, false, true, new GeometryFactory(), false);
try {
while (reader.hasNext()) {
System.out.println(reader.nextRecord().shape());
}
} finally {
reader.close();
}
} catch (Exception e) { }
}
五、由源shape文件创建新的shape文件
Java代码
public void transShape(String srcfilepath, String destfilepath) {
try {
//源shape文件
ShapefileDataStore shapeDS = (ShapefileDataStore) new ShapefileDataStoreFactory().createDataStore(new File(srcfilepath).toURI().toURL());
//创建目标shape文件对象
Map params = new HashMap();
FileDataStoreFactorySpi factory = new ShapefileDataStoreFactory();
params.put(ShapefileDataStoreFactory.URLP.key, new File(destfilepath).toURI().toURL());
ShapefileDataStore ds = (ShapefileDataStore) factory.createNewDataStore(params);
// 设置属性
SimpleFeatureSource fs = shapeDS.getFeatureSource(shapeDS.getTypeNames()[0]);
//下面这行还有其他写法,根据源shape文件的simpleFeatureType可以不用retype,而直接用fs.getSchema设置
ds.createSchema(SimpleFeatureTypeBuilder.retype(fs.getSchema(), DefaultGeographicCRS.WGS84));
//设置writer
FeatureWriter writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
//写记录
SimpleFeatureIterator it = fs.getFeatures().features();
try {
while (it.hasNext()) {
SimpleFeature f = it.next();
SimpleFeature fNew = writer.next();
fNew.setAttributes(f.getAttributes());
writer.write();
}
} finally {
it.close();
}
writer.close();
ds.dispose();
shapeDS.dispose();
} catch (Exception e) { e.printStackTrace(); }
}