欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 20:30:50
...

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

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

geoserver-managergit地址

Geoserver 官网 rest api

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

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

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

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

StyleController地址

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

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

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

找到问题所在就好办了,不能再用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中没有清除记录

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

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

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

删除代码自己写点吧,带上参数就行了
 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有点水了,就这。