zoukankan      html  css  js  c++  java
  • geotools学习之读取shape文件和创建shape文件

    最近两周一直在看geotools,经过两周的学习对geotools有了一个大概的认识,能做做一些基本的业务分析,说到geotools就让我想到arcgis的AE,记得去年我研究AE整整用了两个月的时间才有一点认识,arcgis系列的开发体系完整而且庞大,学习成本较高,在这里主要写一篇关于shape文件的读取和创建,关于里面一些包的引用,对代码做一些简单的注解。这里我用的geotools版本是20。说个坑关于import org.locationtech.jts.geom.Geometry;和import com.vividsolutions.jts.geom.Geometry;前者是新版本所采用的JTS,后者是老版本采用的JTS,你要采用像geotools的20版本,用前者,用geotool的18版本以前的用后者,否则会报错。

    一、shape文件读取

    1、主要的引用

    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;

    2、获取feature代码

                //shape文件路径
                String shpfile = "C:/Users/lenovo/Desktop/shape/locations1.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];
                System.out.println(typeName);
                SimpleFeatureSource featureSource = null;
                //根据图层名称来获取要素的source
                featureSource = shpDataStore.getFeatureSource (typeName);
                //获取要素集
                SimpleFeatureCollection result = featureSource.getFeatures();
                //获取要素集合,方便进行迭代读取每一个要素
                SimpleFeatureIterator itertor = result.features(); 

    3、关于要素集合迭代代码示例

                 //循环读取feature,itertor.hasNext()表示游标下一个是否有数据,有返回ture,否则为false               
                while (itertor.hasNext())
                {
                    //获取每一个要素
                    SimpleFeature feature = itertor.next();
    
                } 

    二、创建shape文件

    1、主要的引用

    import org.opengis.feature.simple.SimpleFeature;
    import org.opengis.feature.simple.SimpleFeatureType;
    import org.opengis.feature.type.AttributeDescriptor;
    import org.geotools.data.FeatureWriter;
    import org.geotools.data.Transaction;
    import org.locationtech.jts.geom.Coordinate;
    import org.locationtech.jts.geom.Geometry;
    import org.locationtech.jts.geom.Point;

    2、创建shape文件核心代码

    	        //设置要素的字段名称及其类型
    	        final SimpleFeatureType TYPE =
    	                DataUtilities.createType(
    	                        "Location",
    	                        "the_geom:Point:srid=4326,"// geometry属性设置
    	                                + "name:String,"// 一个字符串属性                               
    	                                + "number:Integer" // 数字属性设置
    	                        );
                    //创建要素集合
    	        List<SimpleFeature> features = new ArrayList<>();
                    //创建要素模板
    	        SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
                    double latitude = Double.parseDouble(tokens[0]);
    	        double longitude = Double.parseDouble(tokens[1]);
    	        String name = tokens[2].trim();
    	        int number = Integer.parseInt(tokens[3].trim());
    	        //创建一个点geometry
    	        Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));
    	        //添加geometry属性
    	        featureBuilder.add(point);
    	        /添加name属性
    	        featureBuilder.add(name);
    	        //添加number属性
    	        featureBuilder.add(number);
    	        //构建要素
    	        SimpleFeature feature = featureBuilder.buildFeature(null);
    	        //将要素添加到要素几何中
    	         features.add(feature);
                    	        String shpfile = "C:/Users/lenovo/Desktop/shape/New.shp";
    	        File newFile = getNewShapeFile(file);
    	        //创建shapefileDataStore工厂
    	        ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
    	        //参数设置
    	        Map<String, Serializable> params = new HashMap<>();
    	        params.put("url", newFile.toURI().toURL());
    	        params.put("create spatial index", Boolean.TRUE);
    	        //根据关键字创建shapefileDataStore
    	        ShapefileDataStore newDataStore =(ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
                   //设置编码,防止中文乱码
                   Charset charset = Charset.forName("GBK");
                   newDataStore.setCharset(charset);
    	       //创建文件描述内容
    	       newDataStore.createSchema(TYPE);
                   //设置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());
                    //获取the_geom属性的值
                    Geometry geo =(Geometry) feature.getAttribute("the_geom");
                    Geometry geoBuffer = geoR.calBuffer(geo, 3);
                    System.out.println(geoBuffer);
                    //重新覆盖the_geom属性的值,这里的geoBuffer必须为Geometry类型
                    featureBuf.setAttribute("the_geom", geoBuffer);
                } 
                //将所有数据写入
                writer.write();
                //关闭写入流
                writer.close();
  • 相关阅读:
    Two Sum
    Longest Common String
    Maximum Subarray
    Copy List with Random Pointer
    Convert Binary Search Tree to Doubly Linked List
    Fast Power
    Centos7安装ELK Cyrus
    IPv6实验 OSPFv3
    IPv6笔记和实验 RIPng
    IPv6 ICMPv6笔记
  • 原文地址:https://www.cnblogs.com/tuboshu/p/10752288.html
Copyright © 2011-2022 走看看