使用Python制作qgis插件总结

来源:互联网 发布:成本管控流程优化 编辑:程序博客网 时间:2024/04/26 00:40

使用Python制作qgis插件总结

前段时间由于工作需要,学习使用Python为qgis制作一个插件,现在把制作插件期间遇到的问题和解决方法记录下来,以方便自己和其他朋友.

0. qgis的layer,feature和geometry简要介绍

  • qgis中layer,feature,geometry的关系

1. 逻辑功能实现

  • 如何获取图层(layer)
  • 如何获取感兴趣的feature
  • 如何创建新的layer
  • 如何创建新的feature并添加到layer
  • 如何给feature和layer添加属性(attribute)
  • 如何将新建的layer保存到文件

2. 制作和使用插件

  • 制作插件需要哪些文件
  • 如何快速制作插件
  • 如何安装和使用插件

0. qgis的layer,feature和geometry简要介绍

0.1 qgis中layer,feature,geometry的关系

在qgis中,python可以通过调用iface这个入口访问各个对象,实现相关操作.如,使用iface.mapcanvas().layers()获取当前打开的图层信息.其中,一个layer中包含若干feature对象,就如一张表包含若干条记录一样.geometry就如记录中的一个字段.

qgis中有三种layer对象,分别为pluginlayer,rasterlayer和vectorlayer.因为工作使用的原因,在本例中使用vectorlayer.这里写图片描述

//先给feature&geometry的介绍占个位O(∩_∩)O哈哈~

1. 逻辑功能实现

1.1 如何获取图层(layer)

如在0.1中讲到,可以使用iface.mapcanvas().layers()获取当前项目中加载的全部图层,然后通过过滤图层名(layer.name)来获取感兴趣的图层,代码如下:

    mapCanvas = iface.mapCanvas()    layers = mapCanvas.layers()    for layer in layers:        if layer.name() == 'point':             layer_point = layer        if layer.name() == 'line':            layer_line = layer                    if layer.name() == 'area':            layer_area = layer

1.2 如何获取感兴趣的feature

在上步获取到的layer中,可以使用getFeatures()方法获取layer中的feature对象,然后通过属性(attribute)过滤到自己想要的feature,如下:

for feature in layer_point.getFeatures():    _Attri = feature.attribute('attri1')        _Other = feature.attribute('attri2')    if  _Attri == SomeThing:        x = feature.geometry().asPoint().x()        y = feature.geometry().asPoint().y()        ......(do something you want)

1.3 如何创建新的layer

笔者做这个插件的时候,需要将原有图层的部分feature取出来放到一个新图层并保存到文件中,所以需要先在内存中创建一个图层对象来保存这些feature,然后保存到硬盘.

创建图层对象时,可以使用QgsVectorLayer()方法.使用这个方法需要三个参数,这里只说下创建memory layer的参数.第一个参数来指定layer包含的geometry类型,点的geometry使用’Point’,线的使用’LineString’,面的使用’Polygon’.第二个参数来指定图层名,第三个参数使用’memory’,如下:

# create memory layerlineVecLayer = QgsVectorLayer("LineString", "line_layer", "memory")lineProvider = lineVecLayer.dataProvider()pointVecLayer = QgsVectorLayer("Point", "point_layer", "memory")pointProvider = pointVecLayer.dataProvider()

1.4 如何创建新的feature并添加到layer

创建feature对象,可以使用QgsFeature()方法.笔者的插件要将四个点组成一个线状geometry并保存.需要把线状geometry数据添加到feature对象.将feature添加到layer时,需要将layer设置为可编辑状态,并使用layer的dataProvider,编辑结束后要commit使编辑生效.代码如下:

lineVecLayer.startEditing()linefeatures = []points = [QgsPoint(x,y),QgsPoint(x1,y1),QgsPoint(x2,y2),QgsPoint(x3,y3)]line_feature = QgsFeature()line_feature.setGeometry(QgsGeometry().fromPolyline(points))linefeatures.append(line_feature)lineProvider.addFeatures(linefeatures)lineVecLayer.commitChanges()

1.5 如何给feature和layer添加属性(attribute)

为了方便之后在qgis中使用,可以给1.3中新建的layer添加一些属性.就像数据库新建表一样,创建一张表要有表结构.给layer添加完属性后,还要给feature的相应属性添加值,就如给表中某条记录的字段赋值.此时,需要使用layer的dataProvider来操作,生成feature对象的方法也要修改下,1.4中的代码需要修改如下:

# add fieldslineProvider.addAttributes( [ QgsField("attri1", QVariant.Int),QgsField("attri2",  QVariant.Int),QgsField("attri3", QVariant.Int)] )lineVecLayer.startEditing()linefeatures = []points = [QgsPoint(x,y),QgsPoint(x1,y1),QgsPoint(x2,y2),QgsPoint(x3,y3)]line_feature = QgsFeature(lineVecLayer.pendingFields())line_feature.setGeometry(QgsGeometry().fromPolyline(points)line_feature.setAttributes([1, 2, 3])#line_feature['attri1'] = 1#line_feature['attri2'] = 2#line_feature['attri3'] = 3linefeatures.append(line_feature)lineProvider.addFeatures(linefeatures)lineVecLayer.commitChanges()

2. 制作和使用插件

2.1 制作插件需要哪些文件

制作插件的时候,笔者参考了qgis官方文档和其他网友的博客.其中插件所需文件在官方文档中有清晰描述,截图如下:

plugin files
- _init_.py,是插件调用的起点,一般例如版本号、插件名、插件主类等信息会在这里面定义
- mainPlugin.py,插件主体啦,所有的插件操作都必须在这里完成,也是写代码最多的部分
- metadata.txt,QGIS>=1.8.0版本要求提供,是插件元数据,描述了插件的基本信息,如版本号,插件名和其他一些插件网址,框架信息等。在_init_.py文件中会用到,用来获取上述插件相关信息。然而从QGIS2.0开始,所有的插件元数据信息只能在metadata.txt中设置了,在_init_.py中的设置将被视为无效.笔者使用官方文档提供的plugin creator生成的插件中,无metadata.txt在2.12版qgis中插件不能直接安装

这些文档需要放置在qgis的python插件目录,win7系统为’C:\Users\用户名.qgis2\python\plugins’,某些情况下会没有plugins目录,需要手动创建,详情可以参考官方文档

2.2 如何快速制作插件

制作插件需要好几个文件,没必要一个一个自己创建.官方文档中给了两个快速制作插件的方法,一个是在线插件生成器(http://www.dimitrisk.gr/qgis/creator/),一个是插件构建器(http://geoapt.net/pluginbuilder/).

在线生成:

在线插件生成

插件构建器:

插件构建器

笔者使用的qgis版本为2.12和2.18,使用在线插件生成器时,没有生成metadata.txt,而这个文件在2.0以上是必须的,所以要手动根据文档和_init_.py文件生成metadata.txt.另,在生成的文件中有一个是以插件名命名的.py文件,在此文件的run()方法内实现逻辑功能

2.3 如何安装和使用插件

创建完metadata.txt和添加了逻辑代码后,在qgis中点击菜单栏中的’plugins’–>’Manage and Install Plugins…’此时会弹出一个获取在线插件列表的对话框,点击’abort fetching’(我们要安装本地插件,不需要获取远程列表),然后在搜索框里输入自己的插件名,选中并安装(注意:安装时会对脚本进行编译,可能会报错,报错了就debug吧).截图如下:

这里写图片描述
这里写图片描述
这里写图片描述

至此使用Python制作qgis插件介绍完毕.本文档是笔者根据工作时的使用情况进行的总结,可能有所遗漏和错误,欢迎大家多提意见和建议.

参考资料

[1] http://qgis.org/api/2.6/classQgisInterface.html
[2] http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/intro.html
[3] http://gis.stackexchange.com/questions/
原创粉丝点击