前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GeoServer:代码实现批量发布地图服务

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

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-22 15:08:51
3.4K0
发布2019-01-22 15:08:51
举报
文章被收录于专栏:给永远比拿愉快

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

可惜的是除了cURL有详细的文档之外,其它语言参考文档很少。不得不说开源软件就是没有很好的技术支持,毕竟是开源免费的,也不可能有很好的技术支持,免费开源给你用就是最大的奉献了。哈哈,支持开源!

Java篇

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

代码语言:javascript
复制
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模块常用的几种安装方式 。 安装完以后,代码如下: 如下,采用默认的用户名,密码,默认的工作空间,所以函数的参数很少,如果你要自定义这些,详细查看函数的说明。

代码语言:javascript
复制
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,数据不会上传。

代码语言:javascript
复制
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方法如下:

代码语言:javascript
复制
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)

最后的客户端调用代码:

代码语言:javascript
复制
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即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年05月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java篇
  • Python篇
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档