文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。html
在第七章裏咱們知道了WebGIS中要素的本質是UIComponent,而矢量圖層的本質是包含了n(n>=0)個UIComponent的Canvas。咱們在UIComponent的graphics中,根據矢量數據畫出矢量的形狀(shape),而且將矢量數據的屬性(attributes)賦予該UIComponent。前端
在接下來進行要素和矢量圖層的設計前,咱們有必要了解這四個問題算法
(1)矢量數據是什麼?sql
(2)矢量數據從何而來?json
(3)矢量數據如何組織的?緩存
(4)矢量數據獲得後如何使用?服務器
在這一章裏,我將着重回答第一、二、3個問題,第四個問題涉及到一些算法知識,咱們將專門在下一章進行講解。app
矢量數據跟通常性數據最大的差異在於矢量數據是包含了空間(geometry)信息的。咱們知道要素是由有序的空間座標鏈接組成,而這個空間信息中便包含了該序列座標。若是geometry爲空,說明此要素不存在。同時矢量數據還包含通常性數據全部的信息,即屬性數據。不過屬性數據並非必須的,只要geometry信息存在,attributes信息沒有,要素也是一樣存在的。框架
我將矢量數據的來源分爲兩種:工具
(1)非向後臺請求得到。
這些數據是已經存在於前臺代碼中,或者由第三方調用者經過參數在前臺調用咱們系統時自己經過參數傳遞進來。
(2)向後臺請求得到。
向後臺請求得到又要分爲兩種:
a.向業務服務器請求得到。
b.向地圖服務器請求得到。
向業務服務器請求得到矢量數據跟通常的請求並無區別,業務服務器只要按照必定的規範,組織好矢量數據,返回便可。本章的重點是向你們介紹後者,如何向地圖服務器請求矢量數據。
在咱們發佈地圖服務時,若是勾選了Mapping(必須勾選),咱們將能發佈一個MapServer服務。固然,咱們的AGS還能發佈多個其餘種類服務,好比NAServer、GeometryServer、FeatureServer、GPServer。其中NAServer能夠用來進行路徑分析,GeometryServer服務中包含了一系列拓撲操做的服務,FeatureServer能夠用來進行要素編輯,GPServer則能夠利用發佈的模型來進行復雜的空間操做。下面兩張圖分別是10.0中發佈的幾種服務,以及Geometry服務中提供的一些功能(在10.1和10.2中Geometry服務的默認地址有變化)。
這一章裏,我主要講的是MapServer中的Query服務。其餘服務在咱們之後的功能設計模塊中,若是涉及,會跟你們再一塊兒探討。
首先MapServer支持兩種請求方式,而且支持一些查詢操做。具體以下:
在MapServer的頁面中,咱們還能夠看到該服務中所包含的圖層的具體信息:
點擊具體圖層,進入該圖層頁面後,能看到該圖層的詳細信息,一樣此頁面中也詳細的描述了能夠支持的操做。以下圖所示:
點擊Query後即可以進入該圖層空間查詢的具體頁面:
在此頁面中,咱們能夠經過對各個查詢參數的設置來獲取想要的查詢結果。
MapServer中圖層提供的查詢服務是隻支持rest樣式的。經過上面的Query截圖咱們能夠知道,Query查詢的參數爲:objectIds、where、geometry、geometryType、spatialRel、outFields、returnGeometry、returnIdsOnly、f、time。
這些參數所表明的實際含義以下:
objectIds:要素的ObjectID號。好比:objectIds=37, 462。
where:查詢條件,支持標準sql中的where寫法。好比:where=POP2000 > 350000。
geometry:geometry中爲要查詢的範圍。其與Geometrytype應保持一致。geometry中,有點、線、面三種寫法。這裏給出接口API中的描述:
geometryType:它的內容與geometry中的內容是對應的,它能夠選擇的值有:esriGeometryPoint 、 esriGeometryMultipoint 、 esriGeometryPolyline 、esriGeometryPolygon 、 esriGeometryEnvelope。
spatialRel:爲空間參考參數。
outFields:爲須要返回的屬性字段。
returnGeometry:是否範圍幾何信息。默認是ture。
returnIdsOnly:是否只範圍ObjectID。默認是false。
f:返回數據的格式。有html、json 、kmz 、 amf。對咱們開發者來講,返回json是最適合的。
time:賦爲一個隨機值便可,設置了此參數,能夠避免查詢讀緩存。
這裏給出一個URL示例的截圖:
注意:我在這裏將where設置爲1=1,此表示可以返回咱們在發佈服務時已經設置好的返回的最大數據個數。默認爲返回1000個數據。outFields設置爲*是返回數據中全部關鍵字段的信息。另外,對於URL還想作進一步瞭解的讀者,能夠參考ArcGIS Server中的API Reference。
咱們在程序中,向AGS服務器發送請求,查詢某個關鍵字段時,即可以仿照這個URL的樣式來進行請求。AGS的Query服務支持GET和POST兩種請求方式。
GeoServer做爲開源的地圖服務工具,因爲其易擴展性、開源性、功能完整性等等優勢,被愈來愈多的實際項目所使用。Geoserver支持OGC中的WMS、WFS等標準,且Geoserver的請求方式一樣支持Rest和Soap兩種協議。GeoServer自己是由Maven進行組織的,內部使用了struts和Spring框架,這裏我跟你們展現一下GeoServer的源碼內部構造,讓你們對GeoServer的本質有個稍微清晰的認識:
如何開發GeoServer並非咱們這個系列的重點,咱們這個系列是跟你們一塊兒探索WebGIS的一些原理知識,設計並實現一些基於原理知識的模型和功能。若是你們對Geoserver有興趣,我將在之後的其餘系列裏和你們一塊兒研究。
Geoserver發佈成功後,即可以登錄、進入以下頁面:
回到正題上,如何用GeoServer來實現如AGS中的Query查詢呢?
查詢圖層信息爲WFS服務中的getFeature服務,其請求方式與標準的WFS請求方式是同樣的。可是,與AGS相比,Geoserver的Query查詢條件編寫是相對複雜的,而且通常有兩種方式。
http://www.someserver.com/wfs?SERVICE=WFS& VERSION=1.1.0& REQUEST=GetFeature& PROPERTYNAME=InWaterA_1M/wkbGeom,InWaterA_1M/tileId& TYPENAME=InWaterA_1M& FILTER=<Filter><Within><PropertyName>InWaterA_1M/wkbGeom<PropertyName> <gml:Envelope><gml:lowerCorner>10,10</gml:lowerCorner> <gml:upperCorner>20 20</gml:upperCorner></gml:Envelope></Within></Filter>
在鏈接到http://www.someserver.com/wfs 後,向其發送下面的XML:
這兩種方式中,Filter均是編寫重點。Filter自己是一種基於XML的而且符合OGC規範的語言。WFS在全部須要定位操做對象的地方都會使用Filter。Filter的做用是構建一個表達式,返回值就是Feature的集合,換句話說Filter就如它的名字通常爲咱們從一個集合中過濾出一個知足咱們要求的子集。而過濾的方法就是Filter定義的操做符。Filter定義了三種操做符:地理操做符(Spatial operators),比較操做符(Comparison operators)和邏輯操做符(Logical operators)。
Spatial operators定義了地理屬性的操做方式,他們有:Equals、Disjoint、Touches、Within、Overlaps、Crosses、Intersects、Contains、Dwithin、Beyond、BBOX。
Comparison operators定義了標量屬性的操做方式,他們有:PropertyIsEqualTo、PropertyIsNotEqualTo、PropertyIsLessThan、PropertyIsGreaterThan、PropertyIsLessThanOrEq、PropertyIsLike、PropertyIsNull、PropertyIsBetween。
Logical operators邏輯操做符,定義了組合這些操做的方式,他們有:And、Or、Not。
在Query編寫中,Geometry參數的編寫也很重要,同時也有必定的難度,他須要咱們對GML語言有必定的瞭解。這裏給出GML的三個例子,分別對應point、box、Polygon:
若是咱們但願前臺直接向Geoserver發送請求,能夠選擇第一種URL方式。若是咱們是經過咱們的業務服務器轉發對Geoserver的請求,建議使用第二種方式。第二種能夠發送的數據量更大,而且易於造成標準請求。
矢量數據自己的組織方式並無規定的格式,能夠視具體的項目而定。不過對於AGS和Geoserver返回的數據,是有固定格式的。這裏咱們分別給出例子。
下圖便爲一個AGS標準的矢量數據格式:
它由attributes和geometry組成。Attributes中包含了查詢獲得的屬性結果,geometry中則包含了查詢所得要素的空間信息。針對不一樣的要素,返回的geometry的組織是各不相同的。Geometry對線和麪分別有paths和rings兩種數據組織格式。
Geoserver中返回的矢量數據組織格式與AGS的差很少,須要注意的是兩點:
(1)表示點、線、面的字段名稱有不一樣之處。在Geoserver中線和麪的字段名分別是:Line、Polygon| MultiPolygon。
(2)返回的座標,相對於AGS中的座標(X,Y),Geoserver中的是相反的,即爲(Y,X)。
在這一章裏,咱們對AGS和Geoserver中的WFS服務進行了詳細的講解。實際項目中,矢量圖層的數據大可能是來源於此服務所返回的數據的。咱們回到我在本章開頭時提出的第四個問題:矢量數據獲得後如何使用?
矢量數據中的Geometry數據爲地理座標數據,咱們在前端表現矢量圖層時,是在要素(UIComponent)中畫出Geometry的形狀,因此這裏就涉及到,如何將獲得的地理座標轉換爲對應的屏幕座標,讓前端的UIComponent上能夠畫出該要素形狀。
在下一章裏我將跟你們一塊兒探討這個問題,下一章:地理座標與屏幕座標的轉換,敬請關注。
--歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS
朋友喜歡讀歷史,但我私下以爲,他這個愛好有點把讀閒書當作幹正事之嫌。緣由主要有以下幾點:
1.所讀的歷史書籍均是私貨太多、通過別人幾層過濾之書,不是作歷史研究該多看之書。
2.每當問起最近作了什麼有意義的事情時,朋友便會說我看了什麼什麼歷史書,卻拈輕怕重的逃避了應該去作的更多更實際的事情。
3.若是真心想研究歷史,朋友應該不僅停留在看書上面。應該還要有多問、多聽、多寫這三個方面。
期待朋友能在歷史方面有更多收穫,小的收穫是豐富生活、增長談資,中等收穫是陶冶情操、學會作人,高等收穫是成一家之言、立百代之學。
有中等收穫,就已是一個了不得的讀史人了。朋友,但願你可以實現。