当前位置:   article > 正文

qgis打开shp数据_【PyQGIS】运行和调度QGIS处理作业

qgis如何使用python脚本搜索地名

您可以使用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]

程序

  1. 我们将首先执行手动清理shapefile的过程,以记下将在python脚本中使用的命令。启动QGIS,然后转到“图层‣添加图层‣添加矢量图层”。

    b5092f8e84e5863f527d6f70d47a9ad8.png

  2. 浏览到包含解压缩的shapefile的roads.shp文件夹,然后选择该 文件,然后单击“打开”。

    2d18311ac76f81ddaeb487f6c2eaf2bc.png

  1. 首先,我们必须将道路图层重新投影到“计划的CRS”。这将使我们在进行分析时可以将作为单位而不是度。打开处理‣工具箱。

    522d40a49fd4345f8c7f2bbe72fabc9f.png

  2. 搜索“重新投影图层”工具。双击以启动对话框。

    6a3ec5e757e5e79a99ec2cb09cb66d60.png

  3. 在“重新投影图层”对话框中,选择roads图层作为“ 输入图层”。我们将使用 CRS作为目标CRS。点击运行。EPSG:3460 Fiji 1986 / Fiji Map Grid

    ed5c1e72c806425c1b966f17096e1dba.png

  4. 该过程完成后,您将看到重新投影的图层已加载到QGIS中。转到处理‣历史记录和日志。

    71a90b058fe6b87b11192aa6adb9f70c.png

  5. 在“历史记录和日志”对话框中,展开“算法” 文件夹,然后选择最新条目。您将在底部面板中看到完整的处理命令。注意此命令可在我们的脚本中使用。

    dfbde87e1be06a7e5617075bbf773db1.png

  6. 返回QGIS主窗口,单击右下角的CRS按钮。

    57765453d43e581822ea30cbe8a35511.png

  7. 在项目属性| 在“ CRS”对话框中,选中“ 启用即时CRS转换”并选择作为CRS。这样可以确保原始图层和重新投影的图层正确对齐。EPSG:3460 Fiji 1986 / Fiji Map Grid

    5847fe66480bb26ff9d423c31fd95389.png

  8. 现在我们将运行清洁操作。GRASS具有一组非常强大的拓扑清洁工具。这些可以通过v.clean 算法在QGIS中使用。在“处理工具箱”中搜索此算法, 然后双击以启动对话框。

    a577b3a5f4809ab3bab4239b47f1f324.png

  9. 您可以在“帮助” 选项卡中了解有关各种工具和选项的更多信息。对于本教程,我们将使用该snap工具删除彼此之间1米之内的重复顶点。选择 作为要清洁的图层。选择作为清洁工具。输入“ 阈值”。将其他字段保留为空白,然后单击 “运行”。Reprojected layersnap1.00

    8fe8c467f256540de2c3ca7fee066d0b.png

  10. 处理完成后,您将看到2个新层添加到QGIS。的 是具有校正拓扑错误的层。您还将有一个,它将突出显示已修复的功能。您可以将错误图层用作指导,并放大以查看已删除的顶点。Cleaned vector layerErrors layer

    70fbf42e663a6e8023227ec8d90fd08d.png

  11. 转到处理‣历史记录和日志对话框,并记下完整的处理命令以供以后使用。

    db0ccb036a57def96c04085b7acf5e46.png

  12. 我们现在准备开始编码。有关设置文本编辑器或IDE的说明,请参见“构建Python插件”教程中的“文本编辑器”或“ Python IDE” 部分。为了运行使用QGIS的独立python脚本,我们必须设置各种配置选项。运行独立脚本的一种好方法是通过文件启动它们。该文件将首先设置正确的配置选项,然后调用python脚本。创建一个名为的新文件,然后输入以下文本。根据您的QGIS配置更改值。不要忘记在python脚本的路径中用您自己的用户名替换用户名。如果您通过安装QGIS,则此文件中的路径在您的系统上将相同。将文件保存在桌面上。.batlaunch.batOSGeo4W 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

6d739d857bab0fba72d50631c50295e7.png

  1. 创建一个新的python文件并输入以下代码。将该文件命名为 download_and_clean.py并将其保存在桌面上。

    from qgis.core import *print 'Hello QGIS!'

f044a8ec863011aaa0dfd7819e72d74b.png

  1. 切换到桌面并找到launch.bat图标。双击它以启动一个新的命令窗口并运行脚本。如果在命令窗口中看到已打印,则说明您的配置和设置正常。如果看到错误或看不到文本,请检查 文件并确保所有路径都与系统上的位置匹配。Hello QGIS!launch.bat

    68bd1e0983fd41495d475a931dbde015.png

  2. 返回您的文本编辑器,修改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!'

47b39c6ab7653ebb44e769c4fe8963a3.png

  1. 调用我们从日志中保存的第一个处理命令。这是重新投影图层的命令。将命令粘贴到脚本中,然后添加周围的代码,如下所示。请注意,处理命令将路径返回到输出层作为字典。我们将其存储为 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

6cc3e76a209b7fd0445ae844f70c6256.png

  1. 通过运行脚本launch.bat,您将看到新创建的重新投影图层的路径。

    80463221b0d2b00971d5b09749433feb.png

  2. 现在添加用于清理拓扑的代码。由于这是我们的最终输出,因此我们将输出文件路径添加为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')

78ce9a978449db00333ed8e9938d102c.png

  1. 运行脚本,您将在桌面上看到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

c21779ece0e3988cabe1131f92d98497.png

  1. 运行完成的脚本。每次运行脚本时,都会下载并处理数据的新副本。

    e942ac3004779212107b6c5cfd8c5089.png

  2. 为了每天自动运行此脚本,我们可以在Windows中使用。启动任务计划程序,然后单击 创建基本任务。Task Scheduler

    注意

    Linux和Mac用户可以使用cron作业计划任务。

    6dae08937db74d90f2bc050cde8e1cce.png

  3. 将任务命名为,然后单击下一步。Daily Download and Cleanup

    556809d1049f5af3a981627c10abbdbb.png

  4. 选择Daily作为触发器,然后单击下一步

    782c5eb640af8a7cc31a41d2fb33ee15.png

  5. 根据您的喜好选择一个时间,然后单击“下一步”。

    27581b17d7206ad6950e4ea7a2f3e21c.png

  6. 选择作为操作,然后单击 下一步。Start a program

    5861fefcb066c37cf3af959991cd2f35.png

  7. 单击浏览并找到launch.bat脚本。单击 下一步。

    4a764210d730c3d0fb0705160d388e85.png

  8. 在最后一个屏幕上单击“完成”以安排任务。现在,脚本将在指定的时间自动启动,以每天为您提供干净数据的新副本。

    b160e110e30421609e3567602db5ff0c.png

以下是完整的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'
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/117589
推荐阅读
相关标签
  

闽ICP备14008679号