轉自奔跑的熊貓原文 Web地圖服務、WMS 請求方式、網絡地圖服務(WMS)的三大操做html
GeoServer是OpenGIS Web 服務器規範的 J2EE 實現(geoserver只能用j2ee開發),利用GeoServer 能夠方便的發佈地圖數據。GeoServer的主要特徵包括:兼容 WMS 和 WFS 特性;可以將網絡地圖輸出爲jpeg、gif、png、SVG、KML等格式;可以運行在任何基於 J2EE/Servlet 容器之上。其安裝方式有兩種,一種是常見的.EXE安裝,這種安裝方式最簡單,只要確保你電腦上安裝了JDK而且8080端口是開的,按照安裝步驟一步一步來就能夠完成安裝,安裝完成之後,能夠從開始菜單中選擇GeoServer-> Start GeoServer進行啓動,啓動服務後,打開瀏覽器,輸入http://localhost:8080/geoserver/就能夠查看到GeoServer的歡迎界面了。另外一種安裝是以.WAR的形式安裝,開發者電腦上得先安裝有Tomcat,而後將此WAR導入便可。web
Geoserver是一個功能齊全,遵循OGC開放標準的開源WFS-T和WMS服務器。利用Geoserver能夠把數據做爲maps/images來發布(利用WMS來實現)也能夠直接發佈實際的數據(利用WFS來實現),同時也提供了修改,刪除和新增的功能(利用WFS-T)。 GeoServer, 顧名思義,是一個Server. 它是開源的 ,容許用戶查看和編輯地理數據。GeoServer可以發佈的數據類型:
(1)地圖或影象——應用WMS
(2)實時數據——應用WFS
(3)用戶更新、刪除和編輯的數據——應用WFS-T。編程
GeoServer 是您須要顯示地圖在網頁的那些工具的當中一個,用戶能夠縮放而且移動。能夠與一些客戶端聯合使用,好比: MapBuilder(for web pages), UDig, GVSig,等等。 對標準的使用容許信息從GeoServer 到其它地理信息能夠很容易地被結合。瀏覽器
WMS利用具備地理空間位置信息的數據製做地圖,其中將地圖定義爲地理數據可視的表現,地圖自己並非數據。地圖一般以圖像格式表達,例如PNG,GIF或是JPEG,有時候也表達爲基於矢量圖形,如可縮放矢量圖形(SVG)或是網絡電腦圖形元文件等格式(WebCGM)。根據OGC規範,地圖服務是專門提供共享地圖數據的服務,負責根據客戶程序的請求,提供地圖圖像、指定座標點的要素信息、以及地圖服務的功能說明信息。服務器
WMS規範定義了三個接口(操做):GetCapabilities(獲取服務能力), GetMap(獲取地圖)和GetFeatureInfo(獲取對象信息)。其中GetMap爲核心操做。GetCapabitities返回服務級元數據,它是對服務信息內容和要求參數的一種描述;GetMap返回一個地圖影像,其地理空間參考和大小參數是明肯定義了的;GetFeatureInfo(可選)返回顯示在地圖上的某些特殊要素的信息。這個規範還定義了一個用於調用上述操做的萬維網統一資源定位器(URL)語法和服務級元數據的XML(可擴展標記語言)表達法。網絡
WMS 支持標準 HTTP 中標準的 GET 請求和 POST 請求方式,不過對於 WMS 來講,基本都是基於 GET 方式的服務請求,並且 OGC 官方提供的兼容性測試中也都是基於 GET 方式的請求。架構
OGC網絡服務明確支持的惟一的分佈式計算平臺(DCP)就是是萬維網自己,更明確地說是實現了超文本傳遞協議(HTTP)的網絡主機。所以,每一個由服務實例支持的各操做的在線資源都是一個HTTP的統一資源定位器(URL)。HTTP支持兩個請求方法:GET和POST,一個基本的WMS規範僅僅定義用來調用操做的HTTP GET。URL規範保留了一些特定的字符並賦予它們必要的意義,以下表1:app
表1 HTTP GET查詢中的保留字符分佈式
字符ide |
用 途 |
? |
查詢語句開始的分隔符 |
& |
查詢語句參數之間的分隔符 |
= |
參數名字和參數值之間的分隔符 |
/ |
格式參數值中MIME類型子類型之間的分隔符 |
: |
SRS參數值中命名空間和標識之間的分隔符 |
,
|
清單型參數中單個值的分隔符(例如GETMAP請求中的BBOX,LAYERS和STYLES) |
用於HTTPGET請求的在線資源URL事實上僅僅是一個URL前綴,爲了創建一個有效的操做請求,在其後還添加了另外的參數。URL前綴被定義爲一個不透明的字符串,它包括協議、主機名、端口號(可選)、路徑、和一個問號「?」,還能夠包括一個或幾個用於具體服務器的參數並以「&」結束。
表2總結了操做請求URL的各個構件:
表2 普通OGC網絡服務請求
URL 構件 |
描 述 |
http://host[:port]/path?{name[=value]&} |
服務操做的URL前綴。[ ]表示可選擇0個或1個事件;{}表示0個或更多的事件。前綴徹底取決於服務提供者。 |
name=value& |
由OGC網絡服務定義的一個或更多的標準請求參數的名稱和數值對。對於每一個操做,相應的的OWS規範都規定了請求中使用的必選和可選參數的實際列表。 |
四、網絡地圖服務(WMS)的三大操做
(1)GetCapabilities(必選)
http://localhost:8080/geoserver/wms?service=WMS&request=GetCapabilities( GeoServer )
(瀏覽器會返回提示打開或保存一個文件,個人機器返回的是一個叫「wms」的文件,沒有擴展名。不要緊咱們把它保存爲「wms.xml」就能夠了)
GetCapabilities請求返回的是一個對於WMS服務的一個元數據的描述,其中包括有當前服務提供商的一些基本信息以及當前服務的一些能力,而對於使用WMS服務的客戶端來講,能獲取到的全部信息所有包含在此文檔中,當客戶端發送一個服務中沒有提供的的圖片格式時,此時服務端將沒有能力處理此請求。在使用WMS服務時須要確認當前服務提供的能力,以便在使用過程當中發生一些沒必要要的麻煩。
GetCapabilities 接口用於向客戶端提供當前地圖服務器能夠提供的空間信息類型和範圍、具體的圖層信息和顯示樣式、支持的查詢方式、沒有查詢結果時(異常)的缺省返回信息格式等服務描述信息。
GetCapabilities 請求URL的參數
請求參數 |
必選(M)/可選(O) |
說明 |
VERSION=version(Version ( 版本 )=(1.1.1 或者 1.3.0) ) |
O |
請求版本,URL 中可選的請求參數,當沒有使用時就使用當前服務提供商提供的最高的 wms 版本服務 |
SERVICE=WMS |
M |
服務類型 |
REQUEST=GetCapabilities |
M |
請求名,請求中必須設置當前請求的操做,能夠設置 request 的值爲 Getcapabilities 、 GetMap 、 GetFeatureInfo |
FORMAT=MIME_type |
O |
服務元數據的輸出格式 |
UPDATESEQUENCE=string |
O |
用於控制緩衝存儲的數字序列或字符串 |
(2)GetMap(必選)
GetMap 接口的目的在於請求服務器生成一幅具備肯定地理位置座標範圍的地圖圖像。但按照WMS規範,這個操做須要明確地指定出操做自己遵循的WMS規範的版本號以及須要顯示的具體圖層、對應的座標範圍、返回圖像的大小和格式等。
GetMap請求的參數
請求參數 |
必選的(M)/ |
說 明 |
VERSION=version |
M |
請求版本. |
REQUEST=GetMap |
M |
請求名稱. |
LAYERS=layer_list |
M |
以逗號隔開的一個或多個圖層列表,若存在SLD參數則是可選的。 |
STYLES=style_list |
M |
以逗號隔開的請求圖層的一個再現風格列表,若存在SLD參數則是可選的。 |
CRS=namespace:identifier |
M |
座標參考系。 |
BBOX=minx,miny,maxx,maxy |
M |
以SRS單位表示的邊界框邊角 (左下角,右上角)。 |
WIDTH=output_width |
M |
以像素表示的地圖圖像寬度。. |
HEIGHT=output_height |
M |
以像素表示的地圖圖像高度 |
FORMAT=output_format |
M |
地圖輸出格式。. |
TRANSPARENT=TRUE|FALSE |
O |
地圖背景的透明性 (default=FALSE). |
BGCOLOR=color_value |
O |
以十六進制RGB顏色值表示的背景顏色(default=0xFFFFFF). |
EXCEPTIONS=exception_format |
O |
WMS通告異常的格式 (default=SE_XML). |
TIME=time |
O |
請求層的時間值。 |
ELEVATION=elevation |
O |
請求層的高程。 |
Other sample dimension(s) |
O |
其它適當維度的值。. |
Vendor-specific parameters |
O |
可選的實驗性參數。. |
下列參數只用於支持格式化層描述符規範的網絡地圖服務 [3]. |
||
SLD=styled_layer_descriptor_URL |
O |
格式化層描述符的URL(如同SLD規範中肯定的). |
WFS=web_feature_service_URL |
O |
網絡要素服務URL,該服務提供將要用SLD進行符號化的要素。. |
注:在LAYERS參數值和STYLES參數值之間存在一個一一對應關係
對GetMap的響應:
對有效的GetMap請求的響應必須是一張地圖,它包含了所請求的具備地理參考座標的信息層,使用的是指望的樣式,而且採用了指定的空間參照系、範圍框、大小和透明性。一個無效的GetMap請求必須產生一個按請求的Exceptions格式輸出的錯誤信息(或在極端狀況下回答一個網絡協議錯誤)。
(3)GetFeatureInfo(可選)
GetFeatureInfo是一個可選操做。該操做向WMS的客戶端程序提供了進一步查詢特定空間實體信息的能力。這種操做每每是由客戶程序在WMS服務器先前返回的地圖上指定了一個空間實體,進而提交查詢而造成。支持GetFeatureInfo操做的僅僅是那些定義或繼承了屬性queryable=「1」的層。對於其它層,客戶端不能發送GetFeatureInfo請求。若是一個WMS不支持該請求而遇到了它,則應該應答一個適當格式的服務異常。
GetFeatureInfo請求參數
請求參數 |
必選(M)/ |
描述 |
VERSION=version |
M |
請求版本。 |
REQUEST=GetFeatureInfo |
M |
請求名稱。 |
map request part |
M |
地圖請求參數的部分拷貝,這些參數產生了須要查詢其信息的地圖。 |
QUERY_LAYERS=layer_list |
M |
用逗號分隔的須要查詢的一個或多個層的列單。 |
INFO_FORMAT=output_format |
M |
要素信息的返回格式(MIME 類型)。 |
FEATURE_COUNT=number |
O |
須要返回其信息的要素個數(default=1)。 |
X=pixel_column |
M |
用像素表達的要素的X座標 (以左上角座標爲0)。 |
Y=pixel_row |
M |
用像素表達的要素的Y座標 (以左上角座標爲0)。 |
EXCEPTIONS=exception_format |
O |
WMS報告異常信息採用的格式(default=application/vnd.ogc.se_xml)。 |
五、三大操做的樣例
(1)GetMap請求相似於在Web上請求一幅圖像,但它的請求參數更加複雜。下面是一個樣例請求:
返回的圖像以下圖所示:
>
其中:
http:// —— 使用的網絡協議 webmapping.mgis.psu.edu/ —— 主機域名 geoserver/wms —— 頁面或web程序位置 version=1.1.1 —— WMS版本號 request=getmap —— 操做動詞,能夠爲GetCapabilities, GetMap和GetFeatureInfo等 layers=topp:states —— 請求地圖所包含的圖層名,能夠爲多層 styles=population —— 指定圖層繪製的樣式名 SRS=EPSG:4326 —— 指定地圖的座標投影系統代碼 bbox=-125,24,-67,50 —— 請求地圖的範圍(The Bounding Box) width=400 —— 地圖的像素寬度 height=200 —— 地圖的像素高度,寬度和高度的不一樣設置可能會引發返回圖像的變形 format=image/png —— 返回地圖圖像的格式,能夠爲Image/gif, image/jpg, image/svg+xml等等
若是參數設置錯誤,將返回一個XML文件來描述錯誤信息。以下所示:
<ServiceExceptionReportversion="1.1.1"> <ServiceException code=""> WIDTH and HEIGHT incorrectly specified </ServiceException> < /ServiceExceptionReport>
(2)GetCapabilities請求的樣例以下所示:
http://webmapping.mgis.psu.edu/geoserver/wms?version=1.1.1&request=getcapabilities
返回的是一個XML文件(文件很大,內容略),包括Service、Capability等部分,詳細信息能夠查看返回XML文件。
把這個文檔去頭去尾之後留下兩個節點Service和Capability。 Service包含了有關服務器的通常特性數據,對於只是想直接使用WMS服務器的人來講,這個節點還不太用得上,惟一值得注意的就是KeywordList節點,它裏面是關鍵字,也就是服務器的保留字。 Capability纔是咱們學習的重點。若是你想正確的使用WMS服務器,這個節點裏面的內容就必須搞清楚了。你能夠從這個節點得到以下信息:
1)服務器支持哪些方法,WMS服務器必須支持GetCapabilities和GetMap,此外還有許多擴展的方法。
2)服務器支持哪些返回格式,WMS返回的地圖都是渲染好的圖片,所以這裏的格式基本上都是圖片格式,如image/png。
3)服務器發佈了哪些圖層,這個是WMS的重點,否則你連最簡單的GetMap調用都構造不出來。
(3)GetFeatureInfo用於查詢屏幕某點的對象信息,它的樣例請求以下所示:
此請求返回一個HTML文檔來描述對象,以下所示:
Results forFeatureType 'states':
--------------------------------------------
the_geom = [GEOMETRY(MultiPolygon) with 153 points]
STATE_NAME = Arizona
STATE_FIPS = 04
SUB_REGION = Mtn
STATE_ABBR = AZ
LAND_KM = 294333.462
WATER_KM = 942.772
PERSONS = 3665228.0
FAMILIES = 940106.0
HOUSHOLD = 1368843.0
MALE = 1810691.0
FEMALE = 1854537.0
WORKERS = 1358263.0
DRVALONE = 1178320.0
CARPOOL = 239083.0
PUBTRANS = 32856.0
EMPLOYED = 1603896.0
UNEMPLOY = 123902.0
SERVICE = 455896.0
MANUAL = 185109.0
P_MALE = 0.494
P_FEMALE = 0.506
SAMP_POP = 468178.0
要注意的是不一樣規範版本對上述請求的參數規定不一樣,如WMS1.3對於GetFeatureInfo的X、Y參數要求使用經緯度。因此咱們必須根據服務器的WMS版原本設置咱們的參數。
六、實現一個C#版本的WMS瀏覽器
(1)WmsBrowser需求
1)、用戶輸入WMS服務器的URI,點擊一個按鈕調用GetCapabilities方法。而後用返回的數據初始化控制界面。 用戶在控制界面上能夠查看服務器的各類Capability數據,而且能夠選擇要顯示的圖層,調整圖層順序 ,爲圖層設置參數,而後返回一個地圖圖片顯示在預覽區。
2)、用戶能夠把返回的圖片保存成文件。
已經有許多支持WMS的客戶端了,有許多代碼可供學習和使用。可是,爲了避免干擾視線,爲了不介紹多餘的內容,爲了體現「自主創新精神」,最重要的是爲了體驗編程的樂趣(這也是我當初進入這個行業的緣由),我決定只使用NotNet標準庫提供的類徹底從頭開始編寫代碼。
(2)WmsBrowser設計
根據需求,這是一個WinForm的執行程序。需求其實很不明確,徹底沒有說明最重要的部分,控制界面是什麼樣子的,用戶如何使用它。因此有必要補充一下了。
控制界面有兩個功能:
1)查看GetCapabilities返回的數據;
2)設置GetMap須要的調用參數。
咱們能夠據此來設計這個界面。GetCapabilities返回的數據咱們前面已經介紹過了,想象一下咱們這款軟件的潛在用戶可能想要看到哪些數據,他們會如何使用這些數據。首先確定是服務器發佈的圖層,這是訪問WMS的惟一緣由。至於服務器支持哪些調用應該不是他們關心的,而是咱們開發者關心的。因此咱們須要在界面上顯示出Layer的內容,因爲Layer是嵌套的,天然而然咱們須要一個樹控件。
除了Layer的Name,Title,Abstract這些屬性外,用戶應該還須要知道Layer支持的SRS,Style,Format和BoundingBox。這樣他們才能構造出合理的調用參數。咱們顯然不該該讓用戶查看完數據後手動構造調用參數,咱們須要讓用戶很方便的用鼠標完成工做。咱們已經知道須要一個樹控件來顯示Layer信息。而後咱們須要提供構造調用參數的界面。首先咱們設想用戶可能會如何完成這個工做。
上面的介紹中咱們一直是手動敲入字符串來完成調用URI的構建的,繁瑣並且容易出錯,可是這種方法很靈活,因此應該保留。因而咱們須要一個TexBox來輸入URI。而後咱們須要一個按鈕來發出GetMap請求。咱們必須考慮到,有至關一部分人並不善於鍵盤操做(其中包括我),因此咱們應該給他們提供鼠標操做模式。因而第二個界面出現了,用戶在這裏使用鼠標選擇想要顯示的Layer,調整Layer顯示的順序,選擇每一個Layer的Style,選擇Format,選擇SRS,輸入BoundingBox,輸入返回圖片的尺寸。而後一樣點擊上面提到的按鈕,發出GetMap請求。更進一步,咱們能夠用上面的界面來得到一個基本的調用參數,而後到TextBox裏面去微調,這樣用戶會得到更好的靈活性。
好了,到這裏咱們基本上搞清楚控制界面的樣子了。如今須要討論一點設計風格方面的問題。咱們能夠把全部代碼寫進一個叫MainForm的類裏面,它是一個WinForm類。這樣沒有錯,徹底能夠工做,實際上我見過的大部分代碼都是這麼幹得。這樣作的結果是,我很快就會放棄這個項目,轉而去瀏覽cnblog或ifeng上面的帖子。咱們須要一個更好的設計。咱們在這裏並非要討論架構,模式和開發方法,因此咱們只須要達成一個共識就能夠了: 咱們須要把界面元素,操做響應以及數據模型分開編碼,爲他們單獨創建類體系。
據此咱們的設計也就差很少了,開始編碼咯。
WmsBrowser編碼ing。。。
程序完成。
啓動程序後會看見主界面以下: 下圖是返回的地圖。
這個程序還很稚嫩,有許多問題沒有考慮,例如:輸入驗證,數據驗證,異常處理等。之後咱們會逐步完善它,目前做爲一個參考和學習WMS的起點已經足夠了。
(3)後續
在使用這個程序時,做爲用戶,我以爲還有不少不方便的地方。首先,我若是敲錯了地址,我很容易敲錯,程序會彈出一個醜陋的異常對話框,顯示一大堆堆棧信息,徹底看不出是什麼錯誤。其次,設置參數BBox很不方便,若是能從已有的地圖上用鼠標選擇就行了。還有,返回時只是顯示一個圖片想看細節又要重複設置,Apply,GetMap的操做,太繁瑣了。