引子
在开发遥感影像处理系统,或者其他GIS系统的时候,开发者往往都会面临一个选择,就是是基于现有的商业/开源平台开发,还是自己重新从底层开始造轮子。
如果选择从0开始,就又会面临新的问题:
- 怎样选择图形图像库(
GDI
、GDI+
、Direct2D
、OpenGL
等)? - 怎样解码栅格、矢量数据(
GeoTiff
、IMG
、Shapefile
等)? - 怎样解决较大数据量(比如数据量比内存还大)的栅格与矢量文件的快速显示、渲染问题?
- 怎样解决坐标系与投影的问题?
- ……
我本科闲的无聊的时候,写过一个基于OpenGL
和GDAL
的用来显示栅格影像的COM组件。但是只能显示单幅栅格影像,并且不支持矢量(真的很困难)。后来又写过一个基于Direct2D
的Shapefile
浏览器(只能简单显示轮廓)。所以我知道,对于开发者来说,从零开始开发并不是最优选择。基于现有平台/库来开发才是效率最高、性能最优的。
那么,现在新问题又来了,到底是选择那种平台呢?目前而言,比较成熟的商用GIS平台就是:
ESRI ArcGIS
可是它价格不菲,用来进行商业开发是非常不错的选择,如果只是想写写开原算法或者小系统,就显得过于庞大了(需要带一个AE Runtime。现在ESRI推出了基于移动端的ArcGIS Runtime,但由于对栅格数据支持有限,被排除在我们讨论范围了)。所以我们就把目光转向了开源社区,开源社区中最常见的GIS平台有以下两个:
QGIS
(C++
Qt
)SharpMap
(C#
Windows Form
)
在实际中,SharpMap
有着种种bug(对中文路径支持不佳、对WPF支持不佳等,栅格影像渲染速度慢等),所以我们暂时不详细讨论它。
QGIS
QGIS
是一个免费开源的地理信息系统,基于Qt
库,有着完整的栅格矢量数据渲染、空间分析的能力,并且支持多种语言的插件式扩展(C++
、Python
),还完美支持Utf8字符串路径,简直完爆SharpMap
啊。
目前,官方推荐的开发方式,就是在QGIS
里面的Python
控制台中,写Python
代码。官方文档的传送门。
当然我这个系列要讲的,是基于QGIS C++ API
的独立应用程序开发(俗称“基于QGIS的二次开发”),这方面官方文档的传送门在这。当然了,这个文档只有每个类的信息,并没有教大家怎么写基于QGIS
的程序。
这个系列的目的
因为QGIS
官方没有告诉大家(或者说是不推荐),该如何写基于QGIS
的独立应用程序;而国内写的《基于QGIS二次开发》还停留在QGIS 1.x
版本里,并且还在使用VS开发。
所以经过这一年来的探索,我有必要将我学习、实践QGIS
开发的经验分享给大家。
所需基本技能
要想系统地进行QGIS
开发,必须要掌握(或者基本掌握)以下技能:
C++
Qt
- 基本RS、GIS常识
若能掌握以下技术更好:
Git
CMake
、qmake
- 跨平台开发经验
- 基本UI、UE
- 熟悉
Python
开发
注意事项
重要的事情要说三遍:
QGIS
的License是GPL
QGIS
的License是GPL
QGIS
的License是GPL
这就说明,基于QGIS的程序,必须开源。希望大家能够支持知识产权。