java使用geotools导出shp文件

SHP格式是一种矢量数据格式,用于存储地理信息系统(GIS)数据。
SHP文件由一系列有序的文件组成,我们导出的shp文件包括.shp、.shx、.dbf、.prj以及.fix文件。

  1. .shp(shape)文件:存储矢量地图数据,记录了每个要素的空间位置信息。
  2. .shx(shape index)文件:是索引文件,用于存储.shp文件中要素的位置,加快数据访问速度。
  3. .dbf(dBase)文件:存储矢量数据的属性信息,例如地图上每个点的名称、类型等信息。
  4. .prj(projection)文件:是地图坐标系文件,其中包含地图投影的信息。
  5. .fix文件:fid索引文件

导出shp文件代码实现如下:

	<properties>
        <geotools-version>28.2</geotools-version>
    </properties>
    <dependencies>
        <!-- geotools-->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>${geotools-version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>${geotools-version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-metadata</artifactId>
            <version>${geotools-version}</version>
        </dependency>
     </dependencies>

    <!-- geotools仓库-->
    <repositories>
        <repository>
            <id>osgeo</id>
            <name>Open Source Geospatial Foundation Repository</name>
            <url>https://repo.osgeo.org/repository/release/</url>
        </repository>
        <repository>
            <id>osgeo-snapshot</id>
            <name>OSGeo Snapshot Repository</name>
            <url>https://repo.osgeo.org/repository/snapshot/</url>
        </repository>
    </repositories>

</project>
public class ExportShp {
	/**
     * 导出shp文件
     *
     * @param dataPropertiesList 属性列表{属性名:属性值}
     * @param fileName           导出shp文件名
     * @param geomType           geometry类型
     */
    private static void exportShp(List<Map<String, Object>> dataPropertiesList, String fileName, String geomType) {
        //创建保存shp文件夹
        String saveFolder = "D:/workspace/vector/vector/exportShp/";
        File dir = new File(saveFolder);
        if (!dir.exists()) {
            FileUtil.mkdir(dir);
        }

        //shp文件路径
        String shpFileName = fileName + ".shp";
        String fileUrl = saveFolder + shpFileName;
        File file = new File(fileUrl);

        FeatureWriter<SimpleFeatureType, SimpleFeature> writer = null;
        ShapefileDataStore ds = null;
        try {
            Map<String, Serializable> params = new HashMap<>();
            params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
            ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);

            //定义图形信息和属性信息
            SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
            //设置坐标系
            CoordinateReferenceSystem crs84 = CRS.decode("EPSG:4326", true);
            tb.setCRS(crs84);
            //设置文件名
            tb.setName(fileName);

            //定义导出shp文件地块属性名称
            String geomProperty = "the_geom";
            String idProperty = "ID";
            String nameProperty = "name";
            String descriptionProperty = "desc";

            //设置图形类型
            if ("Polygon".equals(geomType)) {
                tb.add(geomProperty, Polygon.class);
            } else if ("MultiPolygon".equals(geomType)) {
                tb.add(geomProperty, MultiPolygon.class);
            } else if ("Point".equals(geomType)) {
                tb.add(geomProperty, Point.class);
            } else if ("MultiPoint".equals(geomType)) {
                tb.add(geomProperty, MultiPoint.class);
            } else if ("LineString".equals(geomType)) {
                tb.add(geomProperty, LineString.class);
            } else if ("MultiLineString".equals(geomType)) {
                tb.add(geomProperty, MultiLineString.class);
            } else {
                throw new BizIllegalArgumentException("Geometry中没有该类型:" + geomType);
            }
            //设置对应属性类型
            tb.add(idProperty, String.class);
            tb.add(nameProperty, String.class);
            tb.add(descriptionProperty, String.class);

            //设置默认geometry
            tb.setDefaultGeometry(geomProperty);
            //创建
            ds.createSchema(tb.buildFeatureType());
            ds.setCharset(StandardCharsets.UTF_8);

            //设置Writer
            writer = ds.getFeatureWriter(ds.getTypeNames()[0],
                    Transaction.AUTO_COMMIT);
            SimpleFeature feature;
            for (Map<String, Object> map : dataPropertiesList) {
                feature = writer.next();
                //属性赋值  geometry要赋值wkt格式的
                feature.setAttribute(geomProperty, new WKTReader().read((MapUtil.getStr(map, "geometry"))));
                feature.setAttribute(idProperty, MapUtil.getStr(map, idProperty));
                feature.setAttribute(nameProperty, MapUtil.getStr(map, "名称"));
                String description = MapUtil.getStr(map, "描述");
                if (CharSequenceUtil.isNotBlank(description)) {
                    feature.setAttribute(descriptionProperty, description);
                }
            }
            writer.write();
        } catch (IOException | FactoryException | ParseException e) {
            e.printStackTrace();
        } finally {
            //关闭相关流
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (ds != null) {
                ds.dispose();
            }
        }

    }

    public static void main(String[] args) {
        List<Map<String,Object>> propertyList = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Map<String,Object> map = new HashMap<>();
            map.put("ID", i);
            map.put("名称", "test" + i);
            map.put("描述", "测试shp导出" + i);
            map.put("geometry", "MULTILINESTRING ((114.0888763800001 22.549298400000055, 114.0897166200001 22.54931240800005, 114.09006708000004 22.549318250000056, 114.09104754000009 22.549328150000065))");
            propertyList.add(map);
        }
        exportShp(propertyList, "test", "MultiLineString");
    }
}

导出后文件如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/135920.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自定义类型:联合和枚举

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 联合体 1.1 联合体类型的声明 1.2 联合体的特点 1.3 相同成员的结构体和联合体对比 1.4 联合体大小的计算 1.5 联合的一个练习 2. 枚举类型 2.1 枚举类型的声明…

思维模型 目标效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。明确目标&#xff0c;激发内在动机。 1 目标效应的应用 1.1 目标效应在教育领域的应用-棉花糖实验 美国斯坦福大学心理学系的教授米歇尔&#xff08;Walter Mischel&#xff09;曾经进行了…

1204. 错误票据

题目&#xff1a; 1204. 错误票据 - AcWing题库 思路&#xff1a; 将输入的数据存入数组&#xff0c;从小到大排序后遍历&#xff0c;若 (a[i] a[i - 1])res1 a[i]--->重号;若(a[i] - a[i - 1] > 2)res2 a[i] - 1--->断号。 难点&#xff1a;题目只告诉我们输入…

1977 智慧校园平台开发与实现JSP【程序源码+文档+调试运行】

摘要 本文旨在设计和实现一个智慧校园平台系统&#xff0c;以满足管理员、教师和学生三类用户的需求。管理员拥有最高管理权限&#xff0c;可对教师和学生用户进行管理&#xff1b;教师用户可查看和管理本班学生信息、成绩等&#xff1b;学生用户可查看个人信息、考试成绩等。…

Leetcode139单词拆分及其多种变体问题

1 声明 1.1 首先&#xff0c;大家常常把这道题当作了背包问题来做&#xff0c;因为其循环结构和背包问题刚好相反&#xff0c;但事实如此嘛&#xff1f; 背包问题通常都是组合问题&#xff0c;这其实是一道“”面向目标值的排列问题“&#xff0c;具体和背包问题有什么不同可…

[01]汇川IMC30G-E系列运动控制卡应用笔记

简介 IMC30G-E系列产品是汇川技术自主研制的高性能EtherCAT网络型运动控制器&#xff08;卡&#xff09;&#xff0c;同时兼容脉冲轴的控制&#xff1b;IMC30G-E支持点位/JOG、插补、多轴同步、高速位置比较输出、PWM等全面的运动控制功能&#xff0c;具备高同步控制精度。 开发…

【Nginx】深入浅出搞懂Nginx

Nginx是一款轻量级的Web服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。 反向代理服务器&#xff1f; 经常听人说到一些术语&#xff0c;如反向代理&#xff0c;那么什么是反向代理&a…

Pinia 状态管理器 菠萝:Option Store风格

Pinia介绍&#xff1a; Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 Pinia 大小只有 1kb 左右&#xff0c;超轻量级&#xff0c;你甚至可能忘记它的存在&#xff01; 相比 Vuex,Pinia 的优点&#xff1a; 更贴合 Vue 3 的 Composition API 风…

【Python】KDtree的调用

前言 查询点集中与目标点最近的k个点 from scipy.spatial import cKDTree import numpy as npdata np.array([[1,2],[1,3],[4,5]]) # 生成 100 个三维数据 tree cKDTree(data) # 创建 K-D Tree result tree.query(np.array([5, 5]), k2) # 查询与 [0.5, 0.5, 0.5] 最近的三…

Jvm虚拟机

问题&#xff1a; 计算机能识别的语言是二进制&#xff0c;Java文件是程序员编写的&#xff0c;如何能够在计算机上运行&#xff1f; 以及Java为什么可以实现跨平台&#xff1f; 一Java的jdk中有jvm虚拟机 可以将文件转换为字节码文件 使得它可以在各种平台上运行&#xff0c;这…

计算机组成原理之处理器(流水线)

引言 为什么不采用单周期实现,硬件比较简单&#xff1f; 主要是因为效率太低&#xff0c;处理器中最长的路径&#xff08;一般是ld指令)决定了时钟周期 流水线概述 流水线是一种能使多条指令重叠执行的技术。 流水线更快的原因是所有的工作都在并行执行&#xff0c;所以单位…

按键编程 pal库和标准库

按钮的电路设计 电路的搭建 原理与编程 创建了两个变量 用来捕捉按键的状态 先让两个变量都为1 previous和current都为1 &#xff08;按键没按下&#xff09; 然后让current去捕捉按键的状态通过读gpioA的pin0 如果为0就是按键按下 如果为1就是按键没按下 然后赋值给current …

论文笔记:Deep Trajectory Recovery with Fine-Grained Calibration using Kalman Filter

TKDE 2021 1 intro 1.1 背景 用户轨迹数据对于改进以用户为中心的应用程序很有用 POI推荐城市规划路线规划由于设备和环境的限制&#xff0c;许多轨迹以低采样率记录 采样的轨迹无法详细说明物体的实际路线增加了轨迹中两个连续采样点之间的不确定性——>开发有效的算法以…

哈希表之闭散列的实现

闭散列实现哈希表 在闭散列实现哈希表中&#xff0c;我们选择线性探测法来解决哈希冲突。在哈希表的简介部分&#xff0c;我们已经介绍过线性探测法啦&#xff01; 线性探测&#xff1a;从发生冲突的位置开始&#xff0c;依次向后探测&#xff0c;直到寻找到下一个空位置为止…

Carla之语义分割及BoundingBox验证模型

参考&#xff1a; Carla系列——4.Cara模拟器添加语义分割相机&#xff08;Semantic segmentation camera&#xff09; Carla自动驾驶仿真五&#xff1a;opencv绘制运动车辆的boudingbox&#xff08;代码详解&#xff09; Carla官网Bounding Boxes Carla官网创建自定义语义标签…

【离散数学必刷题】谓词逻辑(第二章 左孝凌版)刷完包过!

专栏&#xff1a;离散数学必刷题 本章需要掌握的重要知识&#xff1a; 1.利用谓词表达式表示命题 2.变元的约束 3.谓词公式的定义、谓词公式的赋值 4.谓词公式的翻译&#xff08;注意在全总个体域时使用特性谓词&#xff09; 5.有限论域上量词的消去 6.谓词公式中关于量词的等价…

软件工程——名词解释

适用多种类型的软件工程教材&#xff0c;有关名词释义的总结较为齐全~ 目录 1. 软件 2. 软件危机 3. 软件工程 4. 软件生存周期 5. 软件复用 6. 质量 7. 质量策划 8. 质量改进 9. 质量控制 10. 质量保证 11. 软件质量 12. 正式技术复审 13. ISO 14. ISO9000 15.…

思维模型 暗示效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。无形中引导他人的思想和行为。 1 暗示效应的应用 1.1 暗示效应在商业品牌树立中的应用 可口可乐的品牌形象&#xff1a;可口可乐通过广告、包装和营销活动&#xff0c;向消费者传递了一种…

macOS使用conda初体会

最近在扫盲测序的一些知识 其中需要安装一些软件进行练习&#xff0c;如质控的fastqc&#xff0c;然后需要用conda来配置环境变量和安装软件。记录一下方便后续查阅学习 1.安装miniconda 由于我的电脑之前已经安装了brew&#xff0c;所以我就直接用brew安装了 brew install …

基于STC12C5A60S2系列1T 8051单片机定时器/计数器应用

基于STC12C5A60S2系列1T 8051单片机定时器/计数器应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍STC12C5A60S2系列1T 8051单片机定时器/计数器介绍STC12C5A60S2系…