2011-03-17 153 views
6

我是一個「自己動手」的傢伙,但我想確保我不會因爲嘗試咬下更多的東西而自責。WMS/WFS服務器:我瘋狂地寫我自己的?

我正在編寫一個基於瀏覽器的映射應用程序,它需要在最終用戶的機器上運行獨立(無互聯網連接)選項。也就是說,應用程序是某種服務器,在許多情況下,它將安裝在最終用戶的計算機上,瀏覽器將指向某個本地主機URL來訪問它。

我將在客戶端使用MapLayers,服務器端將有一堆特定於應用程序的自定義邏輯,例如以某些自定義方式處理地圖上的點擊事件,在地圖上創建各種自定義對象在某些時候,等等。

對於服務器的「業務邏輯」部分,我很高興在python中使用paste/webob。這是一個簡單的基礎結構,可以讓我輕鬆地完成所有這些自定義邏輯。

我一直在想客戶端會與兩臺服務器通信:這個粘貼/ webob業務邏輯服務器,以及一個服務於WMS和WFS地圖元素的服務器。所以我在尋找MapServer和GeoServer來處理地圖部分,並且...我不高興。

我不高興,因爲我不想安裝和擔心客戶機上的「野獸」。對於MapServer而言,我並不想安裝像Apache這樣的完整Web服務器,而必須處理CGI,PHP和MapScript。對於GeoServer,可能會安裝Java,並處理GeoServer設置和管理的各種複雜性。

這只是一個學習曲線問題。如果我能避免它,我對學習MapServer或GeoServer的複雜性不感興趣。我安裝了GeoServer,將其指向我的一些數據,並且能夠使用內置於GeoServer的漂亮網絡管理員中的MapLayers預覽來查看我的數據。但是當我試圖使用指向GeoServer的我自己的MapLayers網頁實際提供數據時,我崩潰了GeoServer。我可以使服務器崩潰,只是發送一些推測來自客戶端的畸形請求,這讓我感到非常驚訝。我可能會挖掘到GeoServer日誌,試圖找出我做錯了什麼,但是...我真的不想花很多時間在那。

所以,我正在考慮使用我已有的粘貼/ webob服務器自己實現WMS和WFS接口的一部分。事實上,我可能只需要WMS,因爲我可以通過一個簡單的自定義協議處理矢量對象,我可以將數據傳遞給客戶端,然後可以使用OpenLayer直接創建和操作對象。

我已經看過WMS的規格和示例消息(在WFS上少一點)。我自己實現這個協議似乎並不那麼困難,尤其是因爲在這種情況下我完全控制了客戶端 - 這不像我需要能夠充當通用的WMS或WFS服務器;我只需要讓我自己的OpenLayers客戶端開心。

我需要的WMS服務器有兩個主要的能力是:

  • 從我創建的時間提前預渲染切片的商店即成磚(我會使用預渲染OpenStreetMap的瓷磚數據和mapnik作爲重排引擎;並且我將使用OpenLayers期望的普通谷歌地圖樣式平鋪命名方案來存儲和訪問它們)

  • 有能力服務器修改版本的這些瓷磚,我存儲某些數據本地繪製在瓷磚頂部。例如,我可能在一個「圖層」上有10000個點,在另一個圖層上有10000個多邊形,並且當用戶激活這些圖層時,我將服務於相同的基本圖塊,但是當我服務這些圖塊時,這些額外的功能,並可能我會實施一個簡單的緩存方案,以保持這些過度渲染的瓷磚一段時間。

所以我的問題是:儘管我知道現在有一些工具,做這些事情(地圖服務器,GeoServer的,TileCache,和其他人),實際上,我感覺就像是較少的工作對我來說,只是迴應到一些簡單的WMS消息,並在python中對我自己的瓷磚進行額外的過度繪製,以確保所有內容都能正確投影等。我不需要爲這些覆蓋層繪製花哨的寬街道或任何東西,只需簡單的線條,圖標和可能的標籤。它確實聽起來很不錯,而且只有一個python-only解決方案。

我想,如果我需要擴展到支持更多的WMS/WFS協議,或者做更有趣的透支,那麼我可以在那時插入MapServer/GeoServer。

這裏有沒有缺陷我不考慮?

回答

1

Mapserver非常易於安裝和學習。自己實現任何類型的渲染將需要更多的努力,並且您可能會發現大量意外的陷阱。

mapserver cgi應該足以滿足您的需求。如果你需要一些非常特別的調整,那麼mapscript會很有用。

我認爲如果您可以製作一個純粹的JavaScript應用程序,並且避免安裝Web服務器(和地圖服務器),這可能會很有趣。如果你只是需要瀏覽一個拼圖馬賽克,可能你可以用JavaScript來做到這一點(爲每個拼圖生成一個單元格的html表格)。您可以使用JavaScript使用畫布渲染點或多邊形,並執行一些基本座標轉換以將地理點轉換爲像素。我認爲,Openlayers具有這種功能。

編輯:我剛剛檢查,並與Openlayers您可以瀏覽本地瓷磚,並且您可以呈現kml和一些其他vect數據。所以,我認爲你應該給Openlayers一個嘗試。

+0

感謝您的支持。現在我確實得到了這個僅用python的解決方案。我最終使用CherryPy作爲服務器,因爲粘貼似乎遇到了太多的瓦片請求。是的,我可能會在未來嘗試Mapserver,但現在我很樂意從python中爲自己的瓷磚提供服務,並且目前我需要在這些瓷磚上進行的透支工作量非常小,因此我將手動完成。 – 2011-03-24 13:36:02

+0

感謝您使用純OpenLayers解決方案的建議,但是我有太多的透支數據來實現這一點,而且我也無法保證本地計算機是服務於這些平鋪的計算機。 – 2011-03-24 13:37:01

+0

如果你想使用CGI選項,你可以使用paste.cgiapp來打包。 – 2011-08-03 21:58:59

1

不需要有wms/wfs。你需要的是一個平鋪實現。基本上你應該有一些中央服務或桌面服務來生成磁貼。一旦生成這些圖塊,您可以簡單地將它們轉換爲您的「無實服務器架構」文件系統。您可以創建一個符合/{x}/{y}/{z}.png的目錄結構,並從javascript調用它。

的OpenStreetMap的如何做這方面的例子可以在這裏找到:http://wiki.openstreetmap.org/wiki/OpenLayers_Simple_Example

+1

是的,你是對的。我能夠簡單地迴應來自OpenLayers的tile/z/y/x消息,而無需響應wms/wfs元數據請求的種類。我使用了OpenLayers.Layer.XYZ圖層類型。 – 2011-04-28 04:13:15