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

news2024/11/19 23:20:56

文章目录

    • 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/492028.html

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

相关文章

Ambari 2.7.5+HDP3.1.5离线扩容不同配置组

确保ambari server节点启动,Httpd 服务安装并启动,可参考: Ambari 2.7.5HDP3.1.5离线安装详细教程(附安装包)https://blog.csdn.net/QYmufeng/article/details/122827261 1.安装ambari agent 在需要添加的主机上安装…

吴恩达与OpenAI官方合作的ChatGPT提示工程课程笔记

吴恩达与OpenAI官方合作的ChatGPT提示工程课程笔记 🥸 下述代码均在煮皮特上运行喔 LLMs(large language models) Base LLM:基于文本训练数据来预测做“文字接龙” Instruction Tuned LLM(指令调整型LLM):接受了遵循指示的培训&am…

SpringBoot 集成 RocketMQ

项目地址 前面我们介绍了怎么使用 docker 安装 rocketMQ&#xff0c;现在我们就来试试使用 SpringBoot 集成之后&#xff0c;怎么发送消息和消费消息。 集成步骤 工程结构 第一步&#xff1a;引入相关依赖 <dependency><groupId>org.projectlombok</groupId…

【新星计划-2023】什么是OSI七层模型?一文带你了解

一、什么是OSI七层模型 OSI七层模型又叫做“OSI参考模型”&#xff0c;它的全称为“开放系统互连参考模型”&#xff0c;它是一个七层的、抽象的模型体&#xff0c;不仅包括一系列抽象的术语或概念&#xff0c;也包括具体的协议。那么为什么会出现OSI参考模型&#xff1f; 原…

第 6 章 整合 Phoenix

6.1 Phoenix 简介 6.1.1 Phoenix 定义 Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API 来创建表&#xff0c;插入数据和查询 HBase 数据。 6.1.2 为什么使用 Phoenix 官方给的解释为&#xff1a;在 Client 和 HBase 之间放一个 Phoenix 中…

WatchGuard 防火墙策略、配置和日志分析器

获取 Internet 活动见解并及时了解安全事件是一项具有挑战性的任务&#xff0c;因为安全设备会生成大量的安全和流量日志。Firewall Analyzer 针对 WatchGuard 防火墙设备的报告功能具有一系列功能&#xff0c;使您能够增强网络安全。WatchGuard 日志分析器软件&#xff0c;可让…

【推荐】网络安全10本入门必看书籍

前言 对于初学者来说&#xff0c;了解网络安全的入门知识是非常重要的。以下是我推荐的10本入门网络安全必看的书籍 1.《黑客攻防技术宝典》 作者&#xff1a;余洪涛&#xff0c;出版社&#xff1a;清华大学出版社 这本书是网络安全初学者入门的好选择。书中讲解了黑客攻击和…

尚硅谷大数据技术Spark教程-笔记06【SparkCore(案例实操,电商网站)】

视频地址&#xff1a;尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【SparkCore&#xff08;概述、快速上手、运行环境、运行架构&#xff09;】尚硅谷大数据技术Spark教程-笔记02【SparkCore&#xff08;核心编程&#xff0c;RDD-核…

速看,关于Python的17个学习网站,从基础到机器学习【建议收藏】

目录 一、基础学习网站Python官方教程Python官方安装包地址PyCharm下载地址anaconda3清华开源下载地址 二、爬虫学习网站requests官方学习网站BeautifulSoup文档网站selenium官方学习网站scrapy中文学习网站 三、数据分析学习网站numpy官方文档网站pandas官方文档网站sklearn官…

Spring-Rest- url 请求风格和SpringMVC 映射请求数据

目录 Rest- url 请求风格 Rest-基本介绍 ● 说明 实例 说明&#xff1a; ● REST 的核心过滤器 代码说明Rest 风格的 url-完成增删改 需求说明 ​编辑修改 web.xml 添加 HiddenHttpMethodFilter 修改 springDispatcherServlet-servlet.xml 作用 创建rest.jsp 解读…

大数据技术之Kettle

目录 第1章 Kettle概述 1.1 ETL简介 1.2 Kettle简介1.2.1 Kettle是什么 1.2.2 Kettle的两种设计 1.2.3 Kettle的核心组件 1.2.4 Kettle特点 第2章 Kettle安装部署 2.1 Kettle下载 2.1.1 下载地址 2.1.2 Kettle目录说明 2.1.3 Kettle文件说明 2.2 Kettle安装部署 2…

openai账号创建教程-openai注册问题大全

openai注册页面打不开 遇到openai注册页面打不开&#xff0c;可以用以下解决方法&#xff1a; 检查网络连接。如果您的网络连接不稳定或者有问题&#xff0c;可能会导致访问网站异常。请尝试使用其他设备或连接其他网络&#xff0c;看是否能够打开OpenAI注册页面。 清除浏览器…

为什么需要使用Docker

简介与概述 1.介绍 Docker是一个开源的应用容器引擎&#xff0c;基于Go语言开发的&#xff0c;并且遵从Apache2.0协议开源。 Docker可以让开发者打包他们的应用以及依赖&#xff0c;打包到轻量级、可移植的容器中&#xff0c;然后发布到任何一个流行的Linux服务器上&#xff…

新库上线 | CnOpenData中国标准数据

中国标准数据 一、数据简介 按照《中华人民共和国标准化法》的定义&#xff0c;标准是指农业、工业、服务业以及社会事业等领域需要统一的技术要求。标准作为一种通用性的规范语言&#xff0c;在合理利用国家资源、保障产品质量、提高市场信任度、促进商品流通、维护公平竞争、…

使用JPA自动生成代码(轻松上手看了就会版)

目录 背景&#xff1a;方案概念&#xff1a;JPA 的主要作用 jpa简单使用&#xff08;Springboot项目&#xff09;jpa进阶使用总结 背景&#xff1a; 项目需要自动生成sql代码&#xff0c;不需要写sql语句&#xff0c;能够自动进行查询&#xff0c;我想到了JPA。 方案 概念&a…

Jetpack Compose 不止是一个UI框架~

Jetpack Compose是用于构建原生Android UI的现代工具包。 Jetpack Compose使用更少的代码&#xff0c;强大的工具和直观的Kotlin API&#xff0c;简化并加速了Android上的UI开发。这是Android Developers 官网对它的描述。 本文不是教你Jetpack Compose 的一些基本使用方法&am…

【通过xib自定义Cell Objective-C语言】

一、我们怎么样来自定义单元格呢, 1.我们先来分析一下, 我们这里虽然有很多行,但是每一行,长的都是一样的, 这里有一个Label、那里有一个Label, 每一行每一行,长的都是一样的,唯独只有数据不一样吧, 所以说,遇到这种情况,我们就可以考虑用一个xib,描述一个单元…

倒计时24天!接棒香港展,CTIS2023观众预登记全面启动

4月22日,环球资源春季香港展在亚洲国际展览馆落下帷幕。两期展会,十馆全开,共历时8天。汇聚来自中国大陆、香港、台湾地区、韩国、越南、印度等地逾4,000家优质供应商超过30万件产品。吸引近10万人次的专业观众参观。环球资源为买卖双方打造优质贸易平台,让买家第一时间把握消费…

【Python零基础学习入门篇⑤】——第五节:Python中的函数

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello&#xff0c;大家好呀我是陈童学哦&#xff0c;一个普通大一在校生&#xff0c;请大家多多关照呀嘿嘿&#x1f601;&#x1f60a;&#x1f618; &#x1f31f;&#x1f31f;&#x1f31f;技术这条路固然很艰辛&#xff0c;但既已选择&…

【RDC2022纪念板】RT-Smart D1s上手

目录 环境准备开发板硬件介绍开发环境搭建烧录 环境准备 windows电脑&#xff08;用于烧录固件和串口日志查看&#xff09;Ubuntu虚拟机&#xff08;用于编译生成固件&#xff09;RDC2022纪念板TypeC数据线 开发板硬件介绍 开发板使用了全志科技的D1s芯片&#xff0c;全志RIS…