简要说明
不建议调用geoserver-manager的发布接口,将tiff文件上传到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 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;
}
/**
* 尝试从文件获取tif的坐标系
* @param tifFile
*/
private int getSrid(File tifFile) throws IOException, FactoryException {
GeoTiffReader geoTiffReader = new GeoTiffReader(tifFile);
CoordinateReferenceSystem crs = geoTiffReader.getCoordinateReferenceSystem();
if (Objects.nonNull(crs)) {
Integer epsgCode = CRS.lookupEpsgCode(crs, true);
return epsgCode;
}
return 0;
}
主体发布代码
private void publishTifLocal(ReqDTO reqDTO, File tifFile) {
if(!tifFile.exists()) {
System.out.println("文件不存在");
return;
}
boolean result = false;
//获取管理器
GeoServerRESTManager manager = getManager(reqDTO.getServerUrl(), reqDTO.getUserName()
, reqDTO.getPassWord());
//判断工作空间是否存在
boolean wsFlag = judgeWorkspace(manager, reqDTO.getWorkspaceName());
if(!wsFlag ) {
System.out.println("工作空间创建失败");
return;
}
GeoServerRESTPublisher publisher = manager.getPublisher();
GeoServerRESTReader reader = manager.getReader();
//注册样式
File styleFile = null;
if (!StringUtilS.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 (StringUtils.isEmpty(styleName) && Objects.nonNull(styleFile)) {
String styleFileName = styleFile.getName();
styleName = styleFileName.substring(0, styleFileName.indexOf("."));
reqDTO.setStyleName(styleName);
}
}
//判断图层
RESTLayer layer = reader.getLayer(reqDTO.getWorkspaceName(), layerName);
if (Objects.isNull(layer)) {
String styleName = reqDTO.getStyleName();
if (!styleFlag) {
//没有样式则使用默认样式
styleName = "test";
}
//获取tif的坐标系
int srid = getSrid(tifFile);
if (srid == 0) {
System.out.println("没有坐标系");
return;
}
result = publisher.publishExternalGeoTIFF(reqDTO.getWorkspaceName(), layerName, tifFile, layerName, "EPSG:" + srid, GSResourceEncoder.ProjectionPolicy.FORCE_DECLARED,styleName);
} else {
System.out.println("tif已经发布过了");
}
}