geoserver 通過代碼實現發布地圖服務
轉自原文 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即可。
geoserver 通過代碼實現發布地圖服務