基于QGIS的开源GIS二次开发技术探究
2017-12-20黄善春
摘要:由于以往的各种商业地理信息系统软件平台定义了不同的数据格式和数据组织方式,且其开发模式各不相同又相互独立与封闭,以及常规商业GIS软件的高费用在一定程度上限制了地理信息系统开发的大众化发展。本文介绍基于开源软件QGIS源码在WINDOWS系统下编译并进行二次开发的基本过程与方法,并给出地图浏览与查询系统开发实例,希望对相关的GIS系统开发者有一定的指导和借鉴作用。
关键词:GIS QGIS 源码编译 二次开发
中图分类号:P208
一、QGIS概述
GIS是目前IT领域的热门话题,随着Google earth等GIS系统的流行逐渐被越来越多的人所熟知。地理信息系统(GIS)是一个用于采集、存储、处理、管理、分析、显示和应用地理空间信息及其属性数据的计算机系统,现已广泛地应用于环境监测、灾害分析预警与监测、国土资源及人口调查、城市规划等诸多领域。在计算机技术和全球信息网络技术飞速发展的大环境下,GIS软件技术体系迅猛发展。除了传统的商业GIS软件平台外,众多开源GIS也在为地理信息系统默默贡献自己的力量。QGIS是基于跨平台的QT软件,采用C++语言开发的桌面地理信息系统,因而其具有良好的跨平台性,广泛支持Linux、Windows、Unix和Mac OSX等操作系统,这是其他诸多商业GIS软件所不能企及的。最为重要的是QGIS为我们封装了二次开发的API库,通过引用各个类库中的接口并配合动态库的使用,可以方便地实现GIS功能,这使得开发者能够将精力集中到解决应用程序中的业务逻辑中,而不是从头开始开发GIS基本功能,方便开发者开发自己的GIS软件[1]。
二QGIS的编译及环境搭建
QGIS源码及各种第三方依赖库有不同的版本,开发者可基于自己的开发环境选择不同的开发版本,本文介绍WIN10+QGIS2.8.9+VS2010+CMAKE3.2.3的编译方法,其他版本与之类似。
(1)编译所需要的工具及源码:VS2010、qt-opensource-x86-vs2010-4.8.7、qt-vs-addin-1.1.11-opensource、OsGeo4W、CMAKE3.2.3、flex、bison和QGIS2.8.9源碼。
(2)安装好工具之后,使用OsGeo4W下载安装编译所需的第三方库,需要安装的有:-expat、-fcgi、-gdal、-grass、-gsl-devel、-iconv、-pyqt4、-qt4-deve、-qwt-devel-qt4、-qwt-libs-qt4、-sip、-spatialite、-libspatialindex-devel、-Python-qscintilla、-qgis-ltr-common、-qgis-common。OsGeo4W包含了许多第三方库文件,我们在安装时只需要选择所需的库文件进行下载安装,完全装好后提示重启电脑,将下载安装的库文件加入环境变量后即可进行源码的编译。
(3)使用cmake打开源码文件夹,将CMakeLists.txt拖入cmake中点击configure开始编译,编译可能会出现大量红色警告,这里的错误大多是路径问题,如果出现了错误,必须进行修改否则之后的编译将不能通过,我们只需将库文件的路径修改为自己安装好的路径,即可正确编译。
(4)在cmake编译没有出错的情况下,会在build文件夹下生成sln解决方案,使用VS2010打开源码即可编译生成,进行二次开发我们只需生成以下8个项目即可进行开发:ui、qgis_core、qgis_analysis、qgis_gui、qgis_app、qgis、ogrprovider、gdalprovider。编译生成一系列的动态库lib文件,开发者即可使用QGIS的lib库文件配合include头文件和bin动态链接库文件进行二次开发。
三、QGIS开发实例
3.1 显示数据
使用VS新建qt application,配置开发环境属性,注意加载xml模块,然后借助于QGIS开发文档等相关资料即可进行代码的编写。QGIS提供了地图画布类mapcanvas能实现数据视图,借助QgsVectorLayer、QgsRaster、addMapLayer、setExtent、setLayerSet、setVisible等API函数即可实现矢量与栅格数据图层的加载与显示。除了显示数据外,我们通过在类中使用initLayerTreeView、createContextMenu、setMapTool、panMode、ZoomInMode、ZoomOutMode、ZoomFullMode等一系列API函数实现图层管理器和视图窗口的漫游缩放等基本地图操作与显示功能。
3.2 属性数据的查看
属性表是开发一个GIS系统必备的功能,通过属性表用户能够进行空间分析、查询等操作,正是因为GIS矢量数据包含各种属性信息,才使得GIS矢量图形与普通的图形具有本质的区别。QGIS中提供了以下几个与属性表相关的类:
QgsVectorLayerCache、QgsEditorWidgetRegistry、QgsAttributeTableView、QgsAttributeTableModel。其中后两个类是按照Qt的MVC架构来创建的。Model用来存储数据,而View则是向用户显示的视口。
3.3栅格图像的增强显示
对于栅格图像的增强显示及操作,是一个GIS软件的基本功能。QGIS依赖于GDAL插件库能够实现显示多种格式的栅格影像,如常见的遥感图像格式ENVI Image、GeoTIF等。QGIS的二次开发API中同样提供了调整栅格图像对比度、亮度以及拉伸增强显示等基本功能接口。通过setContentrastEnhancement函数实现对比度和亮度的控制,QGIS中通过QgsBrightnessContrastFilter类对象来控制栅格图像亮度和对比度,只需在类中定义这样一个对象,即可通过函数实现栅格图像的增强显示。
四、结语
不同于传统的商业GIS平台软件,开源GIS软件无需担心数据格式兼容、软件开发使用成本等问题,开发者能够将精力集中于应用软件的业务模块开发而无需从GIS基本操作入手[5]。因此,开源GIS软件功能很普遍很强,技术也非常先进,因为其背后是来自众多技术狂热者和学院研究者的大力支持。QGIS以其拥有的几十个核心插件和大量的外部扩展插件以及它跨平台的优良特性,为各个领域的地理信息应用提供开发平台[6]。本文通过对开源QGIS源码的编译及二次开发方法的研究,为开发人员提供了QGIS开发的技术路线。开发者可根据不同的需求来进行二次开发和插件的开发,并能编写相应的接口,为自己的GIS应用软件服务。
参考文献:
[1]邓欣,宁芊.基于开源的分布式山洪监测数据系统设计[J].计算机测量与控制,2016,24(10):54-56.DOI:10.16526/j.cnki.11-4762/tp.2016.10.016.
[2]朱浩.开源GIS支持下的灾害风险区划分析研究[D].中国石油大学(华东),2012.[2017-10-13].
作者简介:
黄善春(1997.01-)男,汉族,身份证号:411524199701051473,本科生,河南信阳,研究方向:地理信息科学