• geoserver 通过代码实现发布地图服务


    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即可。

  • 相关阅读:
    (3)Smali系列学习之Smali语法详解
    (2.1)Smali系列学习之基础语法
    (2.0)Smali系列学习之Smali语法
    Why NHibernate updates DB on commit of read-only transaction
    用LinqPad查看Nhibernate生成的sql语句
    Oracle中Clob类型处理解析
    时间线插件
    深入理解OAuth2.0协议
    项目经理问:为什么总是只有我在加班–挂包袱现象
    Nhibernate Case SUM
  • 原文地址:https://www.cnblogs.com/wang985850293/p/5149020.html
Copyright © 2020-2023  润新知