?????? 停滯了幾天,沒有看資料了。有個項目的初步設計通過客戶的審查了,現在開始進入詳細設計階段,而且趕得比較急,詳細設計要在下周一就要出來,周二就要去客戶那里進行第一步得確認工作了。精力被耗在這件事情上,很是郁悶,加上年終到了,每天找各個老總去催項目獎金,唉,跟著一起工作得兄弟們整個06年基本都沒有休息,獎金的事情不落實真是很羞愧呀。。。
????? 2007年2月8日,天氣很爛,淋了一場冬天的大雨,身上還沒有熱過來,翻出JTS Topology Suite的資料,繼續我的學習。看著小兄弟Crespo天天在進步,我這個老人也要跟上時代的步伐呀。。。現在做些探路的工作,不然到時候真的是會死得比較慘。。。公司會有一些變動,雖說在年前這個變動來得不是時候,但是該來得總該來,躲不過去得。。。。閑話不多說,學習才是第一位。。。任何時候,即便是在賣身也要記住“繼續挖一米!”。先來說說我個人對JTS Topology Suite的一個初步感覺吧。
?????? JTS Topology Suite從根本上而言其實并不是很復雜,它主要是完成了java對幾何對象、空間拓撲得核心操作算法。個人感覺如果如果把它簡單的認為是一個類似于java.utils.*之類的開發包可能不能真正的體現它的意義,實際上它除了集成了java對幾何對象(點、線、面等)的對象管理外更大一部分工作是在完成對各種幾何對象的buffer、analyze以及空間索引。它盡可能實現了OpenGIS Simple Features Specification規范,所以在于GIS相關的開源世界里如Geotools、Udig等,JTS Topology Suite都得到了大量的應用,甚至可以說沒有JTS Topology Suite的話,Geotools等的實現會很復雜,不對,是相當的復雜。從這些角度而言,我更愿意把JTS Topology Suite看作一個幾何對象中間件。
?????? Note:這個“中間件”名字太長了,下面就只用JTS來代替吧,不過需要聲明一點,本文中的JTS與進行java事務處理的JTS、JTA沒有聯系,本文中JTS就只是指JTS Topology Suite(麻痹ing,居然又敲了一遍)。還有OpenGIS Simple Features Specification就用SFS代替咯:)
?????? 空間數據模型和方法的定義都與SFS規范要求一直;JTS所提供的幾何算法可以支持自定義幾何對象以及自定義的幾何精度,當然,方法的返回值也是與自定義的幾何對象以及幾何精度對應的;JTS對算法的正確性要求永遠放在第一位,而其他的效率之類的問題到是放在了其次的地位,所以說不管是Geotools也好還是GeoServer也好,只要是核心采用了JTS技術,那么就需要自己去搞定效率問題了(呵呵,讓我又有點興趣想去加入這個小組了去搞搞效率問題了,對自己應該提高很快的。不過,呵呵,還是先吧POSTGIS社區的事情弄完,不然真的會什么都弄不好);當然,整個JTS為了能讓更多的人使用,所以結構相當的不錯,借用Crespo小兄弟的一句話就是“相當的優雅”,這又是JTS被廣泛采用的緣由之一吧。(ps:在翻閱JTS代碼過程中發現個問題。SFS使用int的0和1表示判斷條件,而JTS代碼中就是使用的boolean值表示。我自己習慣就是用0和1來表示判斷條件的-雖說我也知道相對而言效率沒有boolean好。。mark一把)
(貌似p話說多了,呵呵,入正題,從JTS的幾何計算開始說起吧)
?????? 對JTS而言所有幾何數字運算都依托于相應的精度格式。而精度格式一般會有這么幾種。Fixed,這種情況下坐標相當于在一個由N個正方形構成的離散固定矩陣上;Floaing,這種情況下計算坐標值必須依靠參數來形成一個正方形構成的矩陣然后進行計算,所以坐標值這個時候并不是一個固定的值,而且會出現對小數點的四舍五入等帶來的誤差;Exact,這個嘛,呵呵,反正我現在幾乎沒有遇到這么高的要求,這種模式要求坐標點是一個分子式來表示(那是相當的精確呀!)。
?????? 目前JTS支持的是Fixed和Floating兩種基本類型,Exact嘛,我覺得貌似沒有必要吧,一般地圖上也不會如此精確呀。其實在實際應用中也基本上不可能使用Exac這種精確的模型,對數據要求過于嚴格往往就會犧牲程序的友好性。這一點實際上是在技術與實用中取得一種平衡的方式。ps:這一點實際上對于其他系統而言也是有效的。而且采用精度過于高的數字模型,實際上就是在給應用帶去麻煩。單純的技術研究畢竟不是目前市場的需求,市場需求程序能與現實要求進行融合。所以我個人覺得JTS在這個方面的取舍實際上是相當有道理的。而同時由于JTS本身也提供了自定義的精度格式,如果真的有對高精度的需求,實際上JTS也是可以提供支持的。
????? 在兩種精度格式可以互相兼容的情況下(舉例而已,比例尺a是比例尺b的一個整數倍),JTS所提供的方式可以支持輸入多種精度格式的參數。這一點實際上我還感受不到作用,呵呵,所以mark一下,以后明白了回過頭來思考滴說。
?????? Fixed格式認為在一個在離散矩陣中所確定的坐標值是精確的。這里所說的矩陣尺寸實際上是由比例尺而確定的。Fixed模型采用Java語言的IEEE-754浮點標準(大概是53比特滴說)。座標是根據以下算法進行計算:
????? jtsPt.x=round( inputPt.x * scale )/scale
????? jtsPt.y=round( inputPt.y * sacle )/scale
?????? Floating格式有單精度何雙精度之分,兩種都基于java中的IEEE-754浮點標準。單精度坐標在單精度數值范圍以內進行四舍五入運算,單精度的目的是為了譬如Java 2D之類的有唯一精確度格式的情況。雙精度類似,精度差別而已。
????? 上面寫的基本上就是JTS的精度格式的分布情況。其實也都只是一些概念,就JTS本身而言,其算法確實是值得研究的一部分,但是看著JTS的代碼,想想我曾經寫的代碼,真的感覺差別相當的大。這些大拿們在技術上給予我們的東西確確實實是需要好好的回味的。快過年了,老婆的爸爸媽媽妹妹都來了,家里太小,俺只能回自己老爹家去了,又要開始武昌-漢口的奔了,更重要的是回去以后基本無法上網了。。嚴重郁悶ing。。不過也算給我一個機會,一個靜心思考的機會,好好學習一下大拿的源碼,體味一下優雅的創作。。。離開一線開發很久了,我也越來越希望能回到過去,回到一線開發的創作中去。
????? 如何通過JTS去構建幾何對象的學習資料還在整理中。。。