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