由于其他项目的原因,对于QGis的研究耽搁了一段时间,现在重新拾起,开始Qgis之旅。一下的研究仅是个人兴趣,Qgis对我来说也刚起步,Qt的学习也是同步进行中。QGis 二维图形引擎(暂且这样叫吧)采用了QT中QGraphicsScene、QGraphicsView、QGraphicsItem作为画图类,进行了扩充,构成了Qgis基本画图框架。这里首先介绍一下QgsGeometry
1. QgsGeometry,是Qgis中数据类,这个类设计有独特之处,并没有参照数据类型进行派生出点、线、多边形等数据结构,这些也与QGis是个二维图形系统有关系,而是采用了更为灵活的“有需求有转换”的方式,简化了类代码。好处也是显而易见,当然是以牺牲效率做为代价。这个类功能比较强大,查看接口函数,除了支持数据IO接口外,还支持多边形的布尔运算等操作。
2.
QgsSymbolV2 主要存储点、线、面的渲染状体,负责组织渲染流程,主要的渲染任务则交给了QgsSymbolLayerV2。
QgsMarkerSymbolV2、QgsLineSymbolV2、QgsFillSymbolV2分别对应着相应的子类点、线、面。在基类构造函数已经声明为保护,只能通过defaultSymbol来生成新的对象。而QgsSymbolV2的构造函数则对需要渲染的对象进行了一次过滤,排除了自身不能渲染的层,这一点如果要渲染多图元结构的层可能需要改变(从源码角度来看,当然本人并未读完整个板块)。
3. Qgs中坐标及投影问题。初学二维绘图可能还对坐标转化不是很理解。逻辑坐标与设备坐标的区别。如果这些还没有完全理解的话,请参照win32程序设计,里面讲的比较清楚。有一点需要注意就是设备坐标可能是像素,也可能是MM或者其他单位,这些单位有各自的使用范围。一般来说空间坐标经过换算都会转换到设备坐标进行屏幕显示,这时采用的应该是像素。而在打印出图时,应该设置为实际刻度坐标,一般是MM,具体的没有深入去看。Qgs的坐标问题也是分了两块进行,第一个是QgsMapToPixel这个主要是用来做逻辑坐标与屏幕坐标转换的,第二个是qgsCoordinateTransform,这个类主要封装了一下投影转换与逆转,它采用的GDAL中的Proj4中的一些算法进行实现。
4. 渲染问题。Qgs发展的时间比较长,现在的渲染系统保留了两套系统,想对于GDI与GDI+来说,这个概念也不知道是否确切,个人理解这样吧。开始的时候感觉比较混乱,其实想清楚GDi与GDI+的区别,应该说对于QGis为什么会这个样子,也就坦然了。从论坛上看到QGis2.0后,打算将两者统一,到时候应该结构比较清晰了.