GeoServer rest Api 发布地图的一些注意问题

GeoServer rest Api 发布地图的一些注意问题

最近要用GeoServer Api实现后台发布地图服务的功能,github上发现有人写好的管理类接口geoserver-manager

geoserver-managergit地址

Geoserver 官网 rest api

但这个库已经很久没更新了,且里面的数据传输都是用的xml格式
最新的1.7只支持geoserver2.9,但基础的功能还是可以用的。

在这里插入图片描述

问题一 styles接口无法上传样式

geoserver-manager一开始上传不上去样式,样式记录可以创建,但是样式内容始终是空的。
然后去geoserver官网查看了一下官网提供的rest api和提供的例子,发现这啥也没写啊,根本解决不了问题。
最后只好去看Geoserver源码了,找了半天终于找到了StyleController了

StyleController地址

找到对应的Post映射函数,如下,发现红色的raw参数

在这里插入图片描述
再看writeStyle函数,发现raw=false时候压根就没保存传入的样式,且官网API里面也没有说明这个参数,不知道是不是我瞎了。
再看了一下其他版本,发现这个参数2.15开始加上的,但是默认值是false。

在这里插入图片描述

找到问题所在就好办了,不能再用geoserver-manager了,只好自己写几行代码,下面只是示意代码,反正大概就这么个意思,问题就解决了样式可以上传了
            String url = String.format("%s/rest/workspaces/%s/styles?name=%s&raw=true", getGeoServer().getUrl(), 
            getWorkspaceName(), URLEncoder.encode(getStyleName(), "utf-8"));
            Map<String, Object> headers = getAuthorizationHeader();
            headers.put("accept", "application/json");
            headers.put("Content-Type", "application/vnd.ogc.sld+xml;charset=utf-8");
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byteArrayOutputStream.write(getStyleInfo().getBytes());
            HttpUtils.onPostString(url, byteArrayOutputStream, headers);

问题二 发布服务上传的样式设置后无效果

这个问题也很尴尬,样式正确上传,服务正常发布,样式也正确配置,但是预览的时候地图就是黑白的
尴尬的一批
后来多次试验后发现发布完后在put一次这个样式就可以了
            String url = String.format("%s/rest/workspaces/%s/styles/%s?raw=true", getGeoServer().getUrl(), 
            getWorkspaceName(), URLEncoder.encode(getStyleName(), "utf-8"));
            Map<String, Object> headers = getAuthorizationHeader();
            headers.put("accept", "application/json");
            headers.put("Content-Type", "application/vnd.ogc.sld+xml;charset=utf-8");
            HttpURLConnection connection = HttpUtils.onPut(url, getStyleInfo(), headers);
            InputStream inputStream = connection.getInputStream();
            String value = StreamUtils.copyToString(inputStream, Charset.forName("UTF-8"));
            inputStream.close();
            connection.disconnect();

问题三 调用删除接口删除图层后datastore目录中没有删除记录,导致不能再次发布服务

删除图层本来用的geoser-manager接口删除的,删除也都成功了,但是在geoserver的数据源再次发布服务,发现这个数据源被标记为已发布状态
如下,test图层已经删除了,但是datastore中没有清除记录

在这里插入图片描述

再看一下源码发现,又是有个参数,默认又是false,recurse参数,默认是不从目录中删除改记录的,所以出现了这个问题
这个参数到底哪个版本开始加的没找到,因为翻到2.12后面tag时候源码已经找不到了,懒得找了。

在这里插入图片描述

删除代码自己写点吧,带上参数就行了
 String url = String.format("%s/rest/layers/%s?recurse=true", getGeoServer().getUrl(), name);
        Map<String, Object> headers = getAuthorizationHeader();
        headers.put("accept", "application/json");
        try {
            String result = HttpUtils.onDeleteString(url, null, headers);
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
由于也就做个shp上传postgis、发布服务、样式、管理图层、样式等等这些基础的功能,遇到的奇葩问题也就这么几个
其实主要原因是官网api有点水了,就这。
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值