用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方法,该方法有很多同名的重载方法,可以参考源码依据情况使用

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



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生成样式文件,然后上传到你的工作空间,这样在代码里些样式的名字就可以在发布地图服务时应用了。

如果想使用代码完成:下面的逻辑和方法自己加入在合适的位置吧,还可以加入一些其他的内置方法做判断比如是否存在某个图层,删除图层,删除数据储存等等,可以点一下源码或者用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的单元测试

@SpringBootTest
class 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的样式文件,后续再更新。

  • 26
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Java调用GeoServer的接口可以通过发送HTTP请求来实现。首先,你需要确保你的Java项目中引入了相关的HTTP请求库,比如Apache HttpClient或者OkHttp。然后,你可以使用这些库来发送GET或者POST请求到GeoServer的REST API。在请求中,你需要指定请求的URI,包括GeoServer的地址和端口号,以及相应的工作空间和数据存储名称。例如,你可以使用GET请求来获取指定工作空间和数据存储的信息,请求的URI可以是类似于"ip:8080/geoserver/rest/workspaces/{workspaceName}/datastores/{storeName}"的形式。你还可以在请求中添加一些参数,比如quietOnNotFound参数来避免数据不存在时出现异常。请注意,你需要根据你的实际情况来替换URI中的占位符。通过这种方式,你就可以在Java调用GeoServer的接口了。 #### 引用[.reference_title] - *1* [学习调用GeoServer的接口时遇到的一些问题(一)](https://blog.csdn.net/weixin_42047398/article/details/107400129)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [GeoServer系列-java接口发布空间表(SQLServer、PostgreSql)](https://blog.csdn.net/u012796085/article/details/129841713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [GeoServerRESTApi接口使用](https://blog.csdn.net/weixin_43947145/article/details/118809246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值