geotools学习:对shp文件中的要素进行增删改查

249 阅读1分钟

添加依赖

<dependency>
  <groupId>org.geotools</groupId>
  <artifactId>gt-main</artifactId>
  <version>${geotools.version}</version>
</dependency>

获取datastore

public DataStore getDataStore(String shpPath) throws Exception {
        File file = new File(shpPath);
        Map params = new HashMap();
        params.put("url", file.toURI().toURL());
        for (Iterator i = DataStoreFinder.getAvailableDataStores(); i.hasNext(); ) {
            DataStoreFactorySpi factory = (DataStoreFactorySpi) i.next();
            try {
                if (factory.canProcess(params)) {
                    dataStore = factory.createNewDataStore(params);
                    // 设置编码后可以正确读取
                    ((ShapefileDataStore) dataStore).setCharset(Charset.forName("GBK"));
                    typeName = dataStore.getTypeNames()[0];
                    featureSource = dataStore.getFeatureSource(dataStore.getTypeNames()[0]);
                }
            } catch (Throwable warning) {
                warning.printStackTrace();
            }
        }
        return null;
    }

增加

//增加要素
public void addFeature(List<String> dataList) throws IOException {            
     System.out.println("============addFeature=====start=====");        
     SimpleFeatureStore store = (SimpleFeatureStore) dataStore.getFeatureSource(typeName);        
     SimpleFeatureType featureType = store.getSchema();       
     SimpleFeatureBuilder build = new SimpleFeatureBuilder(featureType);       
     GeometryBuilder geom = new GeometryBuilder();        
      List<SimpleFeature> list = new ArrayList<>();       
     for (String row : dataList) {
        String[] rowArr = row.split(",");
        SimpleFeature feature = build.buildFeature(rowArr[0]);
        feature.setAttribute("ID", rowArr[0]);
        feature.setAttribute("NUM", rowArr[1]);
        feature.setAttribute("NAME", rowArr[2]);
        feature.setAttribute("MANAGER", rowArr[3]);
        feature.setAttribute("TYPE", rowArr[4]);
        feature.setAttribute("MESHID", rowArr[5]);
        feature.setAttribute("JDCODE", rowArr[6]);
        list.add(feature);
        }
        SimpleFeatureCollection collection = new ListFeatureCollection(featureType, list);
        Transaction transaction = new DefaultTransaction(handle);
        store.setTransaction(transaction);
        try {
            store.addFeatures(collection);
            transaction.commit(); // actually writes out the features in one go                System.out.println("============addFeature=====done====="); 
       } catch (Exception eek) {
            eek.printStackTrace();
            transaction.rollback();
        } 
   }

修改要素

 public void updateFeature(String id) throws IOException {
        System.out.println("========updateFeature====start====");
        long currentTimeMillis = System.currentTimeMillis();
        Transaction transaction = new DefaultTransaction(handle);
        SimpleFeatureStore store = (SimpleFeatureStore) dataStore.getFeatureSource(typeName);                
        store.setTransaction(transaction);
        FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
        Filter filter = ff.equals(ff.property("ID"), ff.literal(id)); 
       SimpleFeatureType featureType = store.getSchema();
        try {
            store.modifyFeatures("ROAD", "xbmchina.cn", filter);
            transaction.commit();
            System.out.println("========updateFeature====end====");
        } catch (Exception eek) { 
           eek.printStackTrace();
            transaction.rollback(); 
       }
        long l = System.currentTimeMillis() - currentTimeMillis;
        System.out.println("耗时:"+l/1000.0);
    }

删除要素

public void removeFeature(Set<String> ids) throws IOException {          
         System.out.println("======removeFeature== start ========"); 
       long currentTimeMillis = System.currentTimeMillis();
        Transaction transaction = new DefaultTransaction(handle);
        SimpleFeatureStore store = (SimpleFeatureStore) dataStore.getFeatureSource(typeName);
        store.setTransaction(transaction);
        FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
        List<Filter> match = new ArrayList<>();
        for (String id : ids) {
            Filter aMatch = ff.equals(ff.property("ID"), ff.literal(id));
            match.add(aMatch);
        }
        Filter filter = ff.or(match);
        try {
            store.removeFeatures(filter);
            transaction.commit(); 
           System.out.println("======removeFeature== done ========");
        } catch (Exception eek) {
            eek.printStackTrace(); 
            transaction.rollback();
        }
        long l = System.currentTimeMillis() - currentTimeMillis;
        System.out.println("耗时:"+l/1000.0);
    }

查看记录

public void getFeaturesByDataID(String id) throws IOException, CQLException {        
        System.out.println("======getByDataID====start=====");
        long currentTimeMillis = System.currentTimeMillis(); 
        FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();//
        Filter filter = CQL.toFilter("ID = 'ef7872a5959448c8bfb24604adc07ada' ");
        Filter filter = ff.equals(ff.property("ID"), ff.literal(id));
        FeatureCollection<SimpleFeatureType, SimpleFeature> features = featureSource.getFeatures(filter); 
        System.out.println("features size:" + features.size());
        FeatureIterator<SimpleFeature> featureIterator = features.features();//
        while (featureIterator.hasNext()) {//
            SimpleFeature feature = featureIterator.next();//
            Collection<Property> properties = feature.getProperties();//
            System.out.println(properties);//
        }
        System.out.println("======getByDataID====done=====");
        long l = System.currentTimeMillis() - currentTimeMillis;
        System.out.println("耗时:"+l/1000.0);    }