目录
一.GeoTools介绍
GeoTools是一套操作和显示地图的开源Java 代码库,提供了一系列符合规范的操作地理空间数据的方法,GeoTools被许多项目使用,在地理信息领域有着广泛的应用。
二.背景
本文介绍的是如何使用GeoTools把几何相交结果输出shp,并压缩成zip。
三.实现代码
下面定义了一个 saveIntersectShp()方法,调用这个方法即可实现把几何相交结果输出shp,并压缩成zip。
public static String saveIntersectShp(List<IntersectGeometryDTO> intersectGeometryList,String intersectShpName){
String webDir = Sys.ERROR_INFO_TEMP + Sys.BACKSLASH + UuidUtil.get36UUID();
String saveDir = FileUtils.getSavePath(webDir);
if (!FileUtils.dirIsExist(saveDir)){
FileUtils.creatDir(saveDir);
}
String webPath = webDir + Sys.BACKSLASH + intersectShpName + "_" + UuidUtil.get36UUID() + ".shp";
String savePath = FileUtils.getSavePath(webPath);
File file = new File(savePath);
FileOutputStream outputStream = null;
try {
final SimpleFeatureType type = DataUtilities.createType(
"Location",
"the_geom:MultiPolygon:srid=4326," +
"name:String,"+
"area:String,"
);
ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
Map params = new HashMap();
params.put("url",file.toURI().toURL());
params.put("create spatial index", Boolean.TRUE);
ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
newDataStore.setCharset(Charset.forName("GBK"));
newDataStore.createSchema(type);
List<SimpleFeature> features = new ArrayList<SimpleFeature>();
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(type);
for (IntersectGeometryDTO intersectGeometryDTO:intersectGeometryList){
Geometry geometry = intersectGeometryDTO.getGeom();
String geometryType = geometry.getGeometryType();
String name = intersectGeometryDTO.getName();
String area = intersectGeometryDTO.getArea();
if (geometryType.equals("Polygon")){
Polygon polygon = (Polygon) geometry;
featureBuilder.add(polygon);
}else if (geometryType.equals("MultiPolygon")){
MultiPolygon multiPolygon = (MultiPolygon) geometry;
featureBuilder.add(multiPolygon);
}else if (geometryType.equals("GeometryCollection")){
int numGeometries = geometry.getNumGeometries();
Geometry geometryChird = null;
String geoType = null;
Geometry geometryUnion = null;
for (int i = 0;i < numGeometries;i++){
geometryChird = geometry.getGeometryN(i);
geoType = geometryChird.getGeometryType();
if (geoType.equals("Polygon") || geoType.equals("MultiPolygon")){
if (geometryUnion == null){
geometryUnion = geometryChird;
}else {
geometryUnion = geometryUnion.union(geometryChird);
}
}
}
if (geometryUnion != null){
if (geometryUnion.getGeometryType().equals("MultiPolygon")){
MultiPolygon multiPolygon = (MultiPolygon) geometryUnion;
featureBuilder.add(multiPolygon);
}else {
Polygon polygon = (Polygon) geometryUnion;
featureBuilder.add(polygon);
}
}else {
continue;
}
}else {
continue;
}
if (StringUtil.isEmpty(name)){
name = "";
}
if (StringUtil.isEmpty(area)){
area = "";
}
featureBuilder.add(new String(name.getBytes("gbk"),"gbk"));
featureBuilder.add(area);
SimpleFeature feature = featureBuilder.buildFeature(null);
features.add(feature);
}
SimpleFeatureSource featureSource = newDataStore.getFeatureSource();
Transaction transaction = new DefaultTransaction("create");
SimpleFeatureStore featureStore =(SimpleFeatureStore) featureSource;
SimpleFeatureCollection collection = new ListFeatureCollection(type, features);
featureStore.setTransaction(transaction);
try {
featureStore.addFeatures(collection);
transaction.commit();
} catch (Exception problem) {
problem.printStackTrace();
transaction.rollback();
} finally {
transaction.close();
}
File inFile = new File(saveDir);
outputStream = new FileOutputStream(new File(saveDir + ".zip"));
Boolean toZip = ZipUtil.toZip(inFile,outputStream,true);
if (toZip){
FileUtils.deleteDir(saveDir);
return webDir + ".zip";
}
outputStream.flush();
outputStream.close();
return null;
}catch (Exception e){
e.printStackTrace();
}finally {
if (outputStream != null){
try {
outputStream.flush();
outputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
return null;
}