暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GeoTools之shp文件操作

爱编码 2021-07-20
4182

简介

GeoTools 是英国利兹大学(University of Leeds)的James Macgll 从1996 年开始研发的一个操作和显示地图的开源Java 代码库, [1]  提供了一系列符合规范的操作地理空间数据的方法,例如可以用它来实现一个地理信息系统(GIS)。GeoTools库在开发时执行OGC规范。目前GeoTools的最新版本是22-SNAPSHOT。 [2] 

GeoTools是一个开源的Java GIS工具包,可利用它来开发符合标准的地理信息系统。GeoTools提供了OGC(Open Geospatial Consortium)规范的一个实现来作为他们的开发。

操作

本文主要写的是利用GeoTools 连接shp文件,并对其进行增删改。

由于过于简单,就当笔记记录一下时间宝贵的同学就不要看了。

环境搭建

由于geotools是一个GIS类库,所以直接用maven进行构建就可以。

详细可以参考官方教程:http://docs.geotools.org/

数据源DataStore

这个可以理解为平时Java连接数据的时候那个数据源。

1.gt-main模块geotools支持从一系列数据源访问特征信息(即向量信息)。其他数据存储插件可以从gt-jdbc中获得,用于数据库访问。

数据模块主要是将外部服务、磁盘文件等中的数据(通常以特性的形式)提升到应用程序中。这是您最终可以开始使用工具箱的地方。

gt-main模块是实现附加DataStore的基础

所以要加入以下依赖

  1. <dependency>

  2. <groupId>org.geotools</groupId>

  3. <artifactId>gt-main</artifactId>

  4. <version>${geotools.version}</version>

  5. </dependency>

2. 获取数据源DataStore

官方文档不建议手工创建数据存储;相反,我们使用FactoryFinder,它将定位支持所请求格式的正确插件,也就是下面代码

  1. public DataStore getDataStore(String shpPath) throws Exception {

  2. File file = new File(shpPath);

  3. Map params = new HashMap();

  4. params.put("url", file.toURI().toURL());


  5. for (Iterator i = DataStoreFinder.getAvailableDataStores(); i.hasNext(); ) {

  6. DataStoreFactorySpi factory = (DataStoreFactorySpi) i.next();

  7. try {

  8. if (factory.canProcess(params)) {

  9. dataStore = factory.createNewDataStore(params);

  10. // 设置编码后可以正确读取

  11. ((ShapefileDataStore) dataStore).setCharset(Charset.forName("GBK"));

  12. typeName = dataStore.getTypeNames()[0];

  13. featureSource = dataStore.getFeatureSource(dataStore.getTypeNames()[0]);

  14. }

  15. } catch (Throwable warning) {

  16. warning.printStackTrace();

  17. }

  18. }

  19. return null;

  20. }

FeatureSource增删改

这个东西可以跟平时的mybatis的那个SqlSession,将增删改进行了封装

它让您能够以Java对象的形式访问地理空间信息。

要查看特性资源,如果当前用户有权修改或锁定特性,则可以支持额外的接口特性恢复和特性锁定。

其中的SimpleFeatureSource就已经封装好了相应增删改的操作API

最终代码如下所列:

1.往shp文件中增加记录
  1. public void addFeature(List<String> dataList) throws IOException {

  2. System.out.println("============addFeature=====start=====");

  3. SimpleFeatureStore store = (SimpleFeatureStore) dataStore.getFeatureSource(typeName);

  4. SimpleFeatureType featureType = store.getSchema();

  5. SimpleFeatureBuilder build = new SimpleFeatureBuilder(featureType);

  6. GeometryBuilder geom = new GeometryBuilder();

  7. List<SimpleFeature> list = new ArrayList<>();

  8. for (String row : dataList) {

  9. String[] rowArr = row.split(",");

  10. SimpleFeature feature = build.buildFeature(rowArr[0]);

  11. feature.setAttribute("ID", rowArr[0]);

  12. feature.setAttribute("NUM", rowArr[1]);

  13. feature.setAttribute("NAME", rowArr[2]);

  14. feature.setAttribute("MANAGER", rowArr[3]);

  15. feature.setAttribute("TYPE", rowArr[4]);

  16. feature.setAttribute("MESHID", rowArr[5]);

  17. feature.setAttribute("JDCODE", rowArr[6]);

  18. list.add(feature);

  19. }


  20. SimpleFeatureCollection collection = new ListFeatureCollection(featureType, list);

  21. Transaction transaction = new DefaultTransaction(handle);

  22. store.setTransaction(transaction);

  23. try {

  24. store.addFeatures(collection);

  25. transaction.commit(); // actually writes out the features in one go

  26. System.out.println("============addFeature=====done=====");

  27. } catch (Exception eek) {

  28. eek.printStackTrace();

  29. transaction.rollback();

  30. }

  31. }

2.往shp文件中修改一条记录
  1. public void updateFeature(String id) throws IOException {


  2. System.out.println("========updateFeature====start====");

  3. long currentTimeMillis = System.currentTimeMillis();

  4. Transaction transaction = new DefaultTransaction(handle);

  5. SimpleFeatureStore store = (SimpleFeatureStore) dataStore.getFeatureSource(typeName);

  6. store.setTransaction(transaction);

  7. FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();

  8. Filter filter = ff.equals(ff.property("ID"), ff.literal(id));

  9. SimpleFeatureType featureType = store.getSchema();

  10. try {

  11. store.modifyFeatures("ROAD", "xbmchina.cn", filter);

  12. transaction.commit();

  13. System.out.println("========updateFeature====end====");

  14. } catch (Exception eek) {

  15. eek.printStackTrace();

  16. transaction.rollback();

  17. }

  18. long l = System.currentTimeMillis() - currentTimeMillis;

  19. System.out.println("耗时:"+l/1000.0);


  20. }

3.往shp文件删除一条数据
  1. public void removeFeature(Set<String> ids) throws IOException {

  2. System.out.println("======removeFeature== start ========");

  3. long currentTimeMillis = System.currentTimeMillis();

  4. Transaction transaction = new DefaultTransaction(handle);

  5. SimpleFeatureStore store = (SimpleFeatureStore) dataStore.getFeatureSource(typeName);

  6. store.setTransaction(transaction);

  7. FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();

  8. List<Filter> match = new ArrayList<>();

  9. for (String id : ids) {

  10. Filter aMatch = ff.equals(ff.property("ID"), ff.literal(id));

  11. match.add(aMatch);

  12. }

  13. Filter filter = ff.or(match);

  14. try {

  15. store.removeFeatures(filter);

  16. transaction.commit();

  17. System.out.println("======removeFeature== done ========");

  18. } catch (Exception eek) {

  19. eek.printStackTrace();

  20. transaction.rollback();

  21. }

  22. long l = System.currentTimeMillis() - currentTimeMillis;

  23. System.out.println("耗时:"+l/1000.0);

  24. }

4.查询shp文件中记录
  1. public void getFeaturesByDataID(String id) throws IOException, CQLException {

  2. System.out.println("======getByDataID====start=====");

  3. long currentTimeMillis = System.currentTimeMillis();

  4. FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();

  5. // Filter filter = CQL.toFilter("ID = 'ef7872a5959448c8bfb24604adc07ada' ");

  6. Filter filter = ff.equals(ff.property("ID"), ff.literal(id));

  7. FeatureCollection<SimpleFeatureType, SimpleFeature> features = featureSource.getFeatures(filter);

  8. System.out.println("features size:" + features.size());

  9. FeatureIterator<SimpleFeature> featureIterator = features.features();

  10. // while (featureIterator.hasNext()) {

  11. // SimpleFeature feature = featureIterator.next();

  12. // Collection<Property> properties = feature.getProperties();

  13. // System.out.println(properties);

  14. // }

  15. System.out.println("======getByDataID====done=====");

  16. long l = System.currentTimeMillis() - currentTimeMillis;

  17. System.out.println("耗时:"+l/1000.0);

  18. }

参考文章

http://docs.geotools.org/latest/userguide/library/data/index.html http://docs.geotools.org/latest/userguide/library/data/datastore.html http://docs.geotools.org/latest/userguide/library/data/featuresource.html

最后

如果对 Java、大数据感兴趣请长按二维码关注一波,我会努力带给你们价值。觉得对你哪怕有一丁点帮助的请帮忙点个赞或者转发哦。关注公众号【爱编码】,小编会一直更新文章的哦。


文章转载自爱编码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论