1. 程式人生 > >geoserver 通過代碼實現發布地圖服務

geoserver 通過代碼實現發布地圖服務

trace link lin int 工作 eat resp 標註 status

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