geoserver 通过代码实现发布地图服务
2016-01-21 17:28
453 查看
GeoServer:代码实现批量发布地图服务
利用GeoServer发布WCS服务,那么如果我有很多数据需要进行发布,这样利用GeoServer提供的UI界面进行操作显然很不显示。那能不能利用GeoServer提供的API进行操作呢?GeoServer提供了REST API方便我们利用代码进行操作。用户手册中提供了如下语言或方法进行操作:cURL,PHP,Python,Java和Ruby。
但是我在写入栅格数据的时候出现了一些问题,如下是数据存储的类继承关系:
![](http://www.myexception.cn/img/2015/05/25/1229552421.png)
我们可以看到Coverage Store没有实现类,GSAbstractCoveragestoreEncoder是一个抽象类,而且是被标注@Deprecated的,所以我不知道怎么新建Coverage Store,本来想自己写一个实现类,最终还是放弃了。
首先安装gsconfig包,如果不知道如何安装,参考Python模块常用的几种安装方式 。
安装完以后,代码如下:
如下,采用默认的用户名,密码,默认的工作空间,所以函数的参数很少,如果你要自定义这些,详细查看函数的说明。
但是上面使用create_coveragestore有一个问题,即会将你的文件默认拷贝到你的Data Directory中,如果你数据很多,这样你就会有两份数据了,极大的浪费了磁盘空间。
后来发现Catalog类有提供一个create_coveragestore2的方法,可以创建一个UnSavedCoveragestore,数据不会上传。
但是程序一运行就回返回一个服务器内部错误505,Error code (505) from geoserver:: data store must be part of a workspace.
最后自己写了一个方法用于发布GeoTIFF影像(从GitHub上看到的一段代码,运行有点问题,然后自己修改了下)。给Catalog类添加一个create_coveragestore3方法,用户发布栅格数据,同时不复制数据。这需要修改gsconfig源代码,然后重新编译下。
create_coveragestore3方法如下:
最后的客户端调用代码:
如果你要发布很多数据,遍历文件夹调用create_coveragestore3即可。
利用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; }
但是我在写入栅格数据的时候出现了一些问题,如下是数据存储的类继承关系:
![](http://www.myexception.cn/img/2015/05/25/1229552421.png)
我们可以看到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即可。
相关文章推荐
- Struts2-表单验证的两种方式
- 如何利用fsolve求方程组[matlab]
- Sublime 上写Python
- 19Java语法回顾之反射
- lua(1):lua,luarocks介绍及lua库安装
- Socket编程
- java序列化对象
- 使用Struts2验证框架实现输入校验
- RxJava 学习笔记一
- PHP开发工具
- Ant打包时候报jre错误
- ubuntu_socket通信入门_sever.cpp/client.cpp_g++编译
- ASP网站项目编译
- PyQt学习笔记01-Qt基本概念进阶篇
- Java IO流之如何选择流对象总结
- Win8.1系统打开应用程序提示错误代码0xc000007b的解决方法
- PHP 数字前面补零 固定位数补0
- git源代码托管
- Scala编程之Option
- Python的编码风格与Pybrain