GeoTools:Shapefile创建

news2025/2/27 17:22:41

        在上一篇文章《GeoTools:Feature&Shapefile之CRUD操作》中,介绍了基于GeoTools的Shapefile文件CRUD基本操作,那么,能否使用GeoTools创建Shapefile文件呢?答案是可以的。以下,我们将深入讨论如何实现。

目录

SimpleFeatureType接口

ShapefileDataStoreFactory类

ShapefileDataStore类

创建Shapefile文件实示例


SimpleFeatureType接口

        GeoTools框架内置了SimpleFeatureType接口,用于描述一个Shapefile文件的结构(即:通俗意义上的属性字段信息,既包括属性字段,也包括几何字段)。这个话题在之前已经讨论过。但是问题在于SImpleFeature是一个接口,如何创建其对象呢?

        目前我总结下来的有两种方式,

        ①读取数据源时,通过DataStore数据源实例的getSchema(schemaName)方法获取;

        ②创建Shapefile文件时,使用GeoTools内置的DataUtilities工具类的createType方法获取。示例代码如下:

     final SimpleFeatureType TYPE =
                //定义图层的基本结构
                DataUtilities.createType(
                        "Location",
                        "the_geom:Point:srid=4326,"
                                + // <- the geometry attribute: Point type
                                "name:String,"
                                + // <- a String attribute
                                "number:Integer" // a number attribute
                );

ShapefileDataStoreFactory类

        ShapefileDataStoreFactory类,可用于构建一个Shapefile数据源/存储对象,

        通过该类的createNewDataStore()方法,接收一个Map类型的参数,可以创建一个代表Shapefile数据源对象的对象。

         以下示例代码使用ShapefileDataStoreFactory类,从一个shp文件,创建一个ShapefileDataStore数据源对象,

        String outputfilePath = "C:\\Users\\13241\\Documents\\data\\out.shp";
        File file = new File(outputfilePath);
        /*
         * Get an output file name and create the new shapefile
         * ShapefileDataStoreFactory-Builds instances of the shapefile data store
         */
        ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
        Map<String, Serializable> params = new HashMap<>();
        params.put("url", file.toURI().toURL());
        params.put("create spatial index", Boolean.TRUE);

        ShapefileDataStore newDataStore =
                (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);

ShapefileDataStore类

        GeoTools内置了ShapefileDataStore类,用于代表一个Shapefile数据源。该类提供了createNewDataStore()方法,可以基于SImpleFeatureType指定的Shapefile结构,创建一个Shapefile文件。

创建Shapefile文件实示例

        以下为创建Shapefile文件,并通过SimpleFeatureCollection将Feature写入到Shapefile文件的完整示例代码。

    @Test
    public void createShp() throws Exception {
        Random random = new Random();//随机数对象生成工具
        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();//Geometry工厂对象
        //创建shp基本结构
        SimpleFeatureType featureType = DataUtilities.createType("Polygon",
                "the_geom:Polygon:srid=4326," +
                        "name:String," +
                        "type:String");
        List<AttributeType> types = featureType.getTypes();
        types.forEach(System.out::println);
        //创建shp文件
        String shpFilePath = "C:\\Users\\13241\\Documents\\data\\polygon.shp";
        File file = new File(shpFilePath);
        if (!file.exists()) file.createNewFile();
        ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
        Map<String, Serializable> params = new HashMap<>();
        params.put("url", file.toURI().toURL());
        params.put("create spatial index", Boolean.TRUE);
        boolean flag = dataStoreFactory.canProcess(params);
        if (flag){
            ShapefileDataStore newDataStore =
                    (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
            newDataStore.createSchema(featureType);//创建shp
            //获取新创建好的FeatureSource数据源操作
            String typeName = newDataStore.getTypeNames()[0];
            SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
//            SimpleFeatureType featureType = featureSource.getSchema();//获取shp的表结构
            String nameSource = "sdajlskdadasl;d,a;ldal;sdaldam,sdadsad";
            String[] typeArray = new String[]{"group_one","group_two","group_three","group_four"};
            //构造FeatureCollection数据源
            List<SimpleFeature> features = new ArrayList<>();
            SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType);//Feature要素构造器
            for (int i = 0; i < 15; i++) {
                double longitude = 120.0 + Math.random()*10,
                        latitude = 30.0 + Math.random()*10;
                Coordinate[] coordinates = new Coordinate[]{
                        new Coordinate(longitude - 1,latitude-1),
                        new Coordinate(longitude - 1,latitude+1),
                        new Coordinate(longitude + 1,latitude+1),
                        new Coordinate(longitude + 1,latitude-1),
                        new Coordinate(longitude - 1,latitude-1)
//                        new Coordinate(119.0,32.0),
//                        new Coordinate(119.0,32.5),
//                        new Coordinate(120.0,32.5),
//                        new Coordinate(120.0,32.0),
//                        new Coordinate(119.0,32.0)
                };
                Polygon polygon = geometryFactory.createPolygon(coordinates);
                featureBuilder.add(polygon);
                featureBuilder.add(nameSource.substring(0,3+random.nextInt(nameSource.length()-5)));
                featureBuilder.add(typeArray[random.nextInt(typeArray.length)]);
                SimpleFeature simpleFeature = featureBuilder.buildFeature(null);
                features.add(simpleFeature);
            }
            //根据List<SimpleFeature>构造SimpleFeatureCollection,并将其添加到Shapefile文件中
            if (featureSource instanceof SimpleFeatureStore) {
                SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
                SimpleFeatureCollection collection = new ListFeatureCollection(featureType, features);
                Transaction transaction = new DefaultTransaction("create");
                featureStore.setTransaction(transaction);
                try {
                    featureStore.addFeatures(collection);
                    transaction.commit();
                } catch (Exception problem) {
                    problem.printStackTrace();
                    transaction.rollback();
                } finally {
                    transaction.close();
                }
                System.exit(0); // success!
            }
        }else{
            throw new Exception("操作不被支持!");
        }
    }

        将创建好的shapefile文件放入QGIS中进行加载,显示效果如下,

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础机器学习做游戏辅助第十二课--原神自动钓鱼(二)

一、模拟训练环境 上节课我们已经能够判断人物的钓鱼状态,接下来我们就需要对鱼儿上钩后的那个受力框进行DQN训练。 方案有两个: 使用卷积神经网络直接输入图像对网络进行训练。使用普通网络,自己写代码模拟出图像中三个点的动态并把值给神经网络进行训练。这里我们选用第二…

IB数学课程有哪些异同?如何选课?

自从IBDP在2019年进行数学课程改革后&#xff0c;许多IB小伙伴们就不知该如何选课了……改革后的IB数学课程包括4门课程&#xff0c;也就是&#xff1a;● Mathematics: analysis and approaches SL & HL (first assessment 2021)● Mathematics: applications and interpr…

科技云报道:“吞金兽”ChatGPT背后:AI算力告急!

科技云报道原创。 近两个月来&#xff0c;全世界的网友们都在兴致勃勃的“调教”ChatGPT&#xff0c;但第一个受不了的却是ChatGPT的所有者。 为了更长远的发展&#xff0c;OpenAI宣布了付费订阅版ChatGPT Plus&#xff0c;每月收费20美元。 虽然OpenAI表示&#xff0c;将持…

Monorepo or 物料市场?结合工作实际情况对公司现有前端体系的思考

前言 去年年中基于若依vue前端框架进行了改造&#xff0c;加上后端的配合&#xff0c;我写了一套脚手架和项目中后台模板。中后台模板中包含了许多基础代码&#xff0c;比如登录/注册、路由、权限等等相关功能。这个中后台模板是基于我们实际开发定制的&#xff0c;所以跟通用…

SpringBoot——配置文件

项目中有许多公共使用的变量&#xff0c;例如端口号&#xff0c;连接数据库的配置&#xff0c;还有我们自己创建的变量&#xff0c;这些可以放到SpringBoot的配置文件中统一调配使用 properties 基本语法格式&#xff1a; keyvalue例如配置项目的端口号为8888&#xff1a; …

Bean注入到Spring方式

扒一扒Bean注入到Spring的那些姿势 配置文件的方式就是以外部化的配置方式来声明Spring Bean&#xff0c;在Spring容器启动时指定配置文件。配置文件方式现在用的不多了&#xff0c;但是为了文章的完整性和连续性&#xff0c;这里我还是列出来了&#xff0c;知道的小伙伴可以自…

Jetson Xavier NX设备将opencv和tensorrt链接到conda环境

注意安装的时候先查看设备旧版本的opencv&#xff0c;卸载干净后再装。 Jetpack4.6 opencv4.1.1 conda安装 过程翻一下之前的博客把&#xff0c;下面是创建环境开始 conda create -n py36 python3.6.9 OPENCV_EXTRA_MODULES_PATH/home/ta/open/opencv_contrib-4.1.1/modul…

白银走势图如何做空?

做现货白银的好处是&#xff0c;我们可以在白银走势图上做空&#xff0c;不再像股票那样只能先卖后买&#xff0c;还能先卖后买&#xff0c;这样我们做投资就多了一份从容&#xff01;任何时候我们都能获得投资获利的机会&#xff0c;但是由于习惯了单向交易&#xff0c;我们要…

Sarsa算法讲解及实现

Sarsa算法讲解及实现 1. Q表格 我们使用表格来存储每一个状态 state, 和在这个 state 每个行为 action 所拥有的 Q 值。 Q即为Q&#xff08;s,a&#xff09;就是在某一时刻的 s 状态下(s∈S)&#xff0c;采取动作a (a∈A)动作能够获得收益的期望&#xff0c;环境会根据agent…

java嵌入式持久化消息队列SMQ,改造自FQueue

一、说明之前项目中一直使用ConcurrentLinkedQueue做为缓冲队列&#xff08;主要是单个项目内&#xff0c;单条改批量的场景&#xff0c;多个项目间使用的是rocketmq&#xff09;&#xff0c;虽然用着方便但是是纯内存的&#xff0c;如果项目发生异常崩溃内存队列中的数据就会全…

JavaSE学习day6 进制转换和idea的调试

1.进制 1.1 常见的进制分类(掌握) 学过计算机组成原理的同学可以跳过这里。 二进制 十进制 八进制 十六进制 1.2 二进制 计算机数据在底层存储和运算的时候&#xff0c;都是以二进制的形式操作的&#xff0c;了解不同的进制&#xff0c;便于我们对数据的运算过程理解的更…

个人博客推出了更多功能

背景 Web2.0的典型代表博客&#xff0c;吸引着粉丝们打造属于自己的个人博客&#xff0c;分享自己的学习经验&#xff0c;记录自己的日常生活。随着大厂的入局&#xff0c;我们可以很容易的申请自己的个人博客&#xff0c;但是弊端就是往往会被他们控制&#xff0c;甚至封号。…

汕头市农村生活污水治理“十四五”规划行动方案

汕头&#xff0c;简称“汕”&#xff0c;广东省辖地级市&#xff0c;北接潮州&#xff0c;西邻揭阳&#xff0c;南濒南海&#xff0c;东与台湾隔海相望&#xff0c;境内韩江、榕江、练江三江入海&#xff0c;是中国大陆唯一拥有内海湾的城市。今天就来为大家介绍&#xff0c;汕…

Windows系统实现命令行(CMD)关闭指定的IIS网站

一、需求说明我们部署在Windows服务器上的IIS网站&#xff0c;需要在特定的时间停止一会后在进行重新启动该网站。二、思路分析由于需要特定的时间停止后重启网站&#xff0c;则手动操作肯定是不行的&#xff0c;需要实现自动化操作&#xff1a;①特定时间操作可以使用Windows系…

聚观早报|王慧文要做「中国版 OpenAI」;Temu斥资近亿元赞助超级碗

点击蓝字 / 关注我们今日要闻&#xff1a;王慧文要做「中国版 OpenAI」&#xff1b;Temu斥资近亿元赞助超级碗&#xff1b;新东方在线股价收跌2.8%&#xff1b;ChatGPT带动的AIGC创业热潮要来了&#xff1b;传谷歌拆分其AR部门王慧文要做「中国版 OpenAI」 2 月 13 日&#xff…

CSS中的常见单位(px,%,em,rem,vw,vh,vmax,vmin,calc)

像素(px)&百分比(%) 像素(Pixel) 长度单位&#xff0c;相对于显示器屏幕分辨率而言&#xff0c;通常在不定义显示缩放比例的情况下&#xff0c;1px对应显示器屏幕上的一个像素点。早年的pc端展示的页面基本都用这个单位。 百分比(%) 相对长度单位&#xff0c;指占用的父…

电源模块 DC-DC直流升压正负高压输出12v24v转±110V±150V±220V±250V±300V±600V

特点效率高达80%以上1*2英寸标准封装电源正负双输出稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上应用HRA 1~40W系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36VDC标准&…

对比Hashtable、HashMap、TreeMap有什么不同?

第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同&#xff1f; Map 是广义 Java 集合框架中的另外一部分&#xff0c;HashMap 作为框架中使用频率最高的类型之一&#xff0c;它本身以及相关类型自然也是面试考察的热点。 今天我要问你的问题是&#xff0c;对比 Hashtable、…

HTTP协议——详细讲解

目录 一、HTTP协议 1.http 2.url url的组成&#xff1a; url的保留字符&#xff1a; 3.http协议格式​编辑 ①http request ②http response 4.对request做出响应 5.GET与POST方法 ①GET ②POST 7.HTTP常见Header ①Content-Type:: 数据类型(text/html等)在上文…

JavaSE系列 打基础版

JavaSE 笔记记录P1 Java概述1.1 java编译1.2 认识JDK、JRE1.3 下载jdk和配置环境变量1.4 开发注意事项和开发细节1.5 学习java之我的需求1.6 转义字符1.7 注释1.8 代码规范1.9 dos命令 了解P2 变量数据类型变量基本使用数据类型转换P3运算符P4 控制结构P5 数组、排序和查找P6面…