天地图离线瓦片的打包与发布(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