本地GDB 在geoserver发布地图服务

文章目录

  • 简要说明
  • maven依赖
  • 样例代码

简要说明

geoserver本身是不支持GDB的发布,不过可以利用gdal,将GDB的图层转为shpfile,就可以进行发布。

maven依赖

			<!--geoserver需要的jar--><dependency><groupId>com.github.dov-vlaanderen</groupId><artifactId>geoserver-manager</artifactId><version>1.8</version></dependency><!--gdal包--><!--需要安装完gdal后,本地install gdal包才能使用 --><!--gdal安装可参考 https://blog.csdn.net/qq_41613913/article/details/135743562 --><dependency><groupId>org.gdal</groupId><artifactId>gdal</artifactId><version>3.7.3</version></dependency>

样例代码

封装的入参实体

@Data
public class ReqDTO {/*** 站点地址*/private String serverUrl;/*** 站点用户名称*/private String userName;/*** 站点密码*/private String passWord;/*** 工作区名称*/private String workspaceName;/***文件路径*/private String dataPath;/***gdb的图层名称* 怎么获取图层名称,可以参考 https://blog.csdn.net/qq_41613913/article/details/135746653*/private String layerName;/***样式名称*/private String styleName;/***样式文件路径,若有样式文件,会注册样式*/private String styleFilePath;
}

辅助方法

  /*** gdb的单图层转shpfile*/private void gdbSingleLayer2Shpfile(String gdbDirPath, String layerName,  String tempPath) {// 注册所有的驱动gdal.AllRegister();// 为了支持中文路径,请添加下面这句代码gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");// 为了使属性表字段支持中文,请添加下面这句gdal.SetConfigOption("SHAPE_ENCODING", "CP936");//打开gdb数据DataSource gdbDataSource = ogr.Open(gdbDirPath,0);Layer sourceLayer = gdbDataSource.GetLayerByName(layerName);//打开shp 引擎Driver shpDriver = ogr.GetDriverByName("ESRI Shapefile");//指定shp存储路径File tempPathFile = new File(tempPath);File parentFile = tempPathFile .getParentFile();if (!parentFile.exists()) {parentFile.mkdirs();}DataSource shpDataSource = shpDriver.CreateDataSource(targetPath);shpDataSource.CopyLayer(sourceLayer,layerName);//释放资源shpDataSource.delete();shpDriver.delete();gdbDataSource.delete();gdal.GDALDestroyDriverManager();}
/*** 获取geoserver管理器** @param serverUrl* @return*/public GeoServerRESTManager getManager(String serverUrl, String userName, String passWord) {try {GeoServerRESTManager manager = new GeoServerRESTManager(new URL(serverUrl), userName, passWord);System.out.println("连接geoserver服务器成功!");return manager;} catch (MalformedURLException e) {System.out.println("连接geoserver服务器失败");}return null;}
/*** 工作空间是否存在  不存在则创建工作空间**/private boolean judgeWorkspace(GeoServerRESTManager manager, String wokeSpaceName) {boolean wsFlag = false;GeoServerRESTPublisher publisher = manager.getPublisher();GeoServerRESTReader reader = manager.getReader();wsFlag = reader.existsWorkspace(wokeSpaceName);//判断工作空间是否存在if (!wsFlag) {System.out.println("工作空间不存在,创建工作空间");//创建一个新的存储空间wsFlag = publisher.createWorkspace(wokeSpaceName);return wsFlag;} else {System.out.println("工作空间已存在");}return wsFlag;}
/*** 判断或注册样式** @param* @return*/private boolean judgeStyleOrCreate(GeoServerRESTManager manager, GeoServerRESTReader reader, String styleName, File styleFile, Boolean localFlag) {if (StringUtils.isEmpty(styleName) && Objects.isNull(styleFile)) {return false;}if (!StringUtils.isEmpty(styleName) && Objects.isNull(styleFile)) {boolean styleValidateFlag = styleValidate(reader, styleName);}if (Objects.nonNull(styleFile)) {if (StringUtils.isEmpty(styleName)) {String styleFileName = styleFile.getName();styleName = styleFileName.substring(0, styleFileName.indexOf("."));}System.out.println("发布样式");publishSldFile(manager, styleFile, styleName);if (!localFlag) {//不是本地文件,即为上传的FileUtil.del(styleFile);}return true;}return false;}/*** sld文件发布**/private void publishSldFile(GeoServerRESTManager manager, File styleFile, String styleName) {GeoServerRESTStyleManager styleManager = manager.getStyleManager();boolean result = false;//判断style是否已经存在,不存在则创建boolean existsStyle = styleManager.existsStyle(styleName);if (!existsStyle) {//不基于工作空间发布 true成功false失败result = styleManager.publishStyle(styleFile, styleName);} else {System.out.println("该样式已经存在");}return;}/*** 本地shpfile 数据存储区判断和创建*/private boolean dataValidateOrCreate(GeoServerRESTManager manager,GeoServerRESTReader reader, String workspaceName, File shpFile) {String shpFileName = shpFile.getName();String dsName = shpFileName.substring(0, shpFileName.indexOf("."));boolean existsDatastore = reader.existsDatastore(workspaceName, dsName);if (!existsDatastore) {//创建shape文件存储try {//shp文件所在的位置String urlDataStorePath = shpFile.getPath();// 数据存储需要的文件String shpFilePath = String.format("file://%s", urlDataStorePath);URL urlShapeFile = new URL(shpFilePath);// 创建数据集GSShapefileDatastoreEncoder datastoreEncoder = new GSShapefileDatastoreEncoder(dsName, urlShapeFile);existsDatastore = manager.getStoreManager().create(workspaceName, datastoreEncoder);} catch (Exception e) {System.out.println("创建shp存储区异常");}}return existsDatastore;}

主体发布代码

private void publishGdbSinglelayerLocal(ReqDTO reqDTO, String tempPath) {//gdb图层转shpfilegdbSingleLayer2Shpfile(reqDTO.getDataPath, reqDTO.getLayerName,  tempPath)//发布的结果boolean result = false;//获取管理器GeoServerRESTManager manager = getManager(reqDTO.getServerUrl(), reqDTO.getUserName(), reqDTO.getPassWord());System.out.println("工作空间是否存在");//工作空间是否存在  不存在则创建工作空间boolean wsFlag = judgeWorkspace(manager, reqDTO.getWorkspaceName());GeoServerRESTPublisher publisher = manager.getPublisher();GeoServerRESTReader reader = manager.getReader();//判断是否要注册样式File styleFile = null;if (!StringUtil.isEmpty(reqDTO.getStyleFilePath())) {styleFile = new File(reqDTO.getStyleFilePath());if(!styleFile.exists()) {System.out.println("样式文件不存在");return;}}boolean styleFlag = judgeStyleOrCreate(manager, reader, reqDTO.getStyleName(), styleFile , Boolean.TRUE);//若有样式,重新设置值if (styleFlag) {String styleName = localFilePublishReqDTO.getStyleName();if (StringUtil.isEmpty(styleName) && Objects.nonNull(styleFile)) {String styleFileName = styleFile.getName();styleName = styleFileName.substring(0, styleFileName.indexOf("."));reqDTO.setStyleName(styleName);}}//判断存储区是否存在,没有就创建boolean dsFlag = dataValidateOrCreate(manager, reader,reqDTO.getWorkspaceName(), shpFile);if(!dsFlag){System.out.println("数据存储区创建失败");return;}//判断图层是否已经存在,不存在则创建并发布String layerName = reqDTO.getLayerName;RESTLayer layer = reader.getLayer(reqDTO.getWorkspaceName(), layerName);if (Objects.isNull(layer)) {GSFeatureTypeEncoder gsFeatureTypeEncoder = new GSFeatureTypeEncoder();gsFeatureTypeEncoder.setTitle(layerName);gsFeatureTypeEncoder.setName(layerName);GSLayerEncoder gsLayerEncoder = new GSLayerEncoder();if (styleFlag) {gsLayerEncoder.setDefaultStyle(reqDTO.getStyleName());}String shpFileName = shpFile.getName();String dsName = shpFileName.substring(0, shpFileName.indexOf("."));result = publisher.publishDBLayer(reqDTO.getWorkspaceName(), dsName, gsFeatureTypeEncoder, gsLayerEncoder);} else {System.out.println("shp图层已经发布过了");}}

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

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

相关文章

Java开发过程中如何进行进制换换

最近由于工作上的需要&#xff0c;遇到进制转换的问题。涉及到的进制主要是十进制、十六进制、二进制转换。 1、十进制转十六进制、二进制 调用java自带的api,测试十进制转16进制、2进制 package com.kangning.common.utils.reflect;/*** 十进制 转 十六进制* 十进制 转 二进…

AcWing第147场周赛(5556.牛的语言学)

牛语单词通过以下规则构造&#xff1a; 牛语单词仅由小写字母构成。牛语单词的具体结构为&#xff1a;词根若干个&#xff08;0 个或更多&#xff09;后缀&#xff0c;其中&#xff1a; 词根为长度大于 4 的字符串。后缀为长度 2 或 3 的字符串。在构成单词时&#xff0c;不允…

机器学习算法的另一个分支-贝叶斯算法原理(贝叶斯要解决什么问题)

目录 一、贝叶斯简介 二、贝叶斯要解决的问题 三、例子&#xff08;公式推导&#xff09; 四、实例 1. 拼写纠正实例 2. 垃圾邮件过滤实例 一、贝叶斯简介 1. 贝叶斯&#xff1a;英国数学家。1702年出生于伦敦&#xff0c;做过神甫。贝叶斯在数学方面主要研究概率论.对于…

Golang基础-3

Go语言基础 介绍 基础 1. 条件语句 2. 选择语句 3. 循环语句 4. goto关键字 介绍 本文介绍Go语言中条件语句、选择语句、循环语句、break、continue、goto关键字等相关知识。 基础 1. 条件语句 实现程序逻辑时&#xff0c;需要通过不同的判断条件去执行相应的语句。…

初识C++ · 入门(1)

目录 前言&#xff1a; 1 命名空间 2 输入和输出 3 缺省参数 5 函数重载 前言&#xff1a; C与C语言是有一定交集的&#xff0c;可以理解为本贾尼在使用C语言的时候认为有缺陷&#xff0c;于是加了一些小语法进行改良&#xff0c;后来经过委员会的修改&#xff0c;C98问世…

深度学习故障诊断实战 | 数据预处理之基于滑动窗的数据样本增强

前言 本期给大家分享介绍如何基于滑动窗方法进行数据样本增强 背景 深度学习模型训练需要大量的样本。在故障诊断领域&#xff0c;每个类别大都会达到300个样本。但是在实际公开数据集中&#xff0c;以CWRU数据集为例&#xff0c;每个类别只有24组数据&#xff0c;这明显是不…

CSGO赛事管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…

ExpandableNotificationRow的父类layout

ExpandableNotificationRow的父类layout NotificationsQuickSettingsContainer NotificationPanelView NotificationShadeWindowView ExpandableNotificationRow 就是下图的一个 Notification&#xff1a; USB连接 。 何时创建一个ExpandableNotificationRow 并且被添加到Not…

Spring Boot 工程开发常见问题解决方案,日常开发全覆盖

本文是 SpringBoot 开发的干货集中营&#xff0c;涵盖了日常开发中遇到的诸多问题&#xff0c;通篇着重讲解如何快速解决问题&#xff0c;部分重点问题会讲解原理&#xff0c;以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题&#xff0c;既方便自己也方便他人&…

护眼台灯对眼睛有危害吗?多款预防近视的台灯推荐

在日常生活中&#xff0c;灯光对于我们而言&#xff0c;是非常重要的&#xff0c;尤其是在夜晚&#xff0c;不管是学习还是办公都需要合适的光线环境。很多家长为了保护孩子的视力会选择从台灯下手&#xff0c;但又不知道护眼台灯对眼睛有危害吗&#xff1f;今天就来好好的告诉…

【MySQL】数据库--表操作

目录 一、创建表 二、查看表 三、修改表 1. 添加字段--add 2.修改表名--rename to 3.修改列名--change 4.修改字段的数据类型--modify 5.删除字段&#xff08;列&#xff09;--drop 四、删除表 一、创建表 create [temporary]table[if not exists]table_name [([colu…

vscode插件

一、codeGeex 自动解析代码添加注释 二、Prettier - Code formatter 代码格式化插件 // “prettier.useEditorConfig”: false, // 是否使用editorConfig配置文件中的设置 “prettier.semi”: true, // 句尾是否填加分号 “prettier.singleQuote”: false, //是否使用单引号 “…

python如何获取word文档的总页数

最近在搞AI. 遇到了一个问题&#xff0c;就是要进行doc文档的解析。并且需要展示每个文档的总页数。 利用AI. 分别尝试了chatGPT, 文心一言&#xff0c; github copilot&#xff0c;Kimi 等工具&#xff0c;给出来的答案都不尽如人意。 给的最多的查询方式就是下面这种。 这个…

【Canvas与艺术】硬朗风格十二棱表表盘

【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>硬朗风格十二棱表表盘</title><style type"text/css…

Qt+OpenGL入门教程(三)——绘制三角形

通过前两篇文章的学习&#xff0c;我想大家应该有了基本的理解&#xff0c;我们接下来实操一下。 创建Qt OpenGL窗口 QOpenGLWidget QGLWidget是传统QtOpenGL模块的一部分&#xff0c;与其他QGL类一样&#xff0c;应该在新的应用程序中避免使用。相反&#xff0c;从Qt5.4开始…

新手如何用Postman做接口自动化测试?

1、什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来&#xff0c;本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已…

【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

本文简介 1、对最先进水平RAG进行了全面和系统的回顾&#xff0c;通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下&#xff0c;更广泛的范围内的法学硕士研究RAG的景观。 2、确定并讨论了RAG过程中不可或缺的核心技术&#xff0c;特别关注“…

深入Facebook的世界:探索数字化社交的无限可能性

引言 随着数字化时代的到来&#xff0c;社交媒体平台已经成为了人们日常生活中不可或缺的一部分&#xff0c;而其中最为突出的代表之一便是Facebook。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅仅是一个社交网络&#xff0c;更是一个数字化社交的生态系统&#…

机器人机械手加装SycoTec 4060 ER-S电主轴高精密铣削加工

随着科技的不断发展&#xff0c;机器人技术正逐渐渗透到各个领域&#xff0c;展现出前所未有的潜力和应用价值。作为机器人技术的核心组成部分之一&#xff0c;机器人机械手以其高精度、高效率和高稳定性的优势&#xff0c;在机械加工、装配、检测等领域中发挥着举足轻重的作用…

C#使用iText7画发票PDF——字体与自定义颜色

字体可以引用windows自带的字体&#xff0c;引用方式如下&#xff1a; //楷体 PdfFont KT PdfFontFactory.CreateFont(“C://Windows//Fonts//SIMKAI.TTF”, PdfEncodings.IDENTITY_H); //宋体 PdfFont ST PdfFontFactory.CreateFont(“C://Windows//Fonts//SIMFANG.TTF”, P…