java发布WCS服务到GeoServer服务器并解析XML生成可下载的WCS服务数据url(2022.2.14)

Posted jing_zhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java发布WCS服务到GeoServer服务器并解析XML生成可下载的WCS服务数据url(2022.2.14)相关的知识,希望对你有一定的参考价值。

GeoServer上的WCS服务发布调用及解析生成可下载为Tif的WCSUrl 2022.2.14

所用软件环境(Java、Tomcat、GeoServer、Google Browser、Eclipse、ArcGIS)

1、GeoServer 简介

        GeoServer是一个用 Java 编写并允许用户共享和编辑地理空间数据的开源服务器端软件。 GeoServer 使用开放标准发布来自任何主要空间数据源的数据,它专为互操作性而设计,允许用户要素数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。 实施 Web 地图服务 (WMS) 标准,GeoServer 可以创建各种输出格式的地图。GeoServer 已集成免费地图库——OpenLayers,可快速生成简单地图。 另外,GeoServer 建立在 Geotools 之上,是一个开源 Java GIS 工具包。
        GeoServer 是领先的大规模发布地理空间数据的开源服务器,是用于管理和传播地理空间数据的强大解决方案。 它支持多种输入格式,用于根据 OGCISO TC 211 发布的标准以及社区标准,通过众所周知的 API 生成令人惊叹的地图、执行分析或简单地在 Web 上提供Map。 很多组织使用 GeoServer 提供 PB 级数据,从点数据(例如全球实时船舶位置)到海量多维地球观测数据。
        GeoServer 是开放地理空间联盟 Open Geospatial Consortium (OGC)、Web 要素服务Web Feature Service (WFS) 和 Web 覆盖服务 Web Coverage Service (WCS)标准的参考实现,也是经过高性能认证的兼容 Web 地图服务Web Map Service (WMS)。 GeoServer 构成了地理空间网络的核心组件。

GeoServer支持的输入格式和接口
类型
输入格式Shapefile、GeoPackage、Oracle Spatial、PostGIS、SQL Server、MongoDB、GeoTiff、JPEG200、NetCDF、ElasticSearch、SAP Hana
协议和输出格式OGC Web Map Services (WMS)、OGC Web Feature Services (WFS)、OGC Web Coverage Services (WCS)、OGC Web Processing Services (WPS)、OGC Web Map Tile Services (WMTS)、Catalogue Service for the Web (CSW)、Tile Mapping Service (TMS)、OGC Web Map Services、OGC KML/KMZ、OGC GML、New OGC REST API 、GeoJSON、GeoRSS、DDS/BIL for 3D mapping
使用的知名世界组织DLR (Ge)、EUMETSAT (EU)、DigitalGlobe (US)、Halliburton (US/UK)、New York City (US)、MassGIS (US)、Topcon (Jp/It)、FarmersEdge (Can/US)、San Jose Water (US)、PDF (US)、FNMOC (US)、NOOA (US)、City of Genoa (It)、World Bank、UN FAO、UN WFP、UNEGP GRID、BEV (At)、IGN (Fr)、BRGM (Fr)、EMSA (EU)、National Land Survey (NLS) of Finland (Fi)、Swedish Agency for Maritime and Water Management (SWAM)、UNESCO、Finnish Environment Institute (Fi)、New South Wales Geological Survey (Au)、GeoScience Australia (Au)、Total (fr)、Norbit (No)、NPRA (No)、DWD (Ge)、Rennes Metropole (Fr)
GeoServer REST Interface at work

1.1 GeoServer 用户手册和文档

        若用户想要深入学习GeoServer,可前往官网查看GeoServer用户手册GeoServer文档

GeoServer用户手册
GeoServer文档

1.2 GeoServer 支持的 Web 服务(WMS、WFS、WCS、WPS、CSW、WMTS)

1.2.1 WMS 网络地图服务


        OGC Web地图服务WMS)规范定义了一个HTTP接口,用于从服务器请求带有地理参考的地图图像。GeoServer支持使用最广泛的WMS版本WMS 1.1.1,以及WMS 1.3.0WMS提供了一个简单的HTTP接口,用于从一个或多个分布式地理空间数据库请求地理注册地图图像。WMS请求定义了要处理的地理层和感兴趣的区域。对请求的响应是一个或多个可以在浏览器应用程序中显示的地理注册地图图像(以JPEGPNG等格式返回)。该接口还支持指定返回的图像是否应该是透明的,以便可以合并或不合并来自多个服务器的层。

1.2.2 WFS 网络要素服务

        OGC Web要素服务WFS用于使用HTTP在互联网上创建、修改和交换矢量格式的地理信息。WFS用地理标记语言(Geography Markup Language,GML)编码和传输信息,GMLXML的一个子集。GeoServer支持的WFS版本2.0.0、1.1.0和1.0.0。WFS代表了地理信息在互联网上创建、修改和交换方式的变化。例如,WFS不使用文件传输协议FTP在文件级别共享地理信息,而是在要素和要素属性级别提供对地理信息的直接细粒度访问。


1.2.3 WCS 网络覆盖服务

        OGC Web 覆盖服务 (WCS) 将地理空间信息的接收称为“覆盖”:表示空间变化现象的数字地理空间信息。可以将其视为光栅数据的WFS。它获取地图的“源代码”,但在本例中,它不是原始向量,而是原始图像。WCSWMS有一个重要的区别。尽管它们十分相似都可以返回相似的格式,但WCS能够返回更多信息,包括有价值的元数据和更多格式。



        WCS服务包含三种接口请求:GetCapabilitiesDescribeCoverageGetCoverage

1.2.4 WPS 网络处理服务

        OGC Web 处理服务WPS是一种用于发布地理空间过程、算法和计算的服务。WPS服务是Geoserver的扩展,为数据处理地理空间分析提供执行操作。默认情况下,WPS不是GeoServer的一部分,但可以作为扩展提供。WPS接口标准为地理空间处理服务(如多边形叠加)的输入和输出(请求和响应)的标准化提供了规则。该标准还定义了客户机如何请求流程的执行,以及如何处理流程的输出。它定义了一个接口,用于促进地理空间过程的发布以及客户对这些过程的发现和绑定。WPS所需的数据可以通过网络传输,也可以在服务器上获得。

1.2.5 WMTS 网络地图切片服务

        OGC Web 地图切片服务WMTS标准定义了一些操作,这些操作允许用户访问瓦片地图,WMTS可能是OGC首个支持RESTful访问的服务标准。

1.2.6 CSW 网络目录服务

        OGC Web 目录服务CSW可以从GeoServer目录中检索和显示相关数据服务和处理服务项目。

1.3 Service Metadata 服务元数据

        开放Web服务(WCSWFSWMSWPS)使用通用元数据定义来描述所提供的服务,并指出任何使用限制。

WMS 对应的服务元数据

2、 GeoServer安装及使用

2.1 前提条件: Java 8 或 Java 11

Java 8
Java 11

        在安装GeoServer前,务必记得安装好Java才可(可Win+R打开cmd命令行窗口输入java -version进行测试,这里使用的是Java 8,在GeoServer下载页面点击Archived可下载历史各个版本的GeoServer

GeoServer 2.20.2
各个历史版本的GeoServer

GeoServer的三种安装方法

2.2 三种方式安装GeoServer

        GeoServer 2.20.2安装包下载

2.2.1 方式一:安装包安装 (Windows installer)


        参考Windows installer,双击安装包选择适配项进行安装即可。

2.2.2 方式二:独立二进制文件复制 (Windows binary)


        参考Windows binary,首先解压该文件得到下图所示的文件夹后,进入bin文件夹后用鼠标双击startup.bat,会弹出启动GeoServer的命令行窗口,启动成功后的默认端口为8888,打开浏览器访问http://localhost:8888/geoserver可进入GeoServer服务器的登录页面,默认的用户名为admin,密码为geoserver





        关闭GeoServer服务器只需要关闭命令行窗口即可。

2.2.3 方式三:作为servlet部署到Tomcat服务器 (Web archive)


        参考Web archive,首先解压该文件得到如下所示的文件夹,在文件夹中找到geoserver.war文件并复制后粘贴到Tomcat服务器的webapps文件夹下(D:\\program files\\apache-tomcat-10.0.12\\webapps),之后进入bin文件夹下双击startup.bat,弹出Tomcat服务器启动的命令行窗口,待启动完成后打开浏览器访问http://localhost:8080/geoserver



        浏览器进入Tomcathttp://localhost:8080/主页后选择登录,使用用户名tomcat和密码s3cret登录可查看并管理Web 应用程序,可以看到/geoserver,说明GeoServer服务器部署成功,点击该项可进入相关页面。

2.3 使用GeoServer

        为了更好地使用GeoServer,可参考Using the web administration interfacePublishing a shapefile等官方帮助示例。
        

3、WCS服务的发布与请求


        这里以WGC1984坐标系的栅格Tif数据为例进行实验。

3.1 GeoServer发布WCS服务

3.1.1 手动发布

        进入GeoServer主页后,发布之前需要打开工作区citeWCS服务功能。

        先点击左侧的数据存储,选择添加新的数据存储


        之后选择新建数据源下的栅格数据源中的GeoTIFF

        在添加栅格数据源界面,这里选择已有的工作区为cite(当然可以自己新建一个工作区),然后输入数据源名称为sample,然后点击浏览选择要上传的Tif数据后点击保存,会进入新建图层界面,点击发布



        进入编辑图层界面,根据自己的需要对数据、发布、维度、Tile Caching、Security五个方面进行设置后,最终点击保存即可在图层中看到。





        点击左侧的图层预览,右侧查找到cite:sample工作区名:数据名)后点击右侧的OpenLayers即可对Tif影像进行预览。

预览效果图

3.1.2 java代码自动发布Tif影像到GeoServer服务器(利用 GeoServer的Rest API)

        上传GeoTIFF数据到GeoServer服务器的函数,详见4.2.1
PublishGeoTiffToGeoServer

import it.geosolutions.geoserver.rest.GeoServerRESTManager;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher;
import it.geosolutions.geoserver.rest.encoder.datastore.GSGeoTIFFDatastoreEncoder;
	   /**
	* @function 发布本地GeoTiff到GeoServer上形成WCS服务
	* @author NoName
	* @createdate 2022.2.14
	* @param1 Tif_fileName: D:/迅雷下载/sample.tif
	* @param2 saveIP GeoServer服务器的Ip地址
	* @param3 savePort GeoServer服务器的端口号
	* @param4 saveIP GeoServer服务器的用户名
	* @param5 savePort GeoServer服务器的密码
	* @param6 workspace 待发布WCS服务的工作空间名称
	* @param7 storename 待发布WCS服务的数据存储名称
	* @return WCS服务的identifier
	*/
    public static String PublishGeoTiffToGeoServer(String Tif_fileName,String saveIP,String savePort,String username,String password,String workspace,String storename)
    
    	/**
 	     * 上传服务
 	     */
         String serviceurl = "http://"+saveIP+":"+savePort+"/geoserver"; 		//GeoServer的连接配置
         int flag=0;
         try
            	 
           URL u = new URL(serviceurl);
           GeoServerRESTManager manager = new GeoServerRESTManager(u, username, password);
           GeoServerRESTPublisher publisher = manager.getPublisher();
           List workspaces = manager.getReader().getWorkspaceNames();
           if (!workspaces.contains(workspace)) //判断工作区(workspace)是否存在,不存在则创建
           
               boolean createws = publisher.createWorkspace(workspace);
               System.out.println("create ws : " + createws);
            else 
               System.out.println("workspace存在 :" + workspace);
           
          //新建数据存储,如已经存在将覆盖
           
           
           GSGeoTIFFDatastoreEncoder gsGeoTIFFDatastoreEncoder = new GSGeoTIFFDatastoreEncoder(storename);
           gsGeoTIFFDatastoreEncoder.setWorkspaceName(workspace);
           gsGeoTIFFDatastoreEncoder.setUrl(new URL("file:" + Tif_fileName));
           boolean createStore = manager.getStoreManager().create(workspace, gsGeoTIFFDatastoreEncoder);
           System.out.println("create store (TIFF文件创建状态) : " + createStore);
           boolean publish = manager.getPublisher().publishGeoTIFF(workspace, storename, new File(Tif_fileName));
           System.out.println("publish (TIFF文件发布状态) : " + publish);
           if(publish==true)
           
        	   flag=1;       	   
           else
           
        	   flag=0;
           
       catch(Exception e)
       
			e.printStackTrace();
			flag = 0;
	   
       if(flag == 1)
       
    	 return workspace+":"+storename;
       
       else
    	   return "";
    

3.2 GeoServer上WCS服务的三种请求

3.2.1 GetCapabilities

        GetCapabilities操作是向WCS服务器请求该服务器提供哪些操作和服务(“功能”)的列表。
Using a GET request (standard HTTP):

http://localhost:8080/geoserver/wcs?service=wcs&version=1.0.0&request=getcapabilities

3.2.2 DescribeCoverage

        DescribeCoverage请求的目的是获取有关客户想要查询的覆盖范围的附加信息。它返回有关crs、元数据、域、范围和可用格式的信息。客户机通常需要发出DescribeCoverage请求,然后才能确保能够发出正确的GetCoverage请求。

http://localhost:8080/geoserver/wcs?service=wcs&version=1.0.0&request=describecoverage&identifier=cite:sample

http://localhost:8080/geoserver/wcs?service=wcs&version=1.1.0&request=describecoverage&identifiers=cite:sample

3.2.3 GetCoverage

        GetCoverage操作请求实际的空间数据。它可以检索覆盖范围的子集,结果可以是覆盖范围本身,也可以是对它的引用。GetCoverage请求最强大的功能是能够对域(高度和时间)和范围进行裁剪。它还可以进行重采样,以不同的数据格式编码,并以不同的方式返回生成的文件。

http://localhost:8080/geoserver/wcs?request=GetCoverage&service=wcs&version=1.0.0&sourceCov
erage=cite:sample&crs=EPSG:4326&format=geotiff&BBox=114.13813710173059,30.423415944431966,114.52639379166072,30.726972419428588&width=1366&height=1068

4、根据Identifier获取WCS服务的数据URL下载地址

4.1 利用GeoServer手动拼接URL

        点击GeoServer主页下方的演示,选择右侧的WCS request builder,进入WCS request builder页面,Coverage name一栏选择cite:sample

        点击Get Coverage可直接下载该Tif影像。


        点击Generate GetCoverage XML后会弹出GetCoverage所对应的HTTP Post请求需要的XML,因为本质上Get Coverage就是利用XML中的一些信息(版本号、服务类型、Bounding Box、宽度和高度、坐标系、数据格式)来发送请求获得GeoServer服务器的响应而得到WCS服务对应的Tif影像。

        利用上述XML可得到下载sample影像的WCSUrl 格式为 http://localhost:8080/geoserver/wcs?request=GetCoverage&service=wcs&version=1.0.0&sourceCov
erage=cite:sample&crs=EPSG:4326&format=geotiff&BBox=114.13813710173059,30.423415944431966,114.52639379166072,30.726972419428588&width=1366&height=1068
,将其输入到浏览器的地址栏里后回车即可进行下载,GeoServer服务器后台进行响应。




        最后利用ArcGIS打开下载好的cite_sample.tif进行查看,结果如下图所示。

4.2 java上传Tif到GeoServer服务器形成WCS服务并根据identifier解析生成可下载为Tif的WCSUrl

4.2.1 java代码及第三方jar包(Eclipse)

        依赖的第三方jar包如下,在Eclipse中将这些jar包添加到Build Path中即可运行。

commons-beanutils-1.9.4.jar
commons-codec-1.9.jar
commons-collections-3.2.2.jar
commons-collections4-4.2.jar
commons-compiler-3.0.8.jar
commons-dbcp-1.4.jar
commons-fileupload-1.3.3.jar
commons-httpclient-3.1.jar
commons-io-2.8.0.jar
commons-jxpath-1.3.jar
commons-lang-2.5.jar
commons-lang3-3.8.1.jar
commons-logging-1.1.1.jar
commons-pool-1.5.4.jar
commons-text-1.4.jar
dom4j.jar
geoserver-manager-1.7.0-pdok2.jar
jaxen-1.1.6.jar
jdom-1.1.3.jar
json.jar
log4j-1.2.17.jar
slf4j-api-1.6.4.jar
slf4j-log4j12-1.6.4.jar

4.2.1.1 PublishGeoTiffToGeoServer函数

        a、上传GeoTIFF数据到GeoServer服务器的函数PublishGeoTiffToGeoServer

	   /**
	* @function 发布本地GeoTiff到GeoServer上形成WCS服务
	* @author NoName
	* @createdate 2022.2.14
	* @param1 Tif_fileName: D:/迅雷下载/sample.tif
	* @param2 saveIP GeoServer服务器的Ip地址
	* @param3 savePort GeoServer服务器的端口号
	* @param4 saveIP GeoServer服务器的用户名
	* @param5 savePort GeoServer服务器的密码
	* @param6 workspace 待发布WCS服务的工作空间名称
	* @param7 storename 待发布WCS服务的数据存储名称
	* @return WCS服务的identifier
	*/
    public static String PublishGeoTiffToGeoServer(String Tif_fileName,String saveIP,String savePort,String username,String password,String workspace,String storename)
    
    	/**
 	     * 上传服务
 	     */
         String serviceurl = "http://"+saveIP+":"+savePort+"/geoserver"; 		//GeoServer的连接配置
         int flag=0;
         try
            	 
           URL u = new URL(serviceurl);
           GeoServerRESTManager manager = new GeoServerRESTManager(u, username, password);
           GeoServerRESTPublisher publisher = manager.getPublisher();
           List workspaces = manager.getReader().getWorkspaceNames();
           if (!workspaces.contains(workspace)) //判断工作区(workspace)是否存在,不存在则创建
           
               boolean createws = publisher.createWorkspace(workspace);
               System.out.println("create ws : " + createws);
            else 
               System.out.println("workspace存在 :" + workspace);
           
          //新建数据存储,如已经存在将覆盖
           
           
           GSGeoTIFFDatastoreEncoder gsGeoTIFFDatastoreEncoder = new GSGeoTIFFDatastoreEncoder(storename);
           gsGeoTIFFDatastoreEncoder.setWorkspaceName(workspace);
           gsGeoTIFFDatastoreEncoder.setUrl(new URL("file:" + Tif_fileName));
           boolean createStore = manager.getStoreManager().create(workspace, gsGeoTIFFDatastoreEncoder);
           System.out.println("create store (TIFF文件创建状态) : " + createStore);
           boolean publish = manager.getPublisher().publishGeoTIFF(workspace, storename, new File(Tif_fileName));
           System.out.println("publish (TIFF文件发布状态) : " + publish);
           if(publish==true)
           
        	   flag=1;       	   
           else
           
        	   flag=0;
           
       catch(Exception e)
       
			e.printStackTrace();
			flag = 0;
	   
       if(flag == 1)
       
    	 return workspace+":"+storename;
       
       else
    	   return "";
    

4.2.1.2 getWCSGetCov

以上是关于java发布WCS服务到GeoServer服务器并解析XML生成可下载的WCS服务数据url(2022.2.14)的主要内容,如果未能解决你的问题,请参考以下文章

GeoServer 用于共享地理空间数据的开源服务器

OGC——WMS服务

通过修改源代码创建geoserver战争

如何利用GeoServer发布卫星地图服务

如何在fedora系统中,让geoserver服务开机启动??

MapServer 之 发布网络覆盖数据服务(WCS-Web Coverage Service)