使用Java往Geoserver发布tif图层和shp图层

1. Maven依赖

栅格文件对应Tif文件 (即: 栅格就是tif)

矢量文件对应shp文件(即: 矢量就是shp)

注: 有的依赖可能在中央仓库及一些镜像仓库找不到需要手动指定仓库, 在依赖最下方

        <!--  中文转拼音工具类 --><dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version></dependency><!--  工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.3</version></dependency><!--  geoserver管理工具类 --><dependency><groupId>it.geosolutions</groupId><artifactId>geoserver-manager</artifactId><version>1.7.0</version></dependency><!--  geojson工具类 --><dependency><groupId>org.geotools</groupId><artifactId>gt-geojson</artifactId><version>25.3.01</version></dependency><!--  geoserver数据库工具类 --><dependency><groupId>org.geotools</groupId><artifactId>gt-epsg-hsql</artifactId><version>24.2</version></dependency><!-- 中央仓库没有 gt-geotiff, gt-shapefile 指定新的仓库 --><repositories><repository><id>GeoSolutions</id><url>http://maven.geo-solutions.it/</url></repository></repositories>
2. GeoServerUtil工具类

工具类主要方法如下:

  1. 发布tif
  2. 发布shp
  3. 获取栅格bbox (Bounding Box) 经纬度边界
  4. 获取矢量bbox (Bounding Box) 经纬度边界

注: 其中使用到了pinyin4j主要防止文件命名是中文, 使用改工具类可以使中文转换为拼音 默认非大小驼峰命名, 可根据需要自行更改. '你好'->'nihao'

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.pinyin.engine.PinyinFactory;
import it.geosolutions.geoserver.rest.GeoServerRESTManager;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher;
import it.geosolutions.geoserver.rest.GeoServerRESTReader;
import it.geosolutions.geoserver.rest.decoder.*;
import it.geosolutions.geoserver.rest.encoder.GSLayerGroupEncoder;
import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSShapefileDatastoreEncoder;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.List;/*** @author Cookie* @date 2024/8/22* @desc GeoServerUtil*/
public class GeoServerUtil {private static final Logger logger = LoggerFactory.getLogger(GeoServerUtil.class);public static GeoServerRESTManager geoServerRESTManager;public static GeoServerRESTManager buildManager(String url, String username, String password) {try {if (geoServerRESTManager == null)geoServerRESTManager = new GeoServerRESTManager(new URL(url), username, password);return geoServerRESTManager;} catch (MalformedURLException e) {logger.error("GeoServer连接失败,请检查连接地址是否正确");logger.error(e.getMessage(), e);return null;}}private String url;private String username;private String password;public GeoServerUtil(String url, String username, String password) {this.url = url;this.username = username;this.password = password;}public GeoServerUtil() {}/*** 发布shp文件* 要求: 压缩包名称和压缩包内所有的文件名的名字相同并且只有一级* 示例:* shp_demo.zip:* * * shp_demo.dbf* * * shp_demo.fix* * * shp_demo.prj* * * shp_demo.shp* * * shp_demo.shx** @param zipFile    shp压缩文件路径* @param workspace  工作空间* @param store      存储仓库* @param layerName  图层名* @param layerGroup 图层组* @param layerStyle 图层样式*/public boolean publishShp(String zipFile, String workspace, String store, String layerName, String layerGroup, String layerStyle) {if (verifyFileExists(new File(zipFile))) return false;if (StringUtils.isEmpty(layerStyle))layerStyle = "polygon";GeoServerRESTManager geoServerRESTManager = buildManager(this.url, this.username, this.password);if (geoServerRESTManager == null)throw new RuntimeException("GeoServer连接失败");GeoServerRESTPublisher publisher = geoServerRESTManager.getPublisher();//创建工作空间List<String> workspaceNames = geoServerRESTManager.getReader().getWorkspaceNames();logger.info("存在的workspace:{}", workspaceNames);if (!workspaceNames.contains(workspace)) {if (!publisher.createWorkspace(workspace)) {return false;}}//创建存储RESTDataStore datastore = geoServerRESTManager.getReader().getDatastore(workspace, store);try {if (datastore == null) {String str = File.separator;if (str.equals("\\")) {str = "\\\\";}String[] split = zipFile.split(str);String name = split[split.length - 1];name = name.substring(0, name.lastIndexOf("."));String urlDatastore = "file:data/" + workspace + "/" + name + "/" + name + ".shp";GSShapefileDatastoreEncoder storeEncoder = new GSShapefileDatastoreEncoder(store, new URL(urlDatastore));storeEncoder.setCharset(StandardCharsets.UTF_8);if (!geoServerRESTManager.getStoreManager().create(workspace, storeEncoder)) {return false;}}//发布图层if (!publisher.publishShp(workspace, store, new NameValuePair[]{new NameValuePair("charset", "utf-8")}, layerName,GeoServerRESTPublisher.UploadMethod.FILE, new File(zipFile).toURI(), "EPSG:4326", layerStyle)) {return false;}} catch (FileNotFoundException e) {logger.error("文件不存在:{}", e.getMessage());throw new RuntimeException("文件不存在");} catch (MalformedURLException e) {logger.error("URL格式错误:{}", e.getMessage());throw new RuntimeException("URL格式错误");}if (layerGroup != null) {//加入图层组RESTLayerGroup restLayerGroup = geoServerRESTManager.getReader().getLayerGroup(workspace, layerGroup);GSLayerGroupEncoder gsLayerGroupEncoder = new GSLayerGroupEncoder();gsLayerGroupEncoder.addLayer(layerName);if (restLayerGroup == null) {geoServerRESTManager.getPublisher().createLayerGroup(workspace, layerGroup, gsLayerGroupEncoder);} else {geoServerRESTManager.getPublisher().configureLayerGroup(workspace, layerGroup, gsLayerGroupEncoder);}}return true;}/*** 发布shp文件** @param zipFile    shp压缩文件路径* @param workspace  工作空间* @param layerGroup 图层组* @param layerStyle 图层样式*/public boolean publishShp(String zipFile, String workspace, String layerGroup, String layerStyle) {File file = new File(zipFile);if (verifyFileExists(file)) return false;String fileName = getFileName(file);return publishShp(zipFile, workspace, fileName, fileName, layerGroup, layerStyle);}/*** 发布shp文件** @param zipFile    shp压缩文件路径* @param workspace  工作空间* @param layerGroup 图层组*/public boolean publishShp(String zipFile, String workspace, String layerGroup) {return publishShp(zipFile, workspace, layerGroup, null);}public boolean deleteStore(String workspace, String storeName) {GeoServerRESTManager geoServerRESTManager = buildManager(this.url, this.username, this.password);if (geoServerRESTManager == null)throw new RuntimeException("GeoServer连接失败");GeoServerRESTPublisher publisher = geoServerRESTManager.getPublisher();return publisher.removeDatastore(workspace, storeName, false);}/*** 获取栅格bbox** @param workspace 工作空间* @param store     存储仓库* @param layerName 图层名称* @return [minX, minY, maxX, maxY]*/public double[] getTiffBbox(String workspace, String store, String layerName) {GeoServerRESTManager restManager = buildManager(this.url, this.username, this.password);if (restManager == null)throw new RuntimeException("GeoServer连接失败");GeoServerRESTReader reader = restManager.getReader();RESTCoverage coverage = reader.getCoverage(workspace, store, layerName);RESTBoundingBox nativeBoundingBox = coverage.getNativeBoundingBox();return new double[]{nativeBoundingBox.getMinX(), nativeBoundingBox.getMinY(), nativeBoundingBox.getMaxX(), nativeBoundingBox.getMaxY()};}/*** 获取栅格bbox(Bounding Box)* store和layerName相同** @param workspace 工作空间* @param layerName 图层名称* @return [minX, minY, maxX, maxY]*/public double[] getTiffBbox(String workspace, String layerName) {return getTiffBbox(workspace, layerName, layerName);}/*** 获取矢量bbox(Bounding Box)* 经纬度边框** @param workspace 工作空间* @param layerName 图层名称* @return min(x, y) max(x,y)*/public double[] getShpBbox(String workspace, String layerName) {GeoServerRESTReader reader = geoServerRESTManager.getReader();RESTLayer layer = reader.getLayer(workspace, layerName);RESTFeatureType featureType = reader.getFeatureType(layer);RESTBoundingBox nativeBoundingBox = featureType.getNativeBoundingBox();return new double[]{nativeBoundingBox.getMinX(), nativeBoundingBox.getMinY(), nativeBoundingBox.getMaxX(), nativeBoundingBox.getMaxY()};}/*** 发布tif文件** @param filePath  文件路径* @param workspace 工作空间* @param styleName 样式名称 (样式不存在默认为空)* @param store     存储仓库* @param layerName 图层名称* @return true/false*/public boolean publishTiff(String filePath, String workspace, String styleName, String store, String layerName) {if (verifyFileExists(new File(filePath))) return false;if (StringUtils.isEmpty(styleName))// 默认样式名称styleName = "raster";GeoServerRESTManager geoServerRESTManager = buildManager(this.url, this.username, this.password);if (geoServerRESTManager == null)throw new RuntimeException("GeoServer连接失败");GeoServerRESTPublisher publisher = geoServerRESTManager.getPublisher();//创建工作空间List<String> workspaceNames = geoServerRESTManager.getReader().getWorkspaceNames();if (!workspaceNames.contains(workspace) && !publisher.createWorkspace(workspace))return false;try {return publisher.publishGeoTIFF(workspace, store, layerName, new File(filePath), "EPSG:4326", GSResourceEncoder.ProjectionPolicy.NONE, styleName, null);} catch (Exception e) {logger.error("发布tif文件失败: 异常信息{}", e.getMessage());return false;}}/*** 发布tiff文件* 使用默认coverageName和store** @param filePath  文件路径样式* @param workspace 工作空间* @param styleName 样式名称* @return 是否发布成功*/public boolean publishTiff(String filePath, String workspace, String styleName) {File file = new File(filePath);if (verifyFileExists(file)) return false;String fileName = getFileName(file);return publishTiff(filePath, styleName, fileName, workspace, fileName);}/*** 发布tiff文件* 使用默认coverageName和store** @param filePath  文件路径样式* @param workspace 工作空间* @return 是否发布成功*/public boolean publishTiff(String filePath, String workspace) {File file = new File(filePath);if (verifyFileExists(file)) return false;String fileName = getFileName(file);return publishTiff(filePath, "", fileName, workspace, fileName);}/*** 发布多个TIFF文件* 注: 存储仓库默认使用文件名** @param localFolder 本地文件夹路径* @param workspace   命令空间* @param styleName   矢量或栅格图层使用的样式(不传使用默认样式)*/public void publishTiffs(String localFolder, String workspace, String styleName) {List<File> files = FileUtil.loopFiles(localFolder, file -> file.getName().endsWith(".tif"));for (File file : files) {String fileName = getFileName(file);System.err.println("文件路径:" + file.getAbsolutePath());// 使用默认样式boolean publish = false;try {publish = publishTiff(file.getPath(), workspace, styleName, fileName, fileName);} catch (Exception e) {System.err.println("发布失败: " + e.getMessage());}System.out.println(file.getName() + "发布结果:" + (publish ? "成功" : "失败"));}}/*** 发布多个TIFF文件* 注: 存储仓库默认使用文件名** @param localFolder 本地文件夹路径* @param workspace   命令空间*/public void publishTiffs(String localFolder, String workspace) {publishTiffs(localFolder, workspace, null);}/*** 获取文件名* 注: 支持中文转换为拼音** @param file FILE* @return 文件名*/private static String getFileName(File file) {String[] split = file.getName().split("\\.");// 防止使用中文名称通过工具类转换 你好-> nihaoreturn PinyinFactory.get().getPinyin(split[0], "");}/*** 校验文件是否存在** @param file file* @return*/private static boolean verifyFileExists(File file) {if (!file.exists()) {logger.error("文件不存在");return true;}return false;}}
3. 工具类测试

其中有一些重载方法可根据需要自行修改

/*** @Author Cookie* @Date 2024/8/22* @Desc*/
public class GeoserverTest {private GeoServerUtil geoServerUtil;@Beforepublic void initGeoServerUtil() {geoServerUtil = new GeoServerUtil("http://localhost:8888/geoserver", "admin", "geoserver");}/*** 获取栅格bbox(Bounding Box)测试*/@Testpublic void getTiffBboxTest() {// 这里重载了一个方法,手动指定仓库名称. 默认仓库名等于文件名double[] shpBbox = geoServerUtil.getTiffBbox("15000", "20240819_yumi");System.out.println(Arrays.toString(shpBbox));// [minX, minY, maxX, maxY]// [112.92316424712779, 47.753672584652726, 113.22898940248196, 48.01270170916157]}/*** 发布tif文件*/@Testpublic void publishTiffTest() {// 重载方法一: 默认仓库名等于文件名
//        geoServerUtil.publishTiff("C:\\Users\\Administrator\\Desktop\\tif\\2024_dadou.tif", "15000");// 重载方法二: 指定图层样式
//        geoServerUtil.publishTiff("C:\\Users\\Administrator\\Desktop\\tif\\2024_dadou.tif", "15000", "raster-dadou");// 重载方法三: 指定图层名称和仓库名称geoServerUtil.publishTiff("C:\\Users\\Administrator\\Desktop\\tif\\20240819_dadou.tif", "15000", "raster-dadou-out", "dadou_store", "dadou1");}/*** 批量发布tif文件*/@Testpublic void publishTiffsTest() {geoServerUtil.publishTiffs("C:\\Users\\Administrator\\Desktop\\tif", "15000");}/*** 发布矢量图层 shp*/@Testpublic void publishShpTest() throws Exception {// 重载方法一: 默认图层名称等于文件名geoServerUtil.publishShp("C:\\Users\\Administrator\\Desktop\\neihuang_2800.zip", "15000", "neihuang");// 重载方法二: 指定样式geoServerUtil.publishShp("C:\\Users\\Administrator\\Desktop\\neihuang_2800.zip", "15000", "neihuang", "polygon");// 重载方法三: 全指定geoServerUtil.publishShp("C:\\Users\\Administrator\\Desktop\\neihuang_2800.zip", "15000", "neihuang_store", "neihuang_2024", "neihuang", "polygon");}

4. 结果查看

如果shp文件点击图层预览OpenLayers后是直接下载本地, 检查一下图层的样式是否正确

1. tif文件查看

在geoserver中的图层预览图层中都可以看到这两个图层, 点击OpenLayers可查看图层,

在这里插入图片描述

给图层绑定一下样式得到如下效果:

到这里基本就完成了图层的发布. 图层打开后的链接, 换成公网可以访问的链接就可以给前端的同事使用了.

关于样式的发布可以参考官方文档 geoserverSLD造型

2.shp文件查看

示例如下:
在这里插入图片描述

如果依赖一直拉不下来可以试试下面的方式清理一下本地maven仓库中的 .lastUpdated文件重新下载

maven快速清除lastUpdated文件

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

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

相关文章

简单步骤获取IP地址SSL 证书

在网络安全中&#xff0c;SSL证书在保护用户浏览器和Web服务器之间交换的敏感信息方面发挥着至关重要的作用。 但是&#xff0c;如果您不仅想保护域名&#xff0c;还想保护特定的IP地址&#xff0c;该怎么办&#xff1f;您可以为IP地址获取SSL证书吗&#xff1f; 简短的回答是…

.NET COER+CONSUL微服务项目在CENTOS环境下的部署实践

一、整体的环境安装与部署 1.1、DOCKER环境的部署 1.1.1 安装DOCKER yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast && yu…

2024年【甘肃省安全员C证】考试题及甘肃省安全员C证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 甘肃省安全员C证考试题考前必练&#xff01;安全生产模拟考试一点通每个月更新甘肃省安全员C证考试总结题目及答案&#xff01;多做几遍&#xff0c;其实通过甘肃省安全员C证模拟试题很简单。 1、【多选题】《安全生产…

企业要部署多点组网应该怎么做?

企业在进行扩张后&#xff0c;往往有建立多点组网的需求。本文将详细介绍企业怎样实现多点组网&#xff0c;以便有需要的用户进行了解和选择。 企业想要实现企业多点组网时&#xff0c;首先需要进行全面的网络规划和设计。这包括评估公司当前的网络架构、各个分支机构的地理位置…

AOP+ 自定义注解 +SpringElExpress自研缓存组件

AOP 自定义注解 SpringElExpress自研缓存组件 背景前置知识改造代码 背景 思考下这段代码&#xff0c;想想项目中是不是到处存在 先查缓存&#xff0c;缓存里面有&#xff0c;直接返回&#xff1b;缓存没有&#xff0c;查数据库&#xff0c;并更新到缓存 思考&#xff1a;如何…

区块链知识体系fisco-bcos实战

文章目录 一、区块链发展概述及类型和特征1.1 区块链的概念1.2 区块链的起源1.3 区块链的发展历程1.4 区块链的类型和特征 二、区块链的常见技术架构2.1 技术架构2.2 核心技术 三、区块链的常见应用3.1 生态环境监测3.2 医疗废弃物追踪解决3.3 区块链在电子政务领域的应用3.4 在…

mac安装ipa包【金铲铲为例】

mac安装ipa包 安装PlayCover 链接&#xff1a;https://github.com/PlayCover/PlayCover 1、点最新Releases 2、cmd ↓&#xff0c;拉到最下面下载dmg 3、安装 图标拖拽到Applications里 IPA下载 以金铲铲为例&#xff0c;良心砸壳包站点&#xff0c;有能力可以支持一下…

Modbus-TCP——Libmodbus安装和使用(Ubuntu22.04)

1、简介 Modbus是一种通信协议&#xff0c;广泛用于工业自动化和过程控制领域&#xff0c;允许不同设备之间进行数据交换。libmodbus是一个用于 Modbus 协议的开源库&#xff0c;主要用于开发和实现 Modbus 协议的客户端和服务器应用程序。libmodbus 以 C 语言编写&#xff0c…

Gartner发布2024年终端和工作空间安全成熟度曲线:24项相关技术发展和应用状况及趋势

由于攻击者使用人工智能来增强网络钓鱼和终端攻击&#xff0c;企业需要高级安全措施来阻止入侵行为。此技术成熟度曲线可帮助安全和风险管理领导者识别可增强终端和工作空间保护的技术。 需要知道什么 网络安全创新层出不穷&#xff0c;但区分真正的进步与短暂的趋势却很困难。…

66 IPV4/6 OSPFV2/3 实操

一 网络括谱图 二 IPV6 一 华为IPV6地址的配置思路 1 全局上开启IPV6功能 # ipv6 # 2 在指定的接口上配置IPV6地址上的接口上配置IPV6地址 ipv6 enable 3 在接口上配置IPV6地址 ipv6 address 2001:1::254/64 脚本 # interface GigabitEthernet0/0/1 ipv6 enable ip add…

Ajax基础案例

接口文档 欢迎使用 - AJAX阶段 地区查询 图解 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

libLZMA库iOS18平台编译

1.下载xz源码: 使用autogen.sh生成configure文件 2.生成makefile rm -rf ./build/iOS && mkdir -p ./build/iOS && cd ./build/iOS && ../../configure --host=arm-apple-darwin64 --prefix=`pwd`/Frameworks/lzma CC="xcrun -sdk iphoneos cl…

熟悉Labview工具用

目录复制 目录 0.0&#xff1a;快捷键0.1&#xff1a;全局非图标显示0.2&#xff1a;小技巧&#xff1a;图片导入为程序1.2&#xff1a;事件结构1.2.0&#xff1a;超时分支&#xff1a;当事件结构框左上角设置为1时&#xff0c;单位毫秒&#xff0c;即理解为1ms内没有其他的事件…

ES+FileBeat+Kibana日志采集搭建体验

1.环境准备 需要linux操作系统&#xff0c;并安装了docker环境 此处使用虚拟机演示。&#xff08;虚拟机和docker看参考我之前写的文章&#xff09; VirtualBox安装Oracle Linux 7.9全流程-CSDN博客 VirtualBox上的Oracle Linux虚拟机安装Docker全流程-CSDN博客 简单演示搭建ES…

Linux_Shell三剑客grep,awk,sed-08

三剑客的概述&#xff1a; awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找…

好用又便宜的平替苹果笔推荐:2024开学季盘点五款高性价比电容笔

​随着网络学习的不断发展&#xff0c;电容笔是一种常见的数字书写工具&#xff0c;受到许多学生党广泛欢迎&#xff0c;因为它可以与平板电脑完美配对&#xff0c;满足用户在平板上的书写、绘画等需求。可是原装笔的价格略贵&#xff0c;平替苹果笔的品牌又很多&#xff0c;很…

Java:循环练习

目录 1. 回文判断 2. 减法求商余 3. 求平方根 4.求质数 5. 猜数字 1. 回文判断 输入一个数字&#xff0c;判断是否为回文&#xff0c;回文就是正着读和反着读都一样&#xff0c;如121是回文&#xff0c;123则不是。 import java.util.Scanner;public class DemoNew {publ…

LUA的使用

背景 LUA刚流行起来的时候&#xff0c;想学习一下LUA。就找了一款使用LUA脚本引擎的游戏玩。希望从中了解LUA的使用 结果 熟悉了LUA的同时也熟悉了这款游戏。 准备工作 使用detoured withdll注入LUAK.dll。LUAK.dll用于管理LUA环境 procedure PROCESS_ATTACH(); stdcall …

Python 实现自定义异常

在Python编程中&#xff0c;异常处理是保证程序健壮性的重要机制。Python提供了一些内置的异常类&#xff0c;如ValueError、TypeError、IndexError等&#xff0c;开发者可以直接使用这些类来捕获和处理程序运行中出现的各种错误。然而&#xff0c;某些场景下&#xff0c;内置的…

无人机使用材料与结构特点详解,看完这篇文你就懂了!!!

一、常用材料 无人机的常用材料主要包括机身材料&#xff08;结构材料和非结构材料&#xff09;、发动机材料和涂料&#xff0c;其中最主要的是机身结构材料和发动机材料。 机身结构材料 低速无人机&#xff1a;主要使用木材、塑料、玻璃纤维或碳纤维复合材料蜂窝夹层结构。…