前言
本文将两种自动发布写成了工具类,至于接口封装,如有需要可留言。
所需依赖如下:
<!--geoserver自动发布服务-->
<dependency>
<groupId>nl.pdok</groupId>
<artifactId>geoserver-manager</artifactId>
<version>1.7.0-pdok2</version>
</dependency>
<repositories>
<repository>
<id>GeoSolutions</id>
<url>http://maven.geo-solutions.it/</url>
</repository>
</repositories>
1.自动发布影像服务
代码如下(示例):
public class testpublicimage {
public static void main(String[] args) throws Exception {
String wsName="publictif";
String layerPath="C:\\Users\\Administrator\\Desktop\\shuju\\result.tif";
String layerCode="geotif";
boolean publishImageLayer = publishImageLayer(wsName, layerPath, layerCode);
System.out.println(publishImageLayer);
}
public static boolean publishImageLayer(String wsName, String layerPath, String layerCode) throws Exception {
String gsImageUrl="http://localhost:8080/geoserver";
String gsImageUser= "admin";
String gsImagePwd="geoserver";
GeoServerRESTManager geoServerRESTManager = new GeoServerRESTManager(new URL(gsImageUrl), gsImageUser, gsImagePwd);
GeoServerRESTPublisher geoServerRESTPublisher = geoServerRESTManager.getPublisher();
GeoServerRESTReader geoServerRESTReader=geoServerRESTManager.getReader();
// 判断workspace是否存在,不存在则创建
List<String> workspaces = geoServerRESTReader.getWorkspaceNames();
if (!workspaces.contains(wsName)) {
boolean isCreateWs =geoServerRESTPublisher.createWorkspace(wsName);
log.info("Create ws : {}" , isCreateWs);
} else {
log.info("Workspace already exist, workspace :{}" , wsName);
}
// String fileName = layerPath.split("/")[layerPath.split("/").length-1];
// String storeName = fileName.substring(0, fileName.length()-4);
String storeName = layerCode;
// if("basemap".equals(layerCode)) {
// storeName = "raster_basemap";
// // todo 判断raster_basemap是否存在,如果存在,则不发布。return true
// }
RESTDataStore restStore = geoServerRESTReader.getDatastore(wsName, storeName);
if(restStore == null) {
GSGeoTIFFDatastoreEncoder gtde = new GSGeoTIFFDatastoreEncoder(storeName);
gtde.setWorkspaceName(wsName);
gtde.setUrl(new URL("file:" + layerPath));
boolean createStore = geoServerRESTManager.getStoreManager().create(wsName, gtde);
log.info("Create store (TIFF文件创建状态) : " + createStore);
}else {
// if("raster_basemap".equals(storeName)){
// // todo 图层组已存在返回true,否则重新发布
raster_basemap已存在,返回true
// return true;
// }
}
boolean isPublished =geoServerRESTPublisher.publishGeoTIFF(wsName, storeName, new File(layerPath));
log.info("publish (TIFF文件发布状态): " + isPublished);
return isPublished;
}
}
2.自动发布PostGIS表
代码如下(示例):
public class testpublicpostgis {
public static void main(String[] args) throws Exception {
String wsName = "qwe4" ; //待创建和发布图层的workspace
//String store_name = "lyf" ; //数据库连接要创建的store
String layerName = "henan_village" ; // 数据库要发布的表名称,后面图层名称和表名保持一致
boolean publishPostGISLayer = publishPostGISLayer(wsName, layerName);
if(publishPostGISLayer=false){
System.out.println("此Publish layer已存在");
}
System.out.println(publishPostGISLayer);
}
public static boolean publishPostGISLayer(String wsName, String layerName) throws Exception {
//geoserver连接配置
String url = "http://localhost:8080/geoserver" ;
String username = "admin" ;
String passwd = "geoserver" ;
//postgis连接配置
String pgHost = "localhost" ;
int pgPort = 5432;
String pgUser = "postgres" ;
String pgPwd = "111111" ;
String pgSchema="public";
String pgDatabase="Demo";
// String ws = "lyf" ; //待创建和发布图层的workspace
// String store_name = "lyf" ; //数据库连接要创建的store
// String table_name = "xxx" ; // 数据库要发布的表名称,后面图层名称和表名保持一致
Boolean isPublished=null;
GeoServerRESTManager geoServerRESTManager = new GeoServerRESTManager(new URL(url), username, passwd);
GeoServerRESTPublisher geoServerRESTPublisher = geoServerRESTManager.getPublisher();
GeoServerRESTReader geoServerRESTReader=geoServerRESTManager.getReader();
//判断workspace是否存在,不存在则创建
//创建一个workspace
List<String> workspaces = geoServerRESTReader.getWorkspaceNames();
if(!workspaces.contains( wsName)){
boolean createws = geoServerRESTPublisher.createWorkspace( wsName);
System.out.println("create ws : " + createws);
}else {
System.out.println("workspace已经存在了,ws :" + wsName);
}
// 判断数据存储(datastore)是否已经存在,不存在则创建
String storeName = wsName + "_pg2";
RESTDataStore restStore =geoServerRESTReader.getDatastore(wsName, storeName);
if (restStore == null) {
GSPostGISDatastoreEncoder store = new GSPostGISDatastoreEncoder(storeName);
store.setHost(pgHost);
store.setPort(pgPort);
store.setUser(pgUser);
store.setPassword(pgPwd);
store.setDatabase(pgDatabase);
store.setSchema(pgSchema);
store.setConnectionTimeout(300);
store.setMaxConnections(20);
store.setMinConnections(1);
store.setExposePrimaryKeys(true);
boolean isCreateStore = geoServerRESTManager.getStoreManager().create(wsName,store);
System.out.println("Create store : " + isCreateStore);
} else {
log.info("DataStore already exist, store:" + storeName);
}
RESTLayer layer = geoServerRESTReader.getLayer(wsName, layerName);
// 若图层已存在,则不发布
if (layer == null) {
// publisher.removeLayer(wsName, layerName);
geoServerRESTPublisher.unpublishFeatureType(wsName, storeName, layerName);
}
GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder();
fte.setTitle(layerName);
fte.setName(layerName);
fte.setSRS("EPSG:4326");
GSLayerEncoder layerEncoder = new GSLayerEncoder();
// layerEncoder.setDefaultStyle(layerName); // 样式和图层名字相同
isPublished = geoServerRESTPublisher.publishDBLayer(wsName, storeName, fte, layerEncoder);
log.info("Publish layer: " + isPublished);
System.out.println("Publish layer: " + isPublished);
return isPublished;
}
}
注意
依赖必须为此版本
<dependency>
<groupId>nl.pdok</groupId>
<artifactId>geoserver-manager</artifactId>
<version>1.7.0-pdok2</version>
</dependency>
不然import it.geosolutions.geoserver.rest.encoder.datastore.GSGeoTIFFDatastoreEncoder;失败。我试过别的版本,显示没有GSGeoTIFFDatastoreEncoder。