QGIS具有强大的编程接口,可让您扩展软件的核心功能以及编写脚本以自动执行任务。QGIS支持流行的Python脚本语言。即使您是初学者,学习一点Python和QGIS编程接口也可以使您的工作效率更高。本教程假定您没有先验的编程知识,并且旨在介绍QGIS(PyQGIS)中的python脚本。
任务概述
我们将加载一个代表所有主要机场的矢量点图层,并使用python脚本创建一个文本文件,其中包含该图层中每个机场的机场名称,机场代码,纬度和经度。
获取数据
我们将使用自然地球的机场数据集。
下载Airports shapefile。
程序
ne_10m_airports.zip
在QGIS浏览器中找到文件,然后将其展开。选择ne_10m_airports.shp
文件并将其拖到画布上。您将看到
ne_10m_airports
QGIS中加载的图层。选择“ 标识”工具,然后单击任意点以检查可用属性。您将看到机场名称及其3位数字代码分别包含在属性
name
和中iata_code
。您可以关闭“识别”窗口。QGIS提供了一个内置控制台,您可以在其中键入python命令并获取结果。该控制台是学习脚本和进行快速数据处理的好方法。转到插件‣Python控制台,打开Python控制台。
您将在QGIS画布的底部看到一个新的面板打开。您会
>>>
在底部看到类似的提示,您可以在其中键入命令。为了与QGIS环境进行交互,我们必须使用iface
变量。要访问QGIS中当前活动的图层,可以输入以下内容,然后按Enter
。该命令获取对当前加载的图层的引用,并将其存储在layer
变量中。
layer = iface.activeLayer()
dir()
在python中有一个方便的函数,可为您显示任何对象的所有可用方法。当您不确定对象可以使用哪些功能时,这很有用。运行以下命令以查看我们可以对该layer
变量执行哪些操作。
dir(layer)
您会看到一长串可用功能。现在,我们将使用一个名为的函数
getFeatures()
,该函数将为您提供对图层所有要素的引用。在我们的案例中,每个要素都是代表机场的点。您可以键入以下命令来迭代当前层中的每个要素。
注意
缩进(或每个语句前的空格数)在Python中非常重要。如果在此步骤中遇到错误,请确保在输入第二行之前添加了2个空格。
由于print(f)语句位于for循环内,因此您需要Enter
在该语句后按两次-一次退出循环-再次执行该命令。
for f in layer.getFeatures():
print(f)
正如您将在输出中看到的那样,每一行都包含对图层中要素的引用。对要素的引用存储在
f
变量中。我们可以使用f
变量来访问每个功能的属性。键入以下内容以打印name
和iata_code
为每个机场功能。
for f in layer.getFeatures():print(f['name'], f['iata_code'])
因此,现在您知道如何以编程方式访问层中每个要素的属性。让我们看看如何访问要素的坐标。可以通过调用
geometry()
函数来访问矢量要素的坐标。此函数返回可存储在变量中的几何对象geom
。您可以asPoint()
在几何对象上运行函数以获取该点的x和y坐标。如果要素是直线或多边形,则可以使用asPolyline()
或asPolygon()
函数。在提示符下键入以下代码,然后按Enter
查看每个要素的x和y坐标。
for f in layer.getFeatures():
geom = f.geometry()print(geom.asPoint())
如果我们只想获取
x
要素的坐标怎么办?您可以x()
在点对象上调用该函数并获取其x坐标。
for f in layer.getFeatures():
geom = f.geometry()
print(geom.asPoint().x())
现在,我们可以将所有零件拼接在一起以生成所需的输出。输入以下代码以打印每个机场要素的名称,iata_code,纬度和经度。在这里,我们使用的
.format()
方法可以在打印多个变量时提供更多控制。该.2f
符号是坐标限制为2位小数。
for f in layer.getFeatures():
geom = f.geometry()print('{},{},{:.2f},{:.2f}'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x()))
您可以在控制台上看到输出。存储输出的更有用的方法是在文件中。您可以键入以下代码来创建文件并将输出写入那里。将文件路径替换为您自己系统上的路径。请注意,我们
\n
在行格式末尾添加。这是在我们为每个功能添加数据后添加换行符。
注意
下面有2级代码块。请确保在代码起始行3中添加4个空格。
with open('/Users/ujaval/Desktop/airports.txt', 'w') as file:for f in layer.getFeatures():
geom = f.geometry()
line = '{},{},{:.2f},{:.2f}\n'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x())file.write(line)
您可以转到指定的输出文件位置,然后打开文本文件。您将看到我们使用python脚本提取的来自机场shapefile的数据。
END
版权声明:本译文仅限技术交流,版权归原作者
点击下方“阅读原文”查看更多