赞
踩
您可以使用Python脚本(PyQGIS)和处理框架自动执行QGIS中的许多任务。大多数时候,您会在QGIS打开时手动运行这些脚本。尽管这很有用,但很多时候您需要一种方法来通过命令行运行此作业,而无需打开QGIS。幸运的是,您可以编写使用QGIS库并可以通过命令行运行的独立python脚本。在本教程中,我们将学习如何编写和计划使用QGIS处理框架的作业。
假设我们正在使用区域的shapefile进行一些分析。shapefile每天都会更新,我们始终需要最新的文件。但是在使用这些文件之前,我们需要清理数据。我们可以设置一个QGIS作业来自动执行此过程并每天运行它,以便为您的工作准备最新的清理shapefile。我们将编写一个独立的Python脚本,该脚本每天下载一个shapefile并运行拓扑清理操作。您将学习的其他技能
使用Python下载和解压缩文件。
通过PyQGIS运行任何处理算法。
修复矢量层中的拓扑错误。
Geofabrik提供OpenStreetMap数据集的每日更新shapefile 。
在本练习中,我们将使用斐济的shapefile。下载fiji-latest.shp.zip并将其解压缩到磁盘上的文件夹中。
资料来源[GEOFABRIK]
我们将首先执行手动清理shapefile的过程,以记下将在python脚本中使用的命令。启动QGIS,然后转到“图层‣添加图层‣添加矢量图层”。
浏览到包含解压缩的shapefile的roads.shp
文件夹,然后选择该 文件,然后单击“打开”。
首先,我们必须将道路图层重新投影到“计划的CRS”。这将使我们在进行分析时可以将米作为单位而不是度。打开处理‣工具箱。
搜索“重新投影图层”工具。双击以启动对话框。
在“重新投影图层”对话框中,选择roads
图层作为“ 输入图层”。我们将使用 CRS作为目标CRS。点击运行。EPSG:3460 Fiji 1986 / Fiji Map Grid
该过程完成后,您将看到重新投影的图层已加载到QGIS中。转到处理‣历史记录和日志。
在“历史记录和日志”对话框中,展开“算法” 文件夹,然后选择最新条目。您将在底部面板中看到完整的处理命令。注意此命令可在我们的脚本中使用。
返回QGIS主窗口,单击右下角的CRS按钮。
在项目属性| 在“ CRS”对话框中,选中“ 启用即时CRS转换”并选择作为CRS。这样可以确保原始图层和重新投影的图层正确对齐。EPSG:3460 Fiji 1986 / Fiji Map Grid
现在我们将运行清洁操作。GRASS具有一组非常强大的拓扑清洁工具。这些可以通过v.clean
算法在QGIS中使用。在“处理工具箱”中搜索此算法, 然后双击以启动对话框。
您可以在“帮助” 选项卡中了解有关各种工具和选项的更多信息。对于本教程,我们将使用该snap
工具删除彼此之间1米之内的重复顶点。选择 作为要清洁的图层。选择作为清洁工具。输入“ 阈值”。将其他字段保留为空白,然后单击 “运行”。Reprojected layer
snap
1.00
处理完成后,您将看到2个新层添加到QGIS。的 是具有校正拓扑错误的层。您还将有一个,它将突出显示已修复的功能。您可以将错误图层用作指导,并放大以查看已删除的顶点。Cleaned vector layer
Errors layer
转到处理‣历史记录和日志对话框,并记下完整的处理命令以供以后使用。
我们现在准备开始编码。有关设置文本编辑器或IDE的说明,请参见“构建Python插件”教程中的“文本编辑器”或“ Python IDE” 部分。为了运行使用QGIS的独立python脚本,我们必须设置各种配置选项。运行独立脚本的一种好方法是通过文件启动它们。该文件将首先设置正确的配置选项,然后调用python脚本。创建一个名为的新文件,然后输入以下文本。根据您的QGIS配置更改值。不要忘记在python脚本的路径中用您自己的用户名替换用户名。如果您通过安装QGIS,则此文件中的路径在您的系统上将相同。将文件保存在桌面上。.bat
launch.bat
OSGeo4W Installer
注意
Linux和Mac用户将需要创建一个Shell脚本来设置路径和环境变量。
REM Change OSGEO4W_ROOT to point to the base install folderSET OSGEO4W_ROOT=C:\OSGeo4W64SET QGISNAME=qgisSET QGIS=%OSGEO4W_ROOT%\apps\%QGISNAME%set QGIS_PREFIX_PATH=%QGIS%REM Gdal Setupset GDAL_DATA=%OSGEO4W_ROOT%\share\gdal\REM Python Setupset PATH=%OSGEO4W_ROOT%\bin;%QGIS%\bin;%PATH%SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27set PYTHONPATH=%QGIS%\python;%PYTHONPATH%REM Launch python jobpython c:\Users\Ujaval\Desktop\download_and_clean.pypause
创建一个新的python文件并输入以下代码。将该文件命名为 download_and_clean.py
并将其保存在桌面上。
from qgis.core import *print 'Hello QGIS!'
切换到桌面并找到launch.bat
图标。双击它以启动一个新的命令窗口并运行脚本。如果在命令窗口中看到已打印,则说明您的配置和设置正常。如果看到错误或看不到文本,请检查 文件并确保所有路径都与系统上的位置匹配。Hello QGIS!
launch.bat
返回您的文本编辑器,修改download_and_clean.py
脚本以添加以下代码。这是初始化QGIS的引导代码。如果您在QGIS中运行脚本,则不需要这些。但是由于我们是在QGIS外部运行它,所以我们需要在开始时添加它们。确保用用户名替换用户名。进行这些更改后,保存文件并launch.bat
再次运行。如果看到已打印,那么您都准备将处理逻辑添加到脚本中。Hello QGIS!
import sysfrom qgis.core import *# Initialize QGIS ApplicationQgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True)app = QgsApplication([], True)QgsApplication.initQgis()# Add the path to Processing frameworksys.path.append('c:\\Users\\Ujaval\\.qgis2\\python\\plugins')# Import and initialize Processing frameworkfrom processing.core.Processing import ProcessingProcessing.initialize()import processingprint 'Hello QGIS!'
调用我们从日志中保存的第一个处理命令。这是重新投影图层的命令。将命令粘贴到脚本中,然后添加周围的代码,如下所示。请注意,处理命令将路径返回到输出层作为字典。我们将其存储为 ret
值,并打印到重新投影图层的路径。
roads_shp_path = "C:\\Users\\Ujaval\\Downloads\\fiji-latest.shp\\roads.shp"ret = processing.runalg('qgis:reprojectlayer', roads_shp_path, 'EPSG:3460',None)output = ret['OUTPUT']print output
通过运行脚本launch.bat
,您将看到新创建的重新投影图层的路径。
现在添加用于清理拓扑的代码。由于这是我们的最终输出,因此我们将输出文件路径添加为grass.v.clean
算法的最后2个参数 。如果将这些留空,则将在一个临时目录中创建输出。
processing.runalg("grass:v.clean", output, 1, 1, None, -1, 0.0001, 'C:\\Users\\Ujaval\\Desktop\\clean.shp', 'C:\Users\\Ujaval\\Desktop\\errors.shp')
运行脚本,您将在桌面上看到2个新的shapefile。这样就完成了脚本的处理部分。让我们添加代码以从原始网站下载数据并自动将其解压缩。我们还将把解压缩后的文件的路径存储在一个变量中,以后可以传递给处理算法。为此,我们将需要导入一些其他模块。(有关所有更改的完整脚本,请参见本教程的结尾)
import osimport urllibimport zipfileimport tempfiletemp_dir = tempfile.mkdtemp()download_url = 'http://download.geofabrik.de/australia-oceania/fiji-latest.shp.zip'print 'Downloading file'zip, headers = urllib.urlretrieve(download_url)with zipfile.ZipFile(zip) as zf: files = zf.namelist() for filename in files: if 'roads' in filename: file_path = os.path.join(temp_dir, filename) f = open(file_path, 'wb') f.write(zf.read(filename)) f.close() if filename == 'roads.shp': roads_shp_path = file_path
运行完成的脚本。每次运行脚本时,都会下载并处理数据的新副本。
为了每天自动运行此脚本,我们可以在Windows中使用。启动任务计划程序,然后单击 创建基本任务。Task Scheduler
注意
Linux和Mac用户可以使用cron作业计划任务。
将任务命名为,然后单击下一步。Daily Download and Cleanup
选择Daily
作为触发器,然后单击下一步
根据您的喜好选择一个时间,然后单击“下一步”。
选择作为操作,然后单击 下一步。Start a program
单击浏览并找到launch.bat
脚本。单击 下一步。
在最后一个屏幕上单击“完成”以安排任务。现在,脚本将在指定的时间自动启动,以每天为您提供干净数据的新副本。
以下是完整的download_and_clean.py
脚本供您参考。
import sysfrom qgis.core import *import osimport urllibimport zipfileimport tempfile# Initialize QGIS ApplicationQgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True)app = QgsApplication([], True)QgsApplication.initQgis()# Add the path to Processing framework sys.path.append('c:\\Users\\Ujaval\\.qgis2\\python\\plugins')# Import and initialize Processing frameworkfrom processing.core.Processing import ProcessingProcessing.initialize()import processing# Download and unzip the latest shapefiletemp_dir = tempfile.mkdtemp()download_url = 'http://download.geofabrik.de/australia-oceania/fiji-latest.shp.zip'print 'Downloading file'zip, headers = urllib.urlretrieve(download_url)with zipfile.ZipFile(zip) as zf: files = zf.namelist() for filename in files: if 'roads' in filename: file_path = os.path.join(temp_dir, filename) f = open(file_path, 'wb') f.write(zf.read(filename)) f.close() if filename == 'roads.shp': roads_shp_path = file_pathprint 'Downloaded file to %s' % roads_shp_path# Reproject the Roads layerprint 'Reprojecting the roads layer'ret = processing.runalg('qgis:reprojectlayer', roads_shp_path, 'EPSG:3460', None)output = ret['OUTPUT']# Clean the Roads layerprint 'Cleaning the roads layer'processing.runalg("grass:v.clean", output, 1, 1, None, -1, 0.0001, 'C:\\Users\\Ujaval\\Desktop\\clean.shp', 'C:\Users\\Ujaval\\Desktop\\errors.shp')print 'Success'
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。