简要说明
一般不建议调用geoserver-manager的发布接口,将shpfile的压缩包上传到geoserver的服务器进行发布,这样时效比较慢,建议被发布的文件和geoserver的站点在同一台服务器或者可以让geoserver站点读取到的挂载目录等
maven依赖
<dependency>
<groupId>com.github.dov-vlaanderen</groupId>
<artifactId>geoserver-manager</artifactId>
<version>1.8</version>
</dependency>
样例代码
封装的入参实体
@Data
public class ReqDTO {
/**
* 站点地址
*/
private String serverUrl;
/**
* 站点用户名称
*/
private String userName;
/**
* 站点密码
*/
private String passWord;
/**
* 工作区名称
*/
private String workspaceName;
/**
*文件路径
*/
private String dataPath;
/**
*图层名称
*/
private String layerName;
/**
*样式名称
*/
private String styleName;
/**
*样式文件路径,若有样式文件,会注册样式
*/
private String styleFilePath;
}
辅助方法
/**
* 获取geoserver管理器
*
* @param serverUrl
* @return
*/
public GeoServerRESTManager getManager(String serverUrl, String userName, String passWord) {
try {
GeoServerRESTManager manager = new GeoServerRESTManager(new URL(serverUrl), userName, passWord);
System.out.println("连接geoserver服务器成功!");
return manager;
} catch (MalformedURLException e) {
System.out.println("连接geoserver服务器失败");
}
return null;
}
/**
* 工作空间是否存在 不存在则创建工作空间
*
*/
private boolean judgeWorkspace(GeoServerRESTManager manager, String wokeSpaceName) {
boolean wsFlag = false;
GeoServerRESTPublisher publisher = manager.getPublisher();
GeoServerRESTReader reader = manager.getReader();
wsFlag = reader.existsWorkspace(wokeSpaceName);
//判断工作空间是否存在
if (!wsFlag) {
System.out.println("工作空间不存在,创建工作空间");
//创建一个新的存储空间
wsFlag = publisher.createWorkspace(wokeSpaceName);
return wsFlag;
} else {
System.out.println("工作空间已存在");
}
return wsFlag;
}
/**
* 判断或注册样式
*
* @param
* @return
*/
private boolean judgeStyleOrCreate(GeoServerRESTManager manager, GeoServerRESTReader reader, String styleName, File styleFile, Boolean localFlag) {
if (StringUtils.isEmpty(styleName) && Objects.isNull(styleFile)) {
return false;
}
if (!StringUtils.isEmpty(styleName) && Objects.isNull(styleFile)) {
boolean styleValidateFlag = styleValidate(reader, styleName);
}
if (Objects.nonNull(styleFile)) {
if (StringUtils.isEmpty(styleName)) {
String styleFileName = styleFile.getName();
styleName = styleFileName.substring(0, styleFileName.indexOf("."));
}
System.out.println("发布样式");
publishSldFile(manager, styleFile, styleName);
if (!localFlag) {
//不是本地文件,即为上传的
FileUtil.del(styleFile);
}
return true;
}
return false;
}
/**
* sld文件发布
*
*/
private void publishSldFile(GeoServerRESTManager manager, File styleFile, String styleName) {
GeoServerRESTStyleManager styleManager = manager.getStyleManager();
boolean result = false;
//判断style是否已经存在,不存在则创建
boolean existsStyle = styleManager.existsStyle(styleName);
if (!existsStyle) {
//不基于工作空间发布 true成功false失败
result = styleManager.publishStyle(styleFile, styleName);
} else {
System.out.println("该样式已经存在");
}
return;
}
/**
* 本地shpfile 数据存储区判断和创建
*/
private boolean dataValidateOrCreate(GeoServerRESTManager manager,GeoServerRESTReader reader, String workspaceName, File shpFile) {
String shpFileName = shpFile.getName();
String dsName = shpFileName.substring(0, shpFileName.indexOf("."));
boolean existsDatastore = reader.existsDatastore(workspaceName, dsName);
if (!existsDatastore) {
//创建shape文件存储
try {
//shp文件所在的位置
String urlDataStorePath = shpFile.getPath();
// 数据存储需要的文件
String shpFilePath = String.format("file://%s", urlDataStorePath);
URL urlShapeFile = new URL(shpFilePath);
// 创建数据集
GSShapefileDatastoreEncoder datastoreEncoder = new GSShapefileDatastoreEncoder(dsName, urlShapeFile);
existsDatastore = manager.getStoreManager().create(workspaceName, datastoreEncoder);
} catch (Exception e) {
System.out.println("创建shp存储区异常");
}
}
return existsDatastore;
}
主体发布代码
private void publishShpfileLocal(ReqDTO reqDTO) {
//发布的结果
boolean result = false;
//获取管理器
GeoServerRESTManager manager = getManager(reqDTO.getServerUrl(), reqDTO.getUserName()
, reqDTO.getPassWord());
System.out.println("工作空间是否存在");
//工作空间是否存在 不存在则创建工作空间
boolean wsFlag = judgeWorkspace(manager, reqDTO.getWorkspaceName());
GeoServerRESTPublisher publisher = manager.getPublisher();
GeoServerRESTReader reader = manager.getReader();
//判断是否要注册样式
File styleFile = null;
if (!StringUtil.isEmpty(reqDTO.getStyleFilePath())) {
styleFile = new File(reqDTO.getStyleFilePath());
if(!styleFile.exists()) {
System.out.println("样式文件不存在");
return;
}
}
boolean styleFlag = judgeStyleOrCreate(manager, reader, reqDTO.getStyleName(), styleFile , Boolean.TRUE);
//若有样式,重新设置值
if (styleFlag) {
String styleName = reqDTO.getStyleName();
if (StringUtil.isEmpty(styleName) && Objects.nonNull(styleFile)) {
String styleFileName = styleFile.getName();
styleName = styleFileName.substring(0, styleFileName.indexOf("."));
localFilePublishReqDTO.setStyleName(styleName);
}
}
//判断存储区是否存在,没有就创建
boolean dsFlag = dataValidateOrCreate(manager, reader,reqDTO.getWorkspaceName(), shpFile);
if(!dsFlag){
System.out.println("数据存储区创建失败");
return;
}
//判断图层是否已经存在,不存在则创建并发布
String layerName = reqDTO.getLayerName;
RESTLayer layer = reader.getLayer(reqDTO.getWorkspaceName(), layerName);
if (Objects.isNull(layer)) {
GSFeatureTypeEncoder gsFeatureTypeEncoder = new GSFeatureTypeEncoder();
gsFeatureTypeEncoder.setTitle(layerName);
gsFeatureTypeEncoder.setName(layerName);
GSLayerEncoder gsLayerEncoder = new GSLayerEncoder();
if (styleFlag) {
gsLayerEncoder.setDefaultStyle(reqDTO.getStyleName());
}
String shpFileName = shpFile.getName();
String dsName = shpFileName.substring(0, shpFileName.indexOf("."));
result = publisher.publishDBLayer(reqDTO.getWorkspaceName(), dsName, gsFeatureTypeEncoder, gsLayerEncoder);
} else {
System.out.println("shp图层已经发布过了");
}
}