Java实现GeoServer通过rest发布shp至WMS服务
项目中遇到需要GeoTools发布shp至GeoServer,特此记录。
一、添加依赖
org.geotools
gt-shapefile
${geotools.version}
org.geotools
gt-api
${geotools.version}
org.geotools
gt-wms
${geotools.version}
因为刚学习geoserver,具体需要哪些依赖我也记不清了。geotools的jar拉取不下来,需要在maven中添加geo的仓库。
osgeo
OSGeo Release Repository
https://repo.osgeo.org/repository/release/
false
true
osgeo-snapshot
OSGeo Snapshot Repository
https://repo.osgeo.org/repository/snapshot/
true
false
此处还需要用geoserver-manager的依赖
it.geosolutions
geoserver-manager
1.7.0
我在网上找了各种依赖拉取,都是失败。最后找的源码,自己打包引入的项目。
二、Java代码
前一篇文章讲了GeoServer的web管理端发布WMS服务,Java发布服务与管理端流程一致。
public classPublishWms {public static voidmain(String[] args) {
System.out.println("====================开始发布服务");
publishShape();
System.out.println("====================发布服务完成");
}
}
1. geoserver创建连接信息
//geoServer信息
String url = "http://localhost:8080/geoserver";
String user= "admin";
String password= "geoserver";//连接geoServer
GeoServerRESTManager geoServerRESTManager = null;try{
geoServerRESTManager= new GeoServerRESTManager(newURL(url), user, password);
}catch(Exception e) {
System.out.println("远程连接GeoServer失败...");
e.printStackTrace();
}
2. manager中重要的几个类对象
geoserver-manager中几个重要的类对象
GeoServerRESTManager该对象是一个最大的管理者可以获取以下两个对象,创建数据存储
GeoServerRESTPublisher,发布对象,用来发布各种数据和创建工作空间(主要用来创建对象)
GeoServerRESTReader,获取数据存储、图层、样式、图层组等(主要用来获取信息)
//shp读写和发布
assert geoServerRESTManager != null;
GeoServerRESTReader restReader=geoServerRESTManager.getReader();
GeoServerRESTPublisher restPublisher= geoServerRESTManager.getPublisher();
3. 创建工作区
//工作区
String workSpace = "spacetest2";//存在相应的工作区
if (!restReader.existsWorkspace(workSpace)) {
restPublisher.createWorkspace(workSpace);
}
4. 添加style样式
//style样式
String styleName = "styletest2";
String styleSld;//判断是否已经发布了style
if (!restReader.existsStyle(workSpace, styleName)) {
String styleFilePath= "Z:\\GIStone\\SuperMap\\Server\\webapps\\iserver\\WEB-INF\\config\\region.sld";
File styleFile= newFile(styleFilePath);
restPublisher.publishStyleInWorkspace(workSpace, styleFile, styleName);
}
styleSld= restReader.getSLD(workSpace, styleName);
style样式引入的sld文件。SLD是风格化图层描述器(Styled Layer Descriptor)的简称。SLD描述了如何在WMS规范的基础上进行扩展使之支持用户对要素数据进行自定义的符号化显示。SLD是一种基于XML语言的OGC标准。这表示SLD文件会被GeoServer创建并且能够被任何一种支持WMS的服务器软件所支持。我们不想限制大家渲染地图的方式,因此我们使用OGC标准规定的SLD作为GeoServer的渲染系统的核心。
5. 创建数据存储
//数据存储
String dataSetName = "datasettest2";if (!restReader.existsDatastore(workSpace, dataSetName)) {//创建shape文件存储
try{//shp文件所在的位置
String urlDataStorePath =file.getPath();//数据存储需要的文件
String shpFilePath = String.format("file://%s", urlDataStorePath);
URL urlShapeFile= newURL(shpFilePath);//创建数据集
GSShapefileDatastoreEncoder datastoreEncoder = newGSShapefileDatastoreEncoder(dataSetName, urlShapeFile);
datastoreEncoder.setCharset(Charset.forName("GBK"));
geoServerRESTManager.getStoreManager().create(workSpace, datastoreEncoder);
}catch(MalformedURLException e) {
e.printStackTrace();
}
}
String shpFilePath = String.format("file://%s", urlDataStorePath);
路径参照web端添加数据源时,需要shp文件的位置参数。我在这里踩了很久的坑................................................

6. 添加图层layer发布
String layerName = "ne_50m_admin_0_tiny_countries_scale_rank";if (!restReader.existsLayer(workSpace, layerName)) {try{
GSFeatureTypeEncoder gsFeatureTypeEncoder= newGSFeatureTypeEncoder();
gsFeatureTypeEncoder.setTitle(layerName);
gsFeatureTypeEncoder.setName(layerName);
gsFeatureTypeEncoder.setSRS(GeoServerRESTPublisher.DEFAULT_CRS);
GSLayerEncoder gsLayerEncoder= newGSLayerEncoder();
gsLayerEncoder.addStyle(styleSld);boolean layer =restPublisher.publishDBLayer(workSpace, dataSetName, gsFeatureTypeEncoder, gsLayerEncoder);
System.out.println("publish layer : " +layer);
}catch(Exception e) {
e.printStackTrace();
}
}
至此,发布完成。
三、web管理查看

四、完整代码
private static voidpublishShape() {
File file= new File("Z:\\GIStone\\Projects\\tutorial\\document\\data\\50m_cultural\\ne_50m_admin_0_tiny_countries_scale_rank.shp");//File zipFile = new File("Z:\\GIStone\\Projects\\tutorial\\document\\data\\50m_cultural\\ne_50m_admin_0_tiny_countries_scale_rank.zip");//geoServer信息
String url = "http://localhost:8080/geoserver";
String user= "admin";
String password= "geoserver";//连接geoServer
GeoServerRESTManager geoServerRESTManager = null;try{
geoServerRESTManager= new GeoServerRESTManager(newURL(url), user, password);
}catch(Exception e) {
System.out.println("远程连接GeoServer失败...");
e.printStackTrace();
}//shp读写和发布
assert geoServerRESTManager != null;
GeoServerRESTReader restReader=geoServerRESTManager.getReader();
GeoServerRESTPublisher restPublisher=geoServerRESTManager.getPublisher();//工作区
String workSpace = "spacetest2";//存在相应的工作区
if (!restReader.existsWorkspace(workSpace)) {
restPublisher.createWorkspace(workSpace);
}//style样式
String styleName = "styletest2";
String styleSld;//判断是否已经发布了style
if (!restReader.existsStyle(workSpace, styleName)) {
String styleFilePath= "Z:\\GIStone\\SuperMap\\Server\\webapps\\iserver\\WEB-INF\\config\\region.sld";
File styleFile= newFile(styleFilePath);
restPublisher.publishStyleInWorkspace(workSpace, styleFile, styleName);
}
styleSld=restReader.getSLD(workSpace, styleName);//数据存储
String dataSetName = "datasettest2";if (!restReader.existsDatastore(workSpace, dataSetName)) {//创建shape文件存储
try{//shp文件所在的位置
String urlDataStorePath =file.getPath();//数据存储需要的文件
String shpFilePath = String.format("file://%s", urlDataStorePath);
URL urlShapeFile= newURL(shpFilePath);//创建数据集
GSShapefileDatastoreEncoder datastoreEncoder = newGSShapefileDatastoreEncoder(dataSetName, urlShapeFile);
datastoreEncoder.setCharset(Charset.forName("GBK"));
geoServerRESTManager.getStoreManager().create(workSpace, datastoreEncoder);
}catch(MalformedURLException e) {
e.printStackTrace();
}
}//图层layer
String layerName = "ne_50m_admin_0_tiny_countries_scale_rank";if (!restReader.existsLayer(workSpace, layerName)) {try{
GSFeatureTypeEncoder gsFeatureTypeEncoder= newGSFeatureTypeEncoder();
gsFeatureTypeEncoder.setTitle(layerName);
gsFeatureTypeEncoder.setName(layerName);
gsFeatureTypeEncoder.setSRS(GeoServerRESTPublisher.DEFAULT_CRS);
GSLayerEncoder gsLayerEncoder= newGSLayerEncoder();
gsLayerEncoder.addStyle(styleSld);boolean layer =restPublisher.publishDBLayer(workSpace, dataSetName, gsFeatureTypeEncoder, gsLayerEncoder);
System.out.println("publish layer : " +layer);
}catch(Exception e) {
e.printStackTrace();
}
}//发布shape
/*try {
boolean shape = restPublisher.publishShp(workSpace, dataSetName, layerName, zipFile, GeoServerRESTPublisher.DEFAULT_CRS);
System.out.println("publish shape : " + shape);
} catch (FileNotFoundException e) {
e.printStackTrace();
}*/
/*// 创建发布类
GeoServerRESTPublisher geoServerRESTPublisher = new GeoServerRESTPublisher(url, user, password);
try {
boolean flag = geoServerRESTPublisher.publishShp(workSpace, dataSetName,
new NameValuePair[]{new NameValuePair("charset", "GBK")},
dataSetName,
GeoServerRESTPublisher.UploadMethod.FILE,
file.toURI(),
GeoServerRESTPublisher.DEFAULT_CRS,
styleName);
System.out.println("publish shp : " + flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}*/}
五、踩过的坑
1. 在发布shapefile时候创建数据源前面要加“file://”。
2. layer图层的名称一定要与shp文件的名称一样。
3. 如果需要用到压缩文件,压缩文件只能为zip格式,不能是rar格式否则会报错,而且压缩文件的路径是全路径。
转载自: https://blog.csdn.net/qq_31832209/article/details/111561350 @强
本文档记录了使用Java和GeoServer REST API将Shapefile发布为WMS服务的过程。首先,文章介绍了添加必要的Maven依赖和配置GeoServer仓库。接着,展示了如何创建GeoServer连接,发布工作区、样式、数据存储和图层。完整的Java代码示例演示了从创建工作区到发布图层的每个步骤,包括处理Shapefile、设置样式以及解决常见问题和陷阱。

1634

被折叠的 条评论
为什么被折叠?



