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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM