1. 程式人生 > >天地圖離線瓦片的打包與釋出(GeoServer)

天地圖離線瓦片的打包與釋出(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

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檔案,完成釋出。