【Java+GS】GeoServer——使用Java发布图层(SHP文件和DB数据库),附自用工具类

news2024/11/17 3:30:29

文章目录

    • SHP文件发布逻辑
      • 1、获取到geoserver的manager对象
      • 2、调用createWorkArea方法,参入manager,创建空间空间 workArea
      • 3、调用createShpDataPool方法,创建数据存储
      • 4、发布样式Style.
      • 5、发布图层
    • 调用业务层库发布shp文件图层
        • 业务逻辑如下:
      • 1、查询info表,判断是否是已经发布状态isRelease
          • 报错:column "is_release" is of type smallint but expression is of type character varying
      • 2、判断发布类型,调用release方法
      • 3、调用publishShpLayer方法,发布图层
    • 附带工具类 自取如下:

SHP文件发布逻辑

  1. 找到283行的releaseShp方法发布图层 :传入的参数是实体类+shp文件路径
  2. 使用GeoServerPublishUtils的getManager方法,获取到geoserver的manager对象
  3. 调用createWorkArea方法,参入manager,创建空间空间 workArea
  4. 调用createShpDataPool方法,创建数据存储
  5. 调用createStyle方法,创建样式
  6. 调用publishShpLayer方法,发布图层
    • 注意:该方法传入了文件对象new File(shpPath)
  7. 即可完成发布

1、获取到geoserver的manager对象

public static GeoServerRESTManager getManager(String address, String account, String passWord) throws MalformedURLException {
    

测试成功,注意传入的地址address就是 ip + /geoserver,比如http://47.110.80.118:8001/geoserver/

2、调用createWorkArea方法,参入manager,创建空间空间 workArea

 	/**
     * 创建工作区间
     *
     * @param manager  geoserver图层管理类
     * @param workArea 工作区间
     * @return boolean
     * @author qqz
     * @date 14:15 2022/2/22
     **/
public static boolean createWorkArea(GeoServerRESTManager manager, String workArea) {

传入的参数一个可以自定义的string作为工作空间的名称。测试通过

传入String workSpace = "java-test-workSpace";

image-20230424100348170

3、调用createShpDataPool方法,创建数据存储

/**
 * 创建shp数据存储
 *
 * @param manager  geoserver图层管理类
 * @param workArea 工作区间
 * @param dataPool 数据存储
 * @param geoPath  图层服务存放地址
 * @param shpName  shp文件名称
 * @return boolean
 * @author qqz
 * @date 14:14 2022/2/22
 **/
public static boolean createShpDataPool(GeoServerRESTManager manager, String workArea, String dataPool, String geoPath, String shpName) throws MalformedURLException {
   

传入的参数

  • dataPool ——可以自定义的名称
  • geoPath—— (数据库里的数据是geoserver安装目录+/data_dir/data/
  • shpName——这里传入的是唯一标识,作为文件的存储地址

测试通过

image-20230424100541832

4、发布样式Style.

创建失败,原因不明

image-20230424101232379

5、发布图层

样式先用现有的样式,进入测试

    /**
     * 发布shp图层
     *
     * @param manager   geoserver图层管理类型
     * @param zipFile   zip文件
     * @param workArea  工作区间
     * @param dataPool  数据存储
     * @param styleName 样式名称
     * @param name      图层名称
     * @param srs       坐标系
     * @return boolean
     * @author qqz
     * @date 14:18 2022/2/22
     **/
    public static boolean publishShpLayer(GeoServerRESTManager manager, File zipFile, String workArea, String dataPool, String styleName, String name, String srs) throws FileNotFoundException {
   
  • 传入了file文件的应该是一个zip文件

报错如下:

image-20230424102321461

解决方案 —— 此时geoserver中datastore已经创建完成了。排查是因为shp、压缩包以及publishShp的参数layerName名称不一致

还是有问题,不过手动操作发布就已经可以成功发布图层了

接下来测试一下连接数据库的测试

调用业务层库发布shp文件图层

业务逻辑如下:

  1. 根据传入的id去查询GeoserverPublishInfo表,得到对应的实体列表
  2. 遍历实体列表,找出【未发布状态】PublishConfig.UNPUBLISHED == isRelease
  3. 调用220行的publish方法
  4. 判断实体的图层类型 layerType,判断是shp发布还是数据库发布
  5. 发布后会通过boolean判断是否成功
  6. 更新isRelease字段,返回结果

1、查询info表,判断是否是已经发布状态isRelease

进入本类的publish方法

image-20230424114710487

报错:column “is_release” is of type smallint but expression is of type character varying

解决,就是数据库字段和实体的类型不对呀,更新一下即可

2、判断发布类型,调用release方法

  1. 在这里,我们发现了shpPath的来源,是从数据库中取到的。

  2. 在发布图层时,会根据这个路径创建文件

image-20230424115051129.image-20230424115310794

3、调用publishShpLayer方法,发布图层

附带工具类 自取如下:

import it.geosolutions.geoserver.rest.GeoServerRESTManager;
import it.geosolutions.geoserver.rest.decoder.RESTDataStore;
import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSPostGISDatastoreEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSShapefileDatastoreEncoder;
import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;

public class GeoServerPublishUtils {

    /**
     * 获取geoserver图层管理
     *
     * @param address  geoserver服务地址
     * @param account  账号
     * @param passWord 密码
     * @return it.geosolutions.geoserver.rest.GeoServerRESTManager
     * @author qqz
     * @date 17:07 2022/2/22
     **/
    public static GeoServerRESTManager getManager(String address, String account, String passWord) throws MalformedURLException {
        URL u = new URL(address);
        //获取管理对象
        return new GeoServerRESTManager(u, account, passWord);
    }

    /**
     * 创建数据库存储
     *
     * @param manager  geoserver管理类
     * @param workArea 工作区
     * @param dataPool 数据存储
     * @return boolean
     * @author qqz
     * @date 15:12 2022/2/19
     **/
    public static boolean createDBDataPool(GeoServerRESTManager manager, String workArea, String dataPool, String dbHost, int dbPort, String dbUser, String dbPassWord, String dbDataBase, String dbSchema) {
        RESTDataStore restStore = manager.getReader().getDatastore(workArea, dataPool);
        if (restStore == null) {
            GSPostGISDatastoreEncoder store = new GSPostGISDatastoreEncoder(dataPool);

            store.setHost(dbHost);//设置url
            store.setPort(dbPort);//设置端口
            store.setUser(dbUser);// 数据库的用户名
            store.setPassword(dbPassWord);// 数据库的密码
            store.setDatabase(dbDataBase);// 那个数据库;
            store.setSchema(dbSchema); //当前先默认使用public这个schema
            store.setConnectionTimeout(20);// 超时设置
            store.setMaxConnections(20); // 最大连接数
            store.setMinConnections(1);     // 最小连接数
            store.setExposePrimaryKeys(true);
            boolean createStore = manager.getStoreManager().create(workArea, store);
            System.out.println("create store : " + createStore);
            return createStore;
        }
        return true;
    }

    /**
     * 创建shp数据存储
     *
     * @param manager  geoserver图层管理类
     * @param workArea 工作区间
     * @param dataPool 数据存储
     * @param geoPath  图层服务存放地址
     * @param shpName  shp文件名称
     * @return boolean
     * @author qqz
     * @date 14:14 2022/2/22
     **/
    public static boolean createShpDataPool(GeoServerRESTManager manager, String workArea, String dataPool, String geoPath, String shpName) throws MalformedURLException {
        String fileUrl = "file://" + geoPath + "/" + workArea + "/" + dataPool + "/" + shpName;
        URL urlShapeFile = new URL(fileUrl);
        boolean existsDatastore = manager.getReader().existsDatastore(workArea, dataPool);
        if (!existsDatastore) {
            //创建shape文件存储
            GSShapefileDatastoreEncoder store = new GSShapefileDatastoreEncoder(dataPool, urlShapeFile);
            store.setCharset(Charset.forName("GBK"));
            boolean createStore = manager.getStoreManager().create(workArea, store);
            return createStore;
        }
        return true;
    }

    /**
     * 创建工作区间
     *
     * @param manager  geoserver图层管理类
     * @param workArea 工作区间
     * @return boolean
     * @author qqz
     * @date 14:15 2022/2/22
     **/
    public static boolean createWorkArea(GeoServerRESTManager manager, String workArea) {
        boolean existsWorkspace = manager.getReader().existsWorkspace(workArea);
        //判断工作空间是否存在
        if (!existsWorkspace) {
            //创建一个新的存储空间
            boolean createWs = manager.getPublisher().createWorkspace(workArea);
            System.out.println("create ws : " + createWs);
            return createWs;
        }
        return true;
    }

    /**
     *  创建样式
     * @param manager geoserver图层管理类
     * @param obj    反射所需类
     * @param styleName 样式名称
     * @param geoStylePath
     * @return
     */
    public static boolean createStyle(GeoServerRESTManager manager, Object obj, String styleName, String geoStylePath) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        boolean existsStyle = manager.getReader().existsStyle(styleName);
        if (!existsStyle) {
            //获取样式格式
            String style = FileUtils.readFileToString(new File(geoStylePath));
            Class clazz = obj.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                //获取属性名
                String fieldName = field.getName();
                //首字母转大写
                fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                Method m = clazz.getMethod("get" + fieldName);  // 获取getter方法
                // 执行方法提提取数值
                if (m.invoke(obj) == null) {
                    style = style.replaceAll("@" + fieldName.toLowerCase(), "");
                } else {
                    String value = m.invoke(obj).toString();    // 执行获取数值
                    // 将对应的样式格式,设置为提取到的数值
                    style = style.replaceAll("@" + fieldName.toLowerCase(), value);
                }
            }
            //设置样式名称
            style = style.replaceAll("@sldName", styleName);
            //创建样式
            existsStyle = manager.getPublisher().publishStyle(style);
        }
        return existsStyle;
    }

    /**
     * 发布数据库图层 === 发布数据库
     *
     * @param manager    geoserver图层管理
     * @param workArea   工作区间
     * @param dataPool   数据存储
     * @param styleName  样式名称
     * @param name       图层标题名称
     * @param nativeName 图层名称
     * @param srs        坐标系
     * @return boolean
     * @author qqz
     * @date 14:17 2022/2/22
     **/
    public static boolean publishDBLayer(GeoServerRESTManager manager, String workArea, String dataPool, String styleName, String name, String nativeName, String srs) {
        boolean existsLayer = manager.getReader().existsLayer(workArea, name);
        if (!existsLayer) {
            GSLayerEncoder layerEncoder = new GSLayerEncoder();
            layerEncoder.setEnabled(true);
            //设置图层默认样式
            layerEncoder.setDefaultStyle(styleName);
            GSFeatureTypeEncoder gsFeatureTypeEncoder = new GSFeatureTypeEncoder();
            if (StringUtil.isBlank(name) && StringUtil.isBlank(nativeName)) {
                ExceptionFactory.throwException("表名和标识码为空!");
            } else if (StringUtil.isNotBlank(name) && StringUtil.isNotBlank(nativeName)) {
                gsFeatureTypeEncoder.setName(name);
                gsFeatureTypeEncoder.setNativeName(nativeName);
            } else if (StringUtil.isNotBlank(name)) {
                gsFeatureTypeEncoder.setName(name);
                gsFeatureTypeEncoder.setNativeName(name);
            } else {
                gsFeatureTypeEncoder.setName(nativeName);
                gsFeatureTypeEncoder.setNativeName(nativeName);
            }
            gsFeatureTypeEncoder.setSRS(srs);
            boolean publish = manager.getPublisher().publishDBLayer(workArea, dataPool, gsFeatureTypeEncoder, layerEncoder);
            return publish;
        }
        return true;
    }



        /**
         * 发布shp图层=====shp文件
         *
         * @param manager   geoserver图层管理类型
         * @param zipFile   zip文件
         * @param workArea  工作区间
         * @param dataPool  数据存储
         * @param styleName 样式名称
         * @param layerName 图层名称
         * @param srs       坐标系
         * @return boolean
         * @author qqz
         * @date 14:18 2022/2/22
         **/
    public static boolean publishShpLayer(GeoServerRESTManager manager, File zipFile, String workArea, String dataPool, String styleName, String layerName, String srs)  {
        boolean existsLayer = manager.getReader().existsLayer(workArea, layerName);
        if (!existsLayer) {
            boolean publish = false;
            try {
                publish = manager.getPublisher().publishShp(workArea, dataPool, layerName, zipFile, srs, styleName);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return publish;
        }
        return true;
    }

}

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

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

相关文章

【致敬未来的攻城狮计划】— 连续打卡第二十五天:RA2E1的 DTC传输模式

系列文章目录 由于一些特殊原因: 系列文章链接:(其他系列文章,请点击链接,可以跳转到其他系列文章) 24.RA2E1的 DMAC——数据传输 文章目录 系列文章目录 前言 一、DTC是什么? 二、DTC内部寄存…

Springboot——集成Elastic Job实现任务调度

目录 1.任务调度 2.Elastic Job 3.springboot集成Elastic Job 1.任务调度 什么是任务调度? 任务调度就是指系统为了自动地完成特定任务,在指定的时刻去执行任务的过程,其目的是为了让系统自动且精确地完成任务从而解放人力资源。 如&am…

WX小程序 - 1

视图层:WXML,WXSS 逻辑层:JS 响应数据绑定,事件绑定 勾选这个其实就是解决跨域问题(仅限本地开发阶段)。 上线需要去合法域名添加。 app.json 文件创建和删除,保持一致,否则报错…

二叉树的层序遍历思想模板

分为两种&#xff1a; 1.第一种是直接将遍历的数据保存到列表里&#xff1b; 2.第二种是将每一层的数据以列表形式保存在列表&#xff1b;&#xff08;今天要讲述的内容&#xff09; 代码如下&#xff0c;思想在后 class Solution {public List<List<Integer>> …

全新 – Amazon EC2 R6a 实例由第三代 AMD EPYC 处理器提供支持,适用于内存密集型工作负载

我们在 Amazon re:Invent 2021 上推出了通用型 Amazon EC2 M6a 实例&#xff0c;并于今年 2 月推出了计算密集型 C6a 实例。这些实例由运行频率高达 3.6 GHz 的第三代 AMD EPYC 处理器提供支持&#xff0c;与上一代实例相比&#xff0c;性价比提高多达 35%。 如今&#xff0c;…

不断联的从Google Drive下载超大文件

不断联的从Google Drive下载超大文件 最近在研究OWOD代码&#xff0c;需要从google drive 下载超大文件&#xff0c;普通方式下载&#xff0c;首先得有个上外网的工具&#xff0c;其次下载过程中总是会断开&#xff0c;所以看了一些博客&#xff0c;总结如下&#xff1a; 安…

基于TINY4412的Andorid开发-------简单的LED灯控制【转】

基于TINY4412的Andorid开发-------简单的LED灯控制 阅读目录(Content) 一、编写驱动程序二、编写代码测试驱动程序三、编写HAL代码四、编写Framework代码五、编写JNI代码六、编写App 参考资料&#xff1a; 《Andriod系统源代码情景分析》 《嵌入式Linux系统开发完全手册_基…

实时语义分割PIDNet算法TensorRT转换

[PIDNet](GitHub - XuJiacong/PIDNet: This is the official repository for our recent work: PIDNet) 是22年新开源的实时语义分割算法&#xff0c;和DDRNet一样具有不错的性能 网络结构如下&#xff1a; 网络分为三个分支&#xff0c;如上图&#xff0c;整体结构和DDRNet比…

shell 脚本中的函数

目录 一. shell 函数作用&#xff1a;二. shell 函数的定义格式&#xff1a;三.函数返回值&#xff1a;四.函数传参&#xff1a;扩展&#xff1a; 六. 函数变量的作用范围:七 . 递归7.1阶乘 八. 函数库 一. shell 函数作用&#xff1a; 使用函数可以避免代码的重复 使用函数可以…

OJ刷题 第十五篇(递推较多,奥赛篇)

31005 - 昆虫繁殖&#xff08;难度非常大&#xff0c;信息奥赛题&#xff09; 时间限制 : 1 秒 内存限制 : 128 MB 科学家在热带森林中发现了一种特殊的昆虫&#xff0c;这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵&#xff0c;每对卵要过两个月长成成虫。假设每个成虫…

从零开始 Spring Boot 27:IoC

从零开始 Spring Boot 27&#xff1a;IoC 自从开始学习和从事Spring Boot开发以来&#xff0c;一个一直让我很迷惑的问题是IoC和Bean到底是什么东西。这个问题一直到我翻阅完Spring开发文档Core Technologies (spring.io)后才真正得到解惑。 虽然中文互联网上关于IoC的文章很多…

基于AT89C51单片机的电子琴设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87765092?spm1001.2014.3001.5503 源码获取 运用单片机&#xff0c;将音乐的大部分音符与相应按键相匹配&#xff0c;让音乐爱好者利用单片机也可以进行演奏。 基…

SAP EWM /SCWM/CHM_LOG - 显示及分析检查日志

很多公司上了EWM系统后会在运行一段时间之后出现一些系统数据异常情况&#xff0c;问题大致分为以下一些情况&#xff1a; 序号异常情况1 库存调整过账后可用数量的数据不正确2 错误地传输原产国 (2)3 HU 在可用库存中&#xff0c;即使不允许 HU4 非 AQUA 级别创建仓库任务后可…

TCP通讯(三次握手、四次挥手;滑动窗口;TCP状态转换;端口复用;TCP心跳检测机制)

前言&#xff1a;建议看着图片&#xff0c;根据文字描述走一遍TCP通讯过程&#xff0c;加深理解。 目录 TCP通信时序&#xff1a; 1&#xff09;建立连接&#xff08;三次握手&#xff09;的过程&#xff1a; 2&#xff09;数据传输的过程&#xff1a; 3&#xff09;关闭连…

智能优化算法:斑马优化算法-附代码

智能优化算法&#xff1a;斑马优化算法 文章目录 智能优化算法&#xff1a;斑马优化算法1.斑马优化算法1.1 初始化1.2 阶段一&#xff1a;觅食行为1.3 阶段二&#xff1a;针对捕食者的防御策略 2.实验结果3.参考文献4.Matlab 摘要&#xff1a;斑马优化算法&#xff08;Zebra Op…

协同设计有什么优势?都有哪些协同设计软件

设计师创作既有视觉吸引力又实用的作品需要很多时间。对于某些项目&#xff0c;第一次可能会顺利验收&#xff0c;但事实上&#xff0c;设计和修改总是伴随着。 如何有效地修改和促进项目的实施&#xff1f;答案很简单&#xff1a;协作设计。本文将带您深入学习协作设计的相关…

Spring01-Spring简介、IOC简介及入门、IOC详解、bean讲解、依赖注入、配置文件模块化、实现CRUD

Spring简介 一、Spring 是什么 Spring 是一个分层的 Java SE/EE full-stack (一站式) 轻量级开源框架 以 IOC &#xff08;Inverse Of Control:反转控制) 和 AOP &#xff08;Aspect Oriented Programming:面向切面编程) 为核心。 在 Java三层架构中 分别提供了响应技术 分…

docker php安装redis扩展

有这么一个情况&#xff0c;我在docker中&#xff0c;安装了镜像&#xff0c;也启动了容器&#xff0c;容器有&#xff1a;nginx、mysql、redis、php 是一个基本的开发环境 容器启动成功&#xff0c;我们先连接一下&#xff0c;看看是否正常。 先保证这些都ok&#xff0c;我们…

【Spring框架一】——Spring框架简介

系列文章目录 Spring框架简介 系列文章目录前言一、什么是Spring框架&#xff1f;二、Spring框架的优势1.简化开发流程&#xff1a;Spring提供了许多现成的功能&#xff0c;可以使得开发人员在构建应用程序时减少编写重复代码的工作。2.提高可维护性&#xff1a;Spring框架采用…

chatgpt搜索脚本

安装地址 https://greasyfork.org/zh-CN/scripts/459997 注意事项 &#xff01;&#xff01;注意&#xff1a;如果你在360相关浏览器上使用插件。360搜索将不会生效&#xff0c;因为已被浏览器禁用在so.com网址上使用。 &#xff01;&#xff01;尽量选择tampermonkey脚本管…