GeoServer:代码实现批量发布地图服务

利用GeoServer发布WCS服务,那么如果我有很多数据需要进行发布,这样利用GeoServer提供的UI界面进行操作显然很不显示。那能不能利用GeoServer提供的API进行操作呢?GeoServer提供了REST API方便我们利用代码进行操作。用户手册中提供了如下语言或方法进行操作:cURL,PHP,Python,Java和Ruby。

Java篇

我先使用了Java语言的geoserver manager。在Eclipse新建一个Maven工程,添加相应的依赖包,下面是一个读出数据的例子:

public static boolean read() {
String restUrl = "http://localhost/geoserver";
String username = "admin";
String password = "geoserver";
GeoServerRESTReader reader;
try {
reader = new GeoServerRESTReader(restUrl, username, password);
} catch (MalformedURLException e) {
e.printStackTrace();
return false;
}
String workspace = "whu.images";
String store = "00N006E";
String name = "00N006E";
RESTCoverage coverage = reader.getCoverage(workspace, store, name);
System.out.println(coverage.getAbstract());
return true;
}

但是我在写入栅格数据的时候出现了一些问题,如下是数据存储的类继承关系: 
 
我们可以看到Coverage Store没有实现类,GSAbstractCoveragestoreEncoder是一个抽象类,而且是被标注@Deprecated的,所以我不知道怎么新建Coverage Store,本来想自己写一个实现类,最终还是放弃了。

Python篇

后来才用的Python解决了问题,但是也不是一帆风顺的。 
首先安装gsconfig包,如果不知道如何安装,参考Python模块常用的几种安装方式 。 
安装完以后,代码如下: 
如下,采用默认的用户名,密码,默认的工作空间,所以函数的参数很少,如果你要自定义这些,详细查看函数的说明。

from geoserver.catalog import Catalog

geourl = "http://localhost/geoserver/rest"  # the url of geoserver
geocat = Catalog(geourl) # create a Catalog object store_name = "00N010E"
data = "E:/RSImageService/data/images/00N010E.tif"
geocat.create_coveragestore(store_name, data)

但是上面使用create_coveragestore有一个问题,即会将你的文件默认拷贝到你的Data Directory中,如果你数据很多,这样你就会有两份数据了,极大的浪费了磁盘空间。

后来发现Catalog类有提供一个create_coveragestore2的方法,可以创建一个UnSavedCoveragestore,数据不会上传。

from geoserver.catalog import Catalog

geourl = "http://localhost/geoserver/rest"  # the url of geoserver
geocat = Catalog(geourl) # create a Catalog object store_name = "00N010E"
data_url = "fiel:E:/RSImageService/data/images/00N010E.tif"
geostore = geocat.create_coveragestore2(store_name)
geostore.url = data_url
geocat.save(geostore)

但是程序一运行就回返回一个服务器内部错误505,Error code (505) from geoserver:: data store must be part of a workspace.

最后自己写了一个方法用于发布GeoTIFF影像(从GitHub上看到的一段代码,运行有点问题,然后自己修改了下)。给Catalog类添加一个create_coveragestore3方法,用户发布栅格数据,同时不复制数据。这需要修改gsconfig源代码,然后重新编译下。 
create_coveragestore3方法如下:

def create_coveragestore3(self, name, data_url, workspace=None, overwrite=False):
if not overwrite:
try:
store = self.get_store(name, workspace)
msg = "There is already a store named " + name
if workspace:
msg += " in " + str(workspace)
raise ConflictingDataError(msg)
except FailedRequestError:
# we don't really expect that every layer name will be taken
pass if workspace is None:
workspace = self.get_default_workspace()
headers = {
"Content-type": "text/plain",
"Accept": "application/xml"
} ext = "geotiff" cs_url = url(self.service_url,
["workspaces", workspace.name, "coveragestores", name, "external." + ext],
{ "configure" : "first", "coverageName" : name}) headers, response = self.http.request(cs_url, "PUT", data_url, headers)
self._cache.clear()
if headers.status != 201:
raise UploadError(response)

最后的客户端调用代码:

from geoserver.catalog import Catalog

geourl = "http://localhost/geoserver/rest"  # the url of geoserver
geocat = Catalog(geourl) # create a Catalog object store_name = "00N010E"
data_url = "file:E:/RSImageService/data/images/00N010E.tif"
geocat.create_coveragestore3(store_name, data_url)

如果你要发布很多数据,遍历文件夹调用create_coveragestore3即可。

geoserver 通过代码实现发布地图服务的更多相关文章

  1. GeoServer自动发布地图服务

    1 NetCDF气象文件自动发布案例 GeoServer是一个地理服务器,提供了管理页面进行服务发布,样式,切片,图层预览等一系列操作,但是手动进行页面配置有时并不满足业务需求,所以GeoServer ...

  2. JavaWeb和WebGIS学习笔记(六)——使用ArcGIS for Server发布地图服务

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  3. 利用 PortableBasemapServer 发布地图服务

    前段时间需要给自己的C/S系统加一个地图,但是没有数据,于是就想到了使用网上的切片地图,但是C/S系统又不能联网,于是就想本地发布切片服务来使用. 本来想用ArcGIS Server来发布从网上下载的 ...

  4. 动态创建地图文档MXD并发布地图服务

    原文:动态创建地图文档MXD并发布地图服务 1.动态创建MXD private bool CreateMxd(string MxdPath, string MxdName) { IMapDocumen ...

  5. ArcGIS发布地图服务

    一般做完矢量图绘制工作后,生成的.mxd文件只能在ArcMap中查看,为了方便用户进行浏览,我们需要发布地图服务. 目前为止最常用的就是在ArcGIS中发布地图服务. 今天也算是在做“发布地图服务”的 ...

  6. 手把手教你怎么用ArcgisOnline发布地图服务

    Arcgis推出了Arcgis Online,但是大家都不知道这是个什么东西,怎么用这个东西,今天这篇文章手把手的教你如何使用Arcgisonline发布地图服务. 一.ArcgisOnline简介 ...

  7. arcgis server10.2发布地图服务报错

    发布地图服务时,读取了本机电脑中的切片方案.发布服务,报打包成功,但发布失败错误. 解决办法:给arcgis账户,赋予读写权限即可.重复发布服务,成功发布.

  8. ArcGIS Server 10.1安装、配置、发布地图服务

    先跟大家分享一个esri的学习资料,http://pan.baidu.com/s/1nBzxB,<ArcGIS10.1 for Server 入门教程>.教程讲述的很清楚,下面说说我这次发 ...

  9. geoserver发布地图服务WMTS

    WMTS: 切片地图web服务(OpenGIS Web Map Tile Service) WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案.WMTS弥补了WMS不能提供分块地图的 ...

随机推荐

  1. java中的URLConnection和HttpURLConnection有什么区别(因为我自己搜到别人写的区别看下来都没有什么区别)

    今天看了一下公司同事的代码,如下 URLConnection connection = openConnection(localURL); HttpURLConnection httpURLConne ...

  2. MyBatis 中#与$的区别

    今天在工作中有个点击排序的功能调试了许久,终寻因,总结之.  需求是这样的,页面有个table,有一列的上下箭头可点击并排序.对于这种需求,我的mybatis.xml的sql配置写成了如下: < ...

  3. web本质

    知识内容: 1.网络协议复习 2.模拟web 3.web本质总结 参考: http://www.cnblogs.com/wupeiqi/articles/5237672.html http://www ...

  4. Arrays.binarySearch 数组二分查找

    public static void main(String[] args) throws Exception { /** * binarySearch(Object[], Object key) a ...

  5. GD库简介和使用

    简介 php并不仅限于创建html输出,它也可以创建和处理包括GIF,PNG,jpef,wbmp以及xpm在内的多种格式的图像.更加方便的是,php可以直接将图像数据库输出到浏览器.要想在php中使用 ...

  6. jsp 回车代替tab 自动切换text焦点

    方法一keyCode (IE11以后失效) <html> <head> <meta http-equiv="Content-Type" content ...

  7. 装机 win7 64 IE11

    英文版win7,更改语言包 英文版 http://windows.microsoft.com/en-us/internet-explorer/download-ie 中文版 http://window ...

  8. Gradle 多项目构建

    Gradle可以轻松处理各种大小规模的项目.小项目由一个单一的构建文件和一个源代码树构成. 大项目可以将其拆分成更小的,相互依赖的模块,以便更容易理解. 多项目构建的结构特征: 在项目的根目录或主目录 ...

  9. 通过http方式关闭和重启Jenkins

    Jenkins关闭和重启实现方式.   1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/, ...

  10. c语言使用librdkafka库实现kafka的生产和消费实例(转)

    关于librdkafka库的介绍,可以参考kafka的c/c++高性能客户端librdkafka简介,本文使用librdkafka库来进行kafka的简单的生产.消费 一.producer librd ...