天地圖離線瓦片的打包與釋出(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 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
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檔案,完成釋出。