停滞了几天,没有看资料了。有个项目的初步设计通过客户的审查了,现在开始进入详细设计阶段,而且赶得比较急,详细设计要在下周一就要出来,周二就要去客户那里进行第一步得确认工作了。精力被耗在这件事情上,很是郁闷,加上年终到了,每天找各个老总去催项目奖金,唉,跟着一起工作得兄弟们整个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去构建几何对象的学习资料还在整理中。。。