geoserver java web_Java实现GeoServer通过rest发布shp至WMS服务

本文档记录了使用Java和GeoServer REST API将Shapefile发布为WMS服务的过程。首先,文章介绍了添加必要的Maven依赖和配置GeoServer仓库。接着,展示了如何创建GeoServer连接,发布工作区、样式、数据存储和图层。完整的Java代码示例演示了从创建工作区到发布图层的每个步骤,包括处理Shapefile、设置样式以及解决常见问题和陷阱。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

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文件的位置参数。我在这里踩了很久的坑................................................

82635974572e4c59739f4f5af8ea0cf0.png

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管理查看

f18c77a5f91500fc29eadc812129a10f.png

四、完整代码

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    @强

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值