前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GeoTools之shp文件操作

GeoTools之shp文件操作

作者头像
用户3467126
发布2019-07-12 15:18:37
3K0
发布2019-07-12 15:18:37
举报
文章被收录于专栏:爱编码爱编码爱编码
简介

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的基础

所以要加入以下依赖

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

2. 获取数据源DataStore

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

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;    }
FeatureSource增删改

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

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

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

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

最终代码如下所列:

1.往shp文件中增加记录
 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();        }    }
2.往shp文件中修改一条记录
 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);
    }
3.往shp文件删除一条数据
 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);    }
4.查询shp文件中记录
  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);    }

参考文章

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱编码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 操作
    • 环境搭建
      • 数据源DataStore
        • FeatureSource增删改
          • 1.往shp文件中增加记录
          • 2.往shp文件中修改一条记录
          • 3.往shp文件删除一条数据
          • 4.查询shp文件中记录
      • 参考文章
      • 最后
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档