天地图离线瓦片的打包与发布(GeoServer)


想在GeoServer中直接发布松散型的瓦片是不支持的,需要使用GeoServer的mbtiles扩展。先将瓦片存储到SQLite数据库中,再将数据库发布,中间进行了一个转折。

实现思路:
1.将已有的天地图瓦片存入SQLite数据库并取名后缀为mbtiles。
2.将mbtiles文件使用Geoserver REST API发布到GeoServer。

实验环境:
VS2010
GeoServer

所需配置:
GeoServer wps,mbtiles扩展(先装wps,才能再装上mbtiles否则会出错)
Python2.7
gsconfig-master

环境安装:
默认已安装GeoServer和Python2.7
首先是GeoServer的wps和mbtiles插件,具体可参考以下博客:
GeoServer安装mbtiles扩展

再就是GeoServer REST的安装,这里使用的是Python版本,下载地址可去github上找,这里贴出地址:
gsconfig-master下载地址
里面有安装方式,因为本人没接触过Python所以安装的时候确实很费脑筋。。。
这里我先下载,然后打开。

在这里shift+鼠标右键,“在此处打开命令窗口”。
在cmd中输入python setup.py develop,按下回车等待安装。安装完成后会在你的Python安装文件夹下找到一个名为geoserver的文件夹。

打开geoserver文件夹下的store.py在大概152行处:
self.dirty.update(name = name, enabled = True, type = “Tiff”,
改为self.dirty.update(name = name, enabled = True, type = “MBTiles”
这里的type要更改为符合你发布的类型,如果是发布tif文件则不用更改。

打开geoserver文件夹下的catalog.py在大概329行处,增加以下代码:

     # start
    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 = "mbtiles"

        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)
    # end

参考博客:http://blog.csdn.net/theonegis/article/details/45950785

C++中需要进行相关的配置,主要是C++操作SQLite数据库,在另一篇文章中已经讲过了。有需要的请移步:C++操作SQLite以及配置
到这里配置完成。

直接修改运行以下Python代码即可实现发布:

from geoserver.catalog import Catalog

geourl = "http://localhost:8080/geoserver/rest"  # the url of geoserver
geocat = Catalog(geourl)  # create a Catalog object

store_name = "mbtilestest" #在geoserver中显示发布的名称
data_url = "file:D:/test.mbtiles"  #mbtiles文件所在的位置
geostore = geocat.create_coveragestore3(store_name, data_url) #实现发布

如果想在C++中实现发布,我的思路如下:
1.读取指定瓦片路径下的所有瓦片名称。
2.将这些瓦片,及瓦片属性存储到SQLite数据库中。
3.调用Python 实现发布。

注:本人在这里没有找到很好的C++调用Python,因为涉及到参数的传递,没有找到想要的方法,所以采取了一种投机取巧的方式。
将上面发布的代码以文件流的形式输出到文本中,然后调用
string run=”python “+filename;
system(run.c_str());
直接系统执行python文件,完成发布。

转载自:https://blog.csdn.net/qq_21231159/article/details/78294435

You may also like...

退出移动版