package com.cqdh.group.its.db.util;
import cn.hutool.http.HttpException;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.cqdh.group.its.db.model.ExternalDataBaseDO;
import com.cqdh.group.its.db.model.MapDispositionDO;
import com.cqdh.group.its.db.vo.LayerInfoVO;
import com.cqdh.group.its.db.vo.MenuTreeVO;
import it.geosolutions.geoserver.rest.GeoServerRESTManager;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher;
import it.geosolutions.geoserver.rest.GeoServerRESTReader;
import it.geosolutions.geoserver.rest.decoder.RESTDataStore;
import it.geosolutions.geoserver.rest.decoder.RESTLayer;
import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSPostGISDatastoreEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSShapefileDatastoreEncoder;
import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder;
import lombok.extern.log4j.Log4j2;
import okhttp3.*;
import org.apache.hc.core5.http.message.BasicNameValuePair;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
/**
* @Description GeoServer 发布查询相关接口
* @Date 2023/1/3 10:42
* @Author 余乐
**/
@Log4j2
public class GeoServerUtil {
/**
* 获取geoserver 中的图层信息
*
* @param dispositionDO 地图服务配置
* @param pid 构造目录对象的上级id
* @return
*/
public static List<MenuTreeVO> getLayers(MapDispositionDO dispositionDO, String pid) {
String baseUrl = dispositionDO.getHost();
if (!baseUrl.endsWith("/")) {
baseUrl = baseUrl + "/";
}
// 根据服务类型拼接不同的接口地址,默认MWS
String geoserverUrl = baseUrl + "rest/workspaces/test/layers";
if (dispositionDO.getAgreement().equalsIgnoreCase("WMTS")) {
geoserverUrl = baseUrl + "gwc/rest/layers.json";
}
String client = dispositionDO.getName() + ":" + dispositionDO.getPasswd();
client = "Basic " + Base64.getEncoder().encodeToString(client.getBytes());
//log.info("查询图层列表{} , Authorization :{}", geoserverUrl, client);
String result = null;
try {
result = HttpRequest.get(geoserverUrl)
.header("Authorization", client)
.header("content-type", "application/json")
.header("accept", "application/json")
.timeout(1000)
.execute().body();
if (dispositionDO.getAgreement().equalsIgnoreCase("WMTS")) {
JSONArray jsonArray = new JSONArray(result);
//构造成目录对象
List<MenuTreeVO> voList = new ArrayList<>();
for (Object jsonobj : jsonArray) {
String item = jsonobj.toString();
if (!item.startsWith("itswmts:")) {
continue;
}
MenuTreeVO vo = new MenuTreeVO();
vo.setPpid("地图服务");
vo.setPid(pid);
vo.setId(item);
vo.setName(item);
vo.setRemark(baseUrl + "gwc/service/wmts");
voList.add(vo);
}
return voList;
} else {
JSONObject jsObject = new JSONObject(result);
Object obj = jsObject.get("layers");
if (obj instanceof String && "".equals(obj)) {
return new ArrayList<>();
}
JSONObject jsObject2 = new JSONObject(obj);
JSONArray array = new JSONArray(jsObject2.get("layer"));
//构造成目录对象
List<MenuTreeVO> voList = new ArrayList<>();
for (Object jsonobj : array) {
JSONObject item = new JSONObject(jsonobj);
MenuTreeVO vo = new MenuTreeVO();
vo.setPpid("地图服务");
vo.setPid(pid);
vo.setId("test:" + item.get("name"));
vo.setName("test:" + item.get("name"));
vo.setRemark(baseUrl + "test/wms@" + vo.getId());
voList.add(vo);
}
return voList;
}
} catch (Exception e) {
log.error("查询图层信息异常:{},{}", geoserverUrl, e.toString());
return new ArrayList<>();
}
}
/**
* 发布Shp包图层
*
* @return
*/
public static boolean publishShp(MapDispositionDO dispositionDO, File zipFile, String layername, String srs) throws MalformedURLException, FileNotFoundException {
//TODO 默认工作空间,计划调整为用户名,用以处理不同用户上传相同图层的问题
String ws = "test";
//存储仓库与图层名一致
String store_name = layername;
// shp文件所在的位置,geoserver 服务器所在目录 file:data/ws/store/layer.shp
String urlDatastore = "file:data/" + ws + "/" + layername + "/" + layername + ".shp";
log.info("存储目录地址:{}", urlDatastore);
//判断工作区(workspace)是否存在,不存在则创建
URL restURL = new URL(dispositionDO.getHost());
//获取管理对象
GeoServerRESTManager manager = new GeoServerRESTManager(restURL, dispositionDO.getName(), dispositionDO.getPasswd());
//获取发布对象
GeoServerRESTPublisher publisher = manager.getPublisher();
//获取所有的工作空间名称
List<String> workspaces = manager.getReader().getWorkspaceNames();
//判断工作空间是否存在
if (!workspaces.contains(ws)) {
//创建一个新的存储空间
boolean createws = publisher.createWorkspace(ws);
log.info("create ws : {}", createws);
} else {
log.info("workspace已经存在了,ws :{}", ws);
}
//判断数据存储(datastore)是否已经存在,不存在则创建
URL urlShapefile = new URL(urlDatastore);
RESTDataStore restStore = manager.getReader().getDatastore(ws, store_name);
if (restStore == null) {
//创建shape文件存储
GSShapefileDatastoreEncoder store = new GSShapefileDatastoreEncoder(store_name, urlShapefile);
store.setCharset(Charset.forName("gb2312"));
boolean createStore = manager.getStoreManager().create(ws, store);
log.info("创建存储仓库 {} : {}", store_name, createStore);
} else {
log.info("数据存储仓库 {} 已经存在了", store_name);
}
//判断图层是否已经存在,不存在则创建并发布
GeoServerRESTReader reader = new GeoServerRESTReader(restURL, dispositionDO.getName(), dispositionDO.getPasswd());
RESTLayer layer = reader.getLayer(ws, layername);
if (layer == null) {
boolean publish = manager.getPublisher().publishShp(ws, store_name, layername, zipFile, srs, new BasicNameValuePair("charset", "gbk"));
log.info("发布shp图层 {} : {}", layername, publish);
return publish;
} else {
log.info("shp图层 {} 已经发布过了", layername);
return true;
}
}
/**
* 删除图层
*
* @param dispositionDO
* @param layername
* @
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
geoserver工具类.zip (4个子文件)
GeoServerUtil.java 29KB
GSAbstractDatastoreEncoder.java 1KB
GSSqlServerDatastoreEncoder.java 5KB
GSMongodbDatastoreEncoder.java 5KB
共 4 条
- 1
资源评论
占星安啦
- 粉丝: 1226
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功