GeoServer rest Api 发布地图的一些注意问题
程序员文章站
2022-07-12 20:30:50
...
GeoServer rest Api 发布地图的一些注意问题
最近要用GeoServer Api实现后台发布地图服务的功能,github上发现有人写好的管理类接口geoserver-manager
但这个库已经很久没更新了,且里面的数据传输都是用的xml格式
最新的1.7只支持geoserver2.9,但基础的功能还是可以用的。
问题一 styles接口无法上传样式
geoserver-manager一开始上传不上去样式,样式记录可以创建,但是样式内容始终是空的。
然后去geoserver官网查看了一下官网提供的rest api和提供的例子,发现这啥也没写啊,根本解决不了问题。
最后只好去看Geoserver源码了,找了半天终于找到了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有点水了,就这。