当前位置:   article > 正文

用java调用geoserver发布地图服务——(萌新记录自己终于解决的问题)_java操作geoserver逻辑

java操作geoserver逻辑

前言

在我的项目中需要使用cesium展示地图服务(矢量、栅格),在我接手之前,代码使用的时arcgis发布的地图服务,arcgis确实功能强大并且教程很多,但是可能负载太大了,网不好的时候栅格图像他要加载很久。如下图,网络原因我的底图出现了错误没加载出来(意思一下),于是乎想到了使用geoserver发布地图服务并加载,geoserver是轻量级并且开源的。

准备工作

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、createDataStore、createPostGISDatastore))

4.发布图层

调用publisher.publishGeoTIFF方法,该方法有很多同名的重载方法,可以参考源码依据情况使用

具体工具类代码(可以直接用)

  1. public class GeoServerUtil {
  2. /**
  3. * geoServer配置
  4. */
  5. private static String url = "http://localhost:8088/geoserver";
  6. private static String geoUsername = "admin";
  7. private static String geoPassword = "geoserver";
  8. public static GeoServerRESTManager getManager() throws MalformedURLException {
  9. URL u = new URL(url);
  10. //获取管理对象
  11. GeoServerRESTManager geoServerRESTManager = new GeoServerRESTManager(u, geoUsername, geoPassword);
  12. return geoServerRESTManager;
  13. }
  14. /**
  15. * 判断工作区(workspace)是否存在,不存在则创建
  16. */
  17. public static boolean judgeWorkSpace(String workspace) throws MalformedURLException {
  18. boolean flag = false;
  19. GeoServerRESTManager manager = getManager();
  20. GeoServerRESTPublisher publisher = manager.getPublisher();
  21. List<String> workspaces = manager.getReader().getWorkspaceNames();
  22. if (!workspaces.contains(workspace)) {
  23. boolean createWorkspace = publisher.createWorkspace(workspace);
  24. flag = true;
  25. System.out.println("create workspace : " + createWorkspace);
  26. } else {
  27. flag = false;
  28. System.out.println("workspace已经存在了,workspace :" + workspace);
  29. }
  30. return flag;
  31. }
  32. /**
  33. * 当发布图层时会自动创建数据储存,于是我把创建数据储存的方法删除了
  34. *
  35. * @param store 存储名
  36. * @param workSpace 工作空间名
  37. * @param filePath 要发布的图层的硬盘的url
  38. * @param layerName 要发布的图层的名字
  39. * @param style 发布图层使用的样式,因为我的几个样式已经提前传到工作空间了,所以就没有用代码
  40. * @return boolean
  41. */
  42. public static boolean shpJudgeDatabase(String workSpace, String store, String filePath, String layerName,String style) {
  43. GeoServerRESTManager manager = null;
  44. RESTCoverageStore restStore = null;
  45. try {
  46. manager = getManager();
  47. GeoServerRESTPublisher publisher = manager.getPublisher();
  48. //
  49. boolean publish = publisher.publishGeoTIFF(workSpace, store, layerName, new File(filePath), "EPSG:4326",
  50. GSResourceEncoder.ProjectionPolicy.FORCE_DECLARED, style, null);
  51. System.out.println("publish (TIFF文件发布状态) : " + publish);
  52. }catch (Exception e) {
  53. e.printStackTrace();
  54. }
  55. return false;
  56. }

小贴士

如果你的栅格图像之类的,作图之后就已经强制渲染rgb了,就可以不用上传样式文件,使用默认的样式就可完成发布,如果你的栅格是黑白的,推荐使用QGIS生成样式文件,然后上传到你的工作空间,这样在代码里些样式的名字就可以在发布地图服务时应用了。

如果想使用代码完成:下面的逻辑和方法自己加入在合适的位置吧,还可以加入一些其他的内置方法做判断比如是否存在某个图层,删除图层,删除数据储存等等,可以点一下源码或者用idea看看,下面是publisher的方法

  1. GeoServerRESTStyleManager styleManager = manager.getStyleManager();
  2. if (!styleManager.existsStyle(style)) {
  3. // 向geoserver写入style
  4. String sldContent = readFile(sldPath);
  5. boolean publishStyleInWorkspace = styleManager.publishStyleInWorkspace(workSpace, sldContent, layerName);
  6. System.out.println("publishStyleInWorkspace : "+publishStyleInWorkspace);
  7. }
  8. /*
  9. * 读取sld文件
  10. */
  11. public static String readFile(String filePath) throws Exception{
  12. //使用线程安全的 StringBuffer
  13. StringBuffer sb = new StringBuffer();
  14. FileInputStream inputStream = null;
  15. InputStreamReader streamReader = null;
  16. BufferedReader reader = null;
  17. try {
  18. //获取文件字节输入流对象
  19. inputStream = new FileInputStream(filePath);
  20. //将字节输入流转换为字符输入流,并设置编码
  21. streamReader = new InputStreamReader(inputStream , "UTF-8");
  22. //创建字节缓冲输入流(提高速度)
  23. reader = new BufferedReader(streamReader);
  24. //逐行读取
  25. String s = "";
  26. while ((s = reader.readLine()) != null){
  27. sb.append(s);
  28. sb.append("\n"); //换行符,使读取的内容排版更符合源sld文件内容
  29. }
  30. }catch (Exception e){
  31. e.printStackTrace();
  32. }finally {
  33. reader.close();
  34. streamReader.close();
  35. inputStream.close();
  36. return sb.toString();
  37. }
  38. }
  39. }

测试

使用的springboot的单元测试

  1. @SpringBootTest
  2. class TrshApplicationTests {
  3. @Test
  4. public void tset(){
  5. try {
  6. boolean a = GeoServerUtil.judgeWorkSpace("nlg");
  7. System.out.println(a);
  8. } catch (MalformedURLException e) {
  9. throw new RuntimeException(e);
  10. }
  11. }
  12. @Test
  13. public void test2(){
  14. boolean b = GeoServerUtil.shpJudgeDatabase("nlg", "testphearly", "E:\\TRSH\\testdata\\ph05.tif", "aaaaaa","raster");
  15. }

发布成功,源码生成的日志信息可以看看,自己研究代码调试的时候很有用,注意raster是内置的栅格数据默认样式,QGIS如何生成sld的样式文件,后续再更新。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/758085
推荐阅读
相关标签
  

闽ICP备14008679号