GIS是怎樣建成的系列之一:從圖形開始

       從進入大學稀裏糊塗與GIS結緣已經有六年了,回首這些年與GIS的關係有如戀人,曾經自以爲了解它,GIS原理從本科到研究生學了兩遍,學過的專業課不下十門,ArcGIS從應用到開發,從Engine到Server甚至silverlight、flex等富客戶端API,涉獵也算廣泛了吧。然而,去年接觸了第一個開源GIS的sharpmap忽然發現其實GIS也可以是這樣的。就如某朋友談到女孩子之後,說女孩子啊,當你瞭解到某一個階段,忽然就會發現完全不瞭解她了,當時就是這種感覺。從這之後,一個原來不太願意想的問題出現在眼前,GIS是怎樣建成的?不是二次開發的幾個API,也不是所有GIS原理書本那些只爲了考試背誦的大段文字。從今天起,小菜鳥從NetTopologySuite幾何圖形庫開始來學習建立一個GIS系統是如何建成的。

       上帝創世的時候首先創造的天地,天地構造了世界的基礎。那麼什麼是GIS中的天地?小菜鳥覺着是圖形。地圖和對地圖一切的操作其基礎就是一個個圖形。那麼什麼是圖形呢?從傳統認識的是點、線、面、體。但這還不夠具體,好在相比當年上帝相比現在的上帝們已經有了一個使用指南OpenGIS標準,它定義了一系列GIS的規範,其中就包括了GeoAPI——一組GIS的Java接口。NetTopologySuite也不例外,它使用的是GeoAPI的.Net版本中的Geometries圖形定義問題。好吧,那讓我們試着看看上帝該怎麼實現這些東西。

       首先具體化的圖形都存在一個問題——座標問題。所以上帝說得有座標,於是便有了座標的接口ICoordinate,包括X,Y,Z座標,這應該是一個座標最基本的東西吧。在此基礎上座標之間還有距離和比較,也就是Distance和Equal(按照需求分爲Equal2D和Equal3D)。有了座標之後我們就有了構建圖形的原子了,那麼原子怎麼構成更大粒度的元素的。定義一個IGeometry接口。好了,定義了圖形的總接口我們可以玩我們想的點(定義IPuntal)、線(定義曲線ICurve,二維線Ilinear)、面(定義IPoliygonal,ISurface)了。爲了區分維度,定義Demension來區分。在此基礎上我們就有了IPoint(具體點),IPolygon(具體多邊形,包括輪廓和內部島嶼),ILineString(多線),ILineRing(帶有方向的多線)等。

      定義了單體的圖形到這裏就基本定義完成了, 那麼開始定義其集合IGeomertyCollection,然後對應定義多點(IMutiPoint),多線(IMutiPoint,IMultiLineString),多面(IMutiCurve,IMultiSuface)。這就出了一個問題,作爲一個集合性操作,定義一個IGeomertyCollection是不是已經足夠了呢?就圖形本身來看其似乎作用並不大,但就我的理解這類數據結構的作用是當圖形(Geometry)變成了要素(Feature)時候,這時候空間和屬性一一對應,這樣用多點,多線,多面這樣的數據結構就可以方便表示一些同質的圖形。其圖形定義部分基本如下圖所示。

 

          當然,這夠了嗎?這些東西我們可能會從文件中直接讀取,或者創建中有一定的要求,比如閉合、座標不重複。學過設計模式的話,你會想到一個東西,那就是工廠,創建一個GeometryFactory,從此我們的所有對象就是靠Factory創造。還有一個非常重要的結構Envelope,相信學習GIS的朋友不會陌生吧,翻譯過來叫包絡線,說白了,就是所有圖形的一個矩形外框,用處很大了,以後我們會慢慢了解它的魅力。在NetTopologySuite裏面,這些接口基本上做了簡單實現。好了,這樣似乎關於圖形的東西就基本搭出來了,當然這不是圖形的全部,還有一些東西如精度模型,位置關係,關係矩陣以後會陸續出現,還有個別如ordinate縱座標?小程序猿自己也是一知半解,歡迎拍磚,一起學習進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章