Shapefile代码示例

1. 读取Shapefile文件

1.1 实现思路

graph TD
A[查找必要文件] --> B[获取文件编码]
B --> C[打开图层]
C --> D[获取要素集]
D --> G[关闭图层]

1.2 代码示例


public static SimpleFeatureCollection readShp(String shpPath) {
List<String> bys = CollUtil.newArrayList(".shp",".shx",".dbf",".prj");
for (String by : bys) {
String path = CharSequenceUtil.replaceLast(shpPath, ".shp", by,true);
if(!FileUtil.exist(path)){
throw new RuntimeException(by+"类型的文件不存在");
}
} Charset shpCharset = null;
String cpgPath = CharSequenceUtil.replaceLast(shpPath, ".shp", ".cpg",true);
if(FileUtil.exist(cpgPath)){
File cpgFile = FileUtil.file(cpgPath);
Charset cpgCharset = CharsetDetector.detect(cpgFile);
String cpgString = FileUtil.readString(cpgFile, cpgCharset);
try {
shpCharset = Charset.forName(cpgString.trim());
} catch (Exception e) {
throw new RuntimeException("CPG文件保存的编码格式错误");
}
} if (shpCharset == null) {
String dbfPath = CharSequenceUtil.replaceLast(shpPath, ".shp", ".dbf",true);
if(FileUtil.exist(dbfPath)){
byte[] bs = FileUtil.readBytes(dbfPath);
if (bs != null && bs.length >= 30) {
byte b = bs[29];
if (b == 0x4d) {
shpCharset = Charset.forName("GBK");
}
}
}
} if(shpCharset == null){
shpCharset = StandardCharsets.UTF_8;
} try {
File file = new File(shpPath);
ShapefileDataStore shpDataStore = new ShapefileDataStore(file.toURI().toURL());
shpDataStore.setCharset(shpCharset);
String typeName = shpDataStore.getTypeNames()[0];
SimpleFeatureSource source = shpDataStore.getFeatureSource(typeName);
shpDataStore.dispose();
return source.getFeatures();
} catch (IOException e) {
throw new RuntimeException(e);
}
}

Shapefile文件编码参考文档

2. 写入Shapefile文件

2.1 实现思路

graph TD
A[构建图层结构] --> B[写入要素]
B --> C[关闭图层]
C --> D[写入编码]

2.2 代码示例


public static void writeShp(String shpPath, SimpleFeatureCollection featureCollection){
try {
File shapeFile = new File(shpPath);
Map<String, Serializable> params = new HashMap<>();
params.put(ShapefileDataStoreFactory.URLP.key, shapeFile.toURI().toURL()); ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
SimpleFeatureType featureType = featureCollection.getSchema();
ds.createSchema(featureType);
Charset charset = StandardCharsets.UTF_8;
ds.setCharset(charset); String typeName = ds.getTypeNames()[0];
FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriterAppend(typeName, Transaction.AUTO_COMMIT); try (FeatureIterator<SimpleFeature> features = featureCollection.features()) {
while (features.hasNext()) {
SimpleFeature feature = features.next();
writer.hasNext();
SimpleFeature writefeature = writer.next();
writefeature.setDefaultGeometry(feature.getDefaultGeometry()); for (PropertyDescriptor d : featureType.getDescriptors()) {
if (!(feature.getAttribute(d.getName()) instanceof Geometry)) {
Name name = d.getName();
Object value = feature.getAttribute(name);
writefeature.setAttribute(name, value);
}
} writer.write();
}
} writer.close();
ds.dispose(); String cpgPath = shpPath.substring(0, shpPath.lastIndexOf(".")) + ".cpg";
FileUtil.writeString("UTF-8", cpgPath, StandardCharsets.UTF_8);
}catch (Exception e){
throw new RuntimeException(e);
}
}

3. Shapefile代码操作的原则

  • 默认使用UTF-8编码格式,根据实际情况处理编码问题

Shapefile代码示例的更多相关文章

  1. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

  2. Java8-Function使用及Groovy闭包的代码示例

    导航 定位 概述 代码示例 Java-Function Groovy闭包 定位 本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场 ...

  3. [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例

    懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...

  4. SELECT控件操作的JS代码示例

    SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...

  5. 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好

    HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...

  6. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  7. C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例

    DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...

  8. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  9. 领域驱动开发推荐代码示例 — Microsoft NLayerApp

    简介: Microsoft NLayerApp是由微软西班牙团队出品的基于.NET 4.0的“面向领域N层分布式架构”代码示例,在codeplex上的地址是:http://microsoftnlaye ...

  10. Zeller公式推导及C#代码示例(待完善)

    Zeller公式用于计算给定日期是星期几. 该方法可以用数论知识进行证明. 假设给定日期Date为Year-Month-Day,求解该日期是星期几的问题实际上就是以之前某个确定星期几的日期作为参考点, ...

随机推荐

  1. 自学PHP笔记(二)PHP数据类型

    PHP数据类型可支持以下8种类型: 类型 说明 string 字符串 boolean 布尔值 integer 整型 float 浮点型 array 数组 object 对象 resource 资源 N ...

  2. ToDesk云电脑开启公测!支持AIGC、高性能渲染等场景,价格低至0.98元

    在云计算和人工智能技术飞速发展的今天,云电脑作为一种新型的计算模式,正逐渐改变着传统电脑的使用方式.近日,ToDesk云电脑宣布开启公测,以其支持AIGC(人工智能.大数据.云计算等技术的融合应用). ...

  3. nginx关于正向代理与反向代理的概念区分

    正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理. 反向代理 反向代理中客户端对 ...

  4. NES 名词解释

    本文介绍了 NES(FC.红白机.小霸王)中一些名词或者术语,主要与 PPU 有关. Tile 8x8 像素图像.每像素 2 比特, 共 16 字节大小.每个像素可以使用 4 种颜色. Sprite ...

  5. [Windows]文件搜索利器Everything(附zip)

    前言 写代码过程中,老大突然发一条信息 老大:这周周报发一下. 我:好的. 然后我就 显示桌面 打开-我的电脑 找到E盘,找到周报文件夹 寻找到所有周报中今天的周报 复制发送 当我用上Everythi ...

  6. 硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计

    ​ Air780E是合宙低功耗4G-Cat.1模组经典型号之一,上期我们解答了大家关心的系列问题,并讲解了选型的注意要点. 有朋友问:能不能讲些硬件设计相关的内容? 模组的上电开机,是硬件设计调试的第 ...

  7. 成为JavaGC专家Part II — 如何监控Java垃圾回收机制

    本文是成为Java GC专家系列文章的第二篇.在第一篇<深入浅出Java垃圾回收机制>中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5 ...

  8. k8s之基础篇

    相关概念: kube-apierver: 控制平面组件,负责kubernetes api, 处理接受的请求工作 kube-controller-manager: 控制平面组件, 负责运行控制器进程 k ...

  9. MySQL之批量更新多条记录不同值

    之前文章:https://www.cnblogs.com/xingxia/p/mysql_basic.html mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytab ...

  10. Python 在同一/或不同PDF之间复制页面

    操作PDF文档时,复制其中的指定页面可以帮助我们从PDF文件中提取特定信息,如文本.图表或数据等,以便在其他文档中使用.复制PDF页面也可以实现在不同文件中提取页面,以创建一个新的综合文档.本文将介绍 ...