众所周知Geotools作为开源的Java GIS三方库,已经成为GIS服务器端的主流开源库,其功能非常强大,涉及到GIS业务的方方面面,其中就包括GIS数据的读写,今天小编就借助Geotools来实现shape数据的写入。

Geotools对于shape数据写入,主要提供了SimpleFeatureStore和FeatureWriter两个主要操作类,下面小编就根据这两个类实现shape数据的写入,废话不多说,直接上代码:

import org.geotools.data.*;
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;
import org.geotools.data.simple.SimpleFeatureStore;
import org.opengis.feature.simple.SimpleFeature; import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map; public class ShapwWriterTest { public static void main(String[] args) throws IOException {
File file = new File("D:\\data\\line_sheng.shp");
ShapefileDataStore shapefileDataStore = new ShapefileDataStore(file.toURI().toURL());
SimpleFeatureSource simpleFeatureSource = shapefileDataStore.getFeatureSource();
int count = simpleFeatureSource.getFeatures().size();
for(int i = 0;i<2; i++){
//分批插入(没啥逻辑,主要是验证多次写入同一个shp)
Query query = createQuery(i*(count / 2),count / 2);
SimpleFeatureCollection simpleFeatureCollection = simpleFeatureSource.getFeatures(query);
addFeature2Shp(simpleFeatureCollection,"D:\\data\\line_sheng_1.shp");
}
} /**
* 将simplefearurecollection写入目标shape
* @param simpleFeatureCollection
* @param filePath
* @throws IOException
*/
public static void addFeature2Shp(SimpleFeatureCollection simpleFeatureCollection, String filePath) throws IOException {
File file = new File(filePath);
ShapefileDataStore shapefileDataStore = null;
if (file.exists()){
shapefileDataStore = (ShapefileDataStore) DataStoreFinder.getDataStore(Collections.singletonMap("url",file.toURI().toURL()));
}else{
ShapefileDataStoreFactory shapefileDataStoreFactory = new ShapefileDataStoreFactory();
shapefileDataStore = (ShapefileDataStore) shapefileDataStoreFactory.createNewDataStore(Collections.singletonMap("url",file.toURI().toURL()));
shapefileDataStore.setCharset(Charset.defaultCharset());
shapefileDataStore.createSchema(simpleFeatureCollection.getSchema());
}
//获取simplefeaturestore
writerFeature(simpleFeatureCollection, shapefileDataStore);
//writerFeature1(simpleFeatureCollection,shapefileDataStore);
} /**
* 使用SimpleFeatureStore写入shape文件
* @param simpleFeatureCollection
* @param shapefileDataStore
* @throws IOException
*/
private static void writerFeature(SimpleFeatureCollection simpleFeatureCollection, ShapefileDataStore shapefileDataStore) throws IOException {
SimpleFeatureStore simpleFeatureStore = (SimpleFeatureStore) shapefileDataStore.getFeatureSource(shapefileDataStore.getTypeNames()[0]);
Transaction transaction = new DefaultTransaction("create");
simpleFeatureStore.setTransaction(transaction);
try {
simpleFeatureStore.addFeatures(simpleFeatureCollection);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
transaction.close();
}
} /**
* 使用FeatureWriter来写feature
* @param simpleFeatureCollection
* @param shapefileDataStore
* @throws IOException
*/
private static void writerFeature1(SimpleFeatureCollection simpleFeatureCollection, ShapefileDataStore shapefileDataStore) throws IOException {
FeatureWriter featureWriter = shapefileDataStore.getFeatureWriterAppend(Transaction.AUTO_COMMIT);
SimpleFeatureIterator simpleFeatureIterator = simpleFeatureCollection.features();
while(simpleFeatureIterator.hasNext()){
SimpleFeature simpleFeature = simpleFeatureIterator.next();
SimpleFeature simpleFeature1 = (SimpleFeature) featureWriter.next();
simpleFeature1.setAttributes(simpleFeature.getAttributes());
}
featureWriter.write();
featureWriter.close();
simpleFeatureIterator.close();
} private static Query createQuery(int startIndex,int queryCount){
Query query = new Query();
query.setStartIndex(startIndex);
query.setMaxFeatures(queryCount);
return query;
} /**
* 总结geotools 读取shape的几种方式
*/
private static void testReaderShape(String filePath) throws IOException {
//第一种方式
ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(filePath).toURI().toURL());
/**
* 使用上述这种方式读shape的话,其中的很多参数都是默认的,最主要的是它的编码是StandardCharsets.ISO_8859_1
* 因此我们需要单独设置下
*/
shapefileDataStore.setCharset(Charset.forName("UTF-8")); //第二种ShapefileDataStoreFactory
ShapefileDataStoreFactory shapefileDataStoreFactory = new ShapefileDataStoreFactory();
Map<String,?> paramMap = new HashMap<>();
/**
* 通常有那些参数,我们可以通过下面的这个函数去查看,这里面
*/
shapefileDataStoreFactory.createNewDataStore(paramMap);
//第三种方式,这种方式可适用于各种基于SPI模式的文件读写
DataStoreFinder.getDataStore(paramMap);
} }

好了,今天关于Geotools写入shape的代码就分享到这里,而关于shape文件的操作,还有很多内容,其中最主要的过滤(Filter)后续也会出个专题来记录下,毕竟这里的东西很多。

Geotools实现shape文件的写入的更多相关文章

  1. JAVA用geotools读写shape格式文件

    转自:http://toplchx.iteye.com/blog/1335007 JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2) (后面添加对应geotoo ...

  2. JAVA用geotools读取shape格式文件

    Shapefile属于一种矢量图形格式,它能够保存几何图形的位置及相关属性.但这种格式没法存储地理数据的拓扑信息. 其中,要组成一个Shapefile,有三个文件是必不可少的,它们分别是". ...

  3. 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题

    转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...

  4. Java使用Geotools读取shape矢量数据

    作为GIS开发者而言,矢量数据是我们经常要用到的,而shape数据是矢量数据中最常用的格式,因此解析shape数据也是作为GIS软件开发人员必备的基础技能,而GeoTools无疑是Java最好用来处理 ...

  5. java中的文件读取和文件写出:如何从一个文件中获取内容以及如何向一个文件中写入内容

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  6. Android从网络某个地址下载文件、写入SD卡

    首先创建一个HttpDownloader类,获取下载文件的网络地址,将文件下载下来以String流的方式返回: public String download(String urlStr){ //url ...

  7. 自定义shape文件

    1.shape文件 btn_bg.xml文件内容 <?xml version="1.0" encoding="utf-8"?> <shape ...

  8. DWG2SHP DXF2SHP 如何把AutoCAD的DWG,DXF文件转换为Esri ArcGIS的Shape文件

    dwg是AutoCAD创立的一种图纸保存格式,已经成为二维CAD的标准格式,很多其他CAD为了兼容AutoCAD,也直接使用dwg作为默认工作文件. 地图shape文件由ESRI开发,一个ESRI的s ...

  9. 看到shape文件可以加载到GOOGLE EARTH上的方法,有空可以试试

    引用 Shape文件转为KMZ并在Google Earth中显示 (1)在ArcGIS中加载一个Shape文件,笔者加载的是某个地区的道路(双线道路)图层 (2)在ArcToolbox中,依次展开Co ...

  10. Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据

    背景 Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据. 折腾过程 1.找到了参考资料: writing to existing workbook using xlw ...

随机推荐

  1. 常用设计模式之.Net示例代码合集

    每一次初学者粉丝朋友,在后台向我咨询编程问题,我除了给他们指导学习路线,我都会建议他们学完基础知识后,一定要要注重编程规范,学习设计模式,修炼内功. 虽然说很多程序员,他们日常主要工作是CRUD,但是 ...

  2. Python安装部署 - virtualenv虚拟环境配置(Windows)

    Python安装部署 - virtualenv虚拟环境 目录 Python安装部署 - virtualenv虚拟环境 前言 安装virtualenv 搭建虚拟环境 搭建虚拟环境指定路径 PyCharm ...

  3. extra别名,即给列取别名

    extra别名,即给列取别名 Student.objects.all().extra(select={"name":"nickname"}) nickname为 ...

  4. c#构建具有用户认证与管理的socks5代理服务端

    Socks 协议是一种代理 (Proxy) 协议, 例如我们所熟知的 Shdowsocks 便是 Socks 协议的一个典型应用程序, Socks 协议有多个版本, 目前最新的版本为 5, 其协议标准 ...

  5. 一个线上全文索引BUG的排查:关于类阿拉件数字的分词与检索

    说到全文检索的分词,多半讲到的是中(日韩)文分词,少有英文等拉丁文系语言,因为英语单词天然就是分词的. 但更少讲到阿拉伯数字.比如金额,手机号码,座机号码等等. 以下不是传统的从0开始针对mysql全 ...

  6. Sentinel基本使用与源码分析

    系列文章目录和关于我 一丶什么是Sentinel Sentinel官网 Sentinel 是面向分布式.多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由.流量控制.流量整形.熔断降级 ...

  7. Python连接es笔记三之es更新操作

    本文首发于公众号:Hunter后端 原文链接:Python连接es笔记三之es更新操作 这一篇笔记介绍如何使用 Python 对数据进行更新操作. 对于 es 的更新的操作,不用到 Search() ...

  8. ffuf的使用

    ffuf:模糊测试 使用 ffuf 进行枚举.模糊测试和目录暴力破解 安装 https://github.com/ffuf/ffuf 建议:https://github.com/danielmiess ...

  9. NixOS 与 Nix Flakes 新手入门

    独立博客阅读: https://thiscute.world/posts/nixos-and-flake-basics/ 长文警告️ 本文的目标 NixOS 版本为 22.11,Nix 版本为 2.1 ...

  10. ARC114F Permutation Division

    题意 给定一个 \(1 \sim N\) 的排列,Alice 把它划分成 \(k\) 段,Bob 把这 \(k\) 段任意排列.Alice 想让字典序最小,Bob 想让字典序最大.请问最后的排列. 数 ...