• geotools实现shp数据的缓冲区分析


    概述:

    本文讲述如何在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)



  • 相关阅读:
    SysUtils.UpperCase、SysUtils.LowerCase 大小写转换
    Sql Server 2005 数据库备份还原后出现“受限制用户”问题的解决
    为什么要跪谢
    【基础】C#卸载快捷方式添加
    DataTable 复制 DataRow 出现 “该行已经属于另一个表”错误的解决办法
    将int型转化成五位字符串,前面用0填充
    C#嵌套类的使用方法及特性(转)
    net内存回收与Dispose﹐Close﹐Finalize方法(转)
    sqlhelper中文注释版(转)
    windows2003消息队列的安装
  • 原文地址:https://www.cnblogs.com/lzugis/p/7224349.html
Copyright © 2020-2023  润新知