概述:
本文讲述如何在geotools中实现shp数据的缓冲区分析并保存到shp文件中。
效果:
实现代码:
package com.lzugis.geotools; import java.io.File; import java.io.Serializable; import java.nio.charset.Charset; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.geotools.data.FeatureWriter; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Polygon; public class ShapeBuffer { /** * 缓冲区分析 * @param geom * @param distance * @return */ public Geometry calBuffer(Geometry geom, double distance){ return geom.buffer(distance); } public static void main(String[] args){ long start = System.currentTimeMillis(); ShapeBuffer geoR = new ShapeBuffer(); String shpfile = "/Users/lzugis/Documents/chinadata/capital.shp"; String buffile = "/Users/lzugis/Documents/chinadata/capital_buffer.shp"; try{ //读取shp文件 File file = new File(shpfile); ShapefileDataStore shpDataStore = null; shpDataStore = new ShapefileDataStore(file.toURL()); //设置编码 Charset charset = Charset.forName("GBK"); shpDataStore.setCharset(charset); String typeName = shpDataStore.getTypeNames()[0]; SimpleFeatureSource featureSource = null; featureSource = shpDataStore.getFeatureSource (typeName); SimpleFeatureCollection result = featureSource.getFeatures(); SimpleFeatureIterator itertor = result.features(); //创建shape文件对象 File fileBuf = new File(buffile); Map<String, Serializable> params = new HashMap<String, Serializable>(); params.put( ShapefileDataStoreFactory.URLP.key, fileBuf.toURI().toURL() ); ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params); SimpleFeatureType sft = featureSource.getSchema(); List<AttributeDescriptor> attrs = sft.getAttributeDescriptors(); //定义图形信息和属性信息 SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder(); tb.setCRS(DefaultGeographicCRS.WGS84); tb.setName("shapefile"); for(int i=0;i<attrs.size();i++){ AttributeDescriptor attr = attrs.get(i); String fieldName = attr.getName().toString(); if(fieldName=="the_geom"){ tb.add(fieldName, Polygon.class); } else{ tb.add(fieldName, String.class); } } ds.createSchema(tb.buildFeatureType()); //设置编码 ds.setCharset(charset); //设置Writer FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT); while (itertor.hasNext()) { SimpleFeature feature = itertor.next(); SimpleFeature featureBuf = writer.next(); featureBuf.setAttributes(feature.getAttributes()); Geometry geo = (Geometry)feature.getAttribute("the_geom"); Geometry geoBuffer = geoR.calBuffer(geo, 1.5); featureBuf.setAttribute("the_geom", geoBuffer); } writer.write(); writer.close(); itertor.close(); } catch(Exception e){ e.printStackTrace(); } System.out.println("共耗时"+(System.currentTimeMillis() - start)+"ms"); } }
---------------------------------------------------------------------------------------------------------------
技术博客
CSDN:http://blog.csdn.NET/gisshixisheng
博客园:http://www.cnblogs.com/lzugis/
在线教程
http://edu.csdn.Net/course/detail/799
Github
https://github.com/lzugis/
联系方式
q q:1004740957
e-mail:niujp08@qq.com
公众号:lzugis15
Q Q 群:452117357(webgis)
337469080(Android)