发布时间:2025-06-24 20:21:03 作者:北方职教升学中心 阅读量:340
前言
在我的项目中需要使用cesium展示地图服务(矢量、createPostGISDatastore))
4.发布图层
调用publisher.publishGeoTIFF方法,该方法有很多同名的重载方法,可以参考源码依据情况使用
具体工具类代码(可以直接用)
public class GeoServerUtil { /** * geoServer配置 */ private static String url = "http://localhost:8088/geoserver"; private static String geoUsername = "admin"; private static String geoPassword = "geoserver"; public static GeoServerRESTManager getManager() throws MalformedURLException { URL u = new URL(url); //获取管理对象 GeoServerRESTManager geoServerRESTManager = new GeoServerRESTManager(u, geoUsername, geoPassword); return geoServerRESTManager; } /** * 判断工作区(workspace)是否存在,不存在则创建 */ public static boolean judgeWorkSpace(String workspace) throws MalformedURLException { boolean flag = false; GeoServerRESTManager manager = getManager(); GeoServerRESTPublisher publisher = manager.getPublisher(); List<String> workspaces = manager.getReader().getWorkspaceNames(); if (!workspaces.contains(workspace)) { boolean createWorkspace = publisher.createWorkspace(workspace); flag = true; System.out.println("create workspace : " + createWorkspace); } else { flag = false; System.out.println("workspace已经存在了,workspace :" + workspace); } return flag; }/** * 当发布图层时会自动创建数据储存,于是我把创建数据储存的方法删除了 * * @param store 存储名 * @param workSpace 工作空间名 * @param filePath 要发布的图层的硬盘的url * @param layerName 要发布的图层的名字 * @param style 发布图层使用的样式,因为我的几个样式已经提前传到工作空间了,所以就没有用代码 * @return boolean */ public static boolean shpJudgeDatabase(String workSpace, String store, String filePath, String layerName,String style) { GeoServerRESTManager manager = null; RESTCoverageStore restStore = null; try { manager = getManager(); GeoServerRESTPublisher publisher = manager.getPublisher();// boolean publish = publisher.publishGeoTIFF(workSpace, store, layerName, new File(filePath), "EPSG:4326", GSResourceEncoder.ProjectionPolicy.FORCE_DECLARED, style, null); System.out.println("publish (TIFF文件发布状态) : " + publish); }catch (Exception e) { e.printStackTrace(); } return false; }
小贴士
如果你的栅格图像之类的,作图之后就已经强制渲染rgb了,就可以不用上传样式文件,使用默认的样式就可完成发布,如果你的栅格是黑白的,推荐使用QGIS生成样式文件,然后上传到你的工作空间,这样在代码里些样式的名字就可以在发布地图服务时应用了。
准备工作
1.下载geoserver
我使用的版本是2.23.1
https://geoserver.org/release/2.23.1/
去官网下载一个安装版的就好了,很方便
2.确保自己的电脑有jdk,geoserver是基于java的
小贴士:高版本的java,一定要下载一个java11,把geoserver安装到java11的环境下,虽然说是支持java17但是支持的不是很好,我之前安装在17的环境下,服务器一直500.
更换后:才能正常用
3.依赖
要使用geoserver,就需要引入大佬们的jar包
maven依赖
<dependency> <groupId>nl.pdok</groupId> <artifactId>geoserver-manager</artifactId> <version>1.7.0-pdok2</version></dependency><dependency>
使用java编写代码发布栅格图层
1.获取geoserver的manager对象
该对象可以获取到GeoServerRESTPublisher,还有很多方法用于获取其他的管理对象
2.创建工作区(workspace)
调用GeoServerRESTPublisher类中的createWorkspace方法
3.创建对应的数据储存(栅格数据储存需要创建这个,其他的数据储存可以参考源码(createDataStore、栅格),在我接手之前,代码使用的时arcgis发布的地图服务,arcgis确实功能强大并且教程很多,但是可能负载太大了,网不好的时候栅格图像他要加载很久。如下图,网络原因我的底图出现了错误没加载出来(意思一下),于是乎想到了使用geoserver发布地图服务并加载,geoserver是轻量级并且开源的。
如果想使用代码完成:下面的逻辑和方法自己加入在合适的位置吧,还可以加入一些其他的内置方法做判断比如是否存在某个图层,删除图层,删除数据储存等等,可以点一下源码或者用idea看看,下面是publisher的方法
GeoServerRESTStyleManager styleManager = manager.getStyleManager();if (!styleManager.existsStyle(style)) { // 向geoserver写入style String sldContent = readFile(sldPath); boolean publishStyleInWorkspace = styleManager.publishStyleInWorkspace(workSpace, sldContent, layerName); System.out.println("publishStyleInWorkspace : "+publishStyleInWorkspace); }/* * 读取sld文件 */ public static String readFile(String filePath) throws Exception{ //使用线程安全的 StringBuffer StringBuffer sb = new StringBuffer(); FileInputStream inputStream = null; InputStreamReader streamReader = null; BufferedReader reader = null; try { //获取文件字节输入流对象 inputStream = new FileInputStream(filePath); //将字节输入流转换为字符输入流,并设置编码 streamReader = new InputStreamReader(inputStream , "UTF-8"); //创建字节缓冲输入流(提高速度) reader = new BufferedReader(streamReader); //逐行读取 String s = ""; while ((s = reader.readLine()) != null){ sb.append(s); sb.append("\n"); //换行符,使读取的内容排版更符合源sld文件内容 } }catch (Exception e){ e.printStackTrace(); }finally { reader.close(); streamReader.close(); inputStream.close(); return sb.toString(); } }}
测试
使用的springboot的单元测试
@SpringBootTestclass TrshApplicationTests { @Test public void tset(){ try { boolean a = GeoServerUtil.judgeWorkSpace("nlg"); System.out.println(a); } catch (MalformedURLException e) { throw new RuntimeException(e); } } @Test public void test2(){ boolean b = GeoServerUtil.shpJudgeDatabase("nlg", "testphearly", "E:\\TRSH\\testdata\\ph05.tif", "aaaaaa","raster"); }
发布成功,源码生成的日志信息可以看看,自己研究代码调试的时候很有用,注意raster是内置的栅格数据默认样式,QGIS如何生成sld的样式文件,后续再更新。createDataStore、