3.5. 演练:使用QGIS和OGR剪裁和投影矢量数据

本演练将首先为您提供一些使用QGIS的GUI环境剪裁和投影某些矢量数据的经验。然后,您将学习如何使用OGR命令行实用程序执行相同的操作。命令行实用程序的优点是,您可以轻松地在循环中运行它来处理整个数据文件夹。

该项目介绍了宾夕法尼亚州费城的一些数据,我们将在接下来的几课中使用这些数据。其中大多数是我从OpenStreetMap下载并提取的简单底图图层。但是,城市边界是费城的官方文件,我从`PASDA <http://www.pasda.psu.edu/>`_下载。

Download the Lesson 3 vector data

3.5.1. 用QGIS裁剪和投影数据

  1. 将数据集提取到一个简单的路径,如C:\data\ PhiladelphiaBaseLayers。

  2. 打开文件夹并浏览一下。您将看到一堆可以添加到QGIS并检查的shapefile。另外,请注意,我已经创建了三个文件夹来准备我们的练习:clipFeature、clipped和clippendprojected。

  3. 这些数据集使用地理坐标系,覆盖大费城地区。我们的处理任务是将它们剪辑到费城城市边界,然后将它们投影到流行的在线网络地图(如Google、Bing、Esri等)使用的修改后的墨卡托坐标系中。

  4. 首先,我们将使用QGIS剪裁和投影数据集。这是处理单个数据集的简单方法,尤其是在首次使用工具时。

  5. 启动QGIS并将fuel.shp和clipFeature/city_limits.shp添加到地图中。

  6. 单击矢量>地理处理工具>剪辑。

  7. 将“输入向量”层设置为“燃料”,将“剪辑”层设置为“城市限制”。将要保存在子文件夹中的输出shapefile设置为clipped/fuel.shp,如下所示。你需要点击...按钮,然后选择保存到文件...并选择.SHP作为输出格式。

../../_images/qgis34_693_1.PNG

图3.5剪辑工具图形用户界面

  1. 选中将结果添加到canvas的复选框(“运行算法后打开输出文件”),以便可以验证您的工作。然后单击“运行”。新的图层应该只包含费城边界内的特征。

../../_images/qgis34_693_2.PNG

图3.6夹子工具结果

现在,让我们投影这个数据集。在QGIS中,可以通过保存一个新图层来完成此操作。

  1. 在目录中,右键单击剪裁的燃料数据集(不是原始数据集!)然后单击“导出”->“功能另存为…”.... 确保“格式”框设置为ESRI Shapefile。

  2. 在提示您放置路径的“文件名”框旁边,单击...按钮并将输出数据集的路径设置为clipped和projected/fuel.shp。

  3. 在 CRS框旁边,单击右侧的“选择CRS”按钮。在这里您将指定输出投影。好东西是您可以搜索。

  4. 在“过滤器”框中,键入pseudo并选择WGS 84/pseudo Mercator(EPSG:3857)(而不是EPSG:6871)。然后单击OK。

../../_images/essen_fig_3_7.png

图3.7 QGIS坐标参考系对话框

这个投影有很多名字,我们将在其他课程中介绍它的更多历史。现在,请记住,您可以使用它的EPSG代码(应该是3857)来识别它。(大多数投影都有EPSG代码来克服命名冲突和混淆)。

  1. 单击OK保存投影图层。验证它是否有效的一个好方法是启动一个新的map项目并添加它。

  2. 在QGIS中创建一个新的地图项目(不需要保存旧的地图项目)并添加clippeddandprojected/fuel.shp文件。功能的布局应该类似于您在下面看到的内容。(我在上面放了一个SVG标记符号,就像第1课一样,只是为了好玩。)

../../_images/qgis34_693_4.PNG

图3.8显示更新地图投影的QGIS布局示例

在QGIS中,就像在ArcMap中一样,添加到地图的第一个图层决定投影。注意右下角的EPSG代码是3857,证明我的数据确实是投影的。如果您将我们的任何其他图层添加到此地图中,请确保在为此原因添加燃料层之后添加它们。

3.5.2. 使用OGR命令行实用程序剪裁和投影数据

这很简单,但如果一次要对多个数据集执行此操作,则会非常乏味、耗时,而且可能容易出错。让我们看看如何使用OGR命令行实用程序以自动化的方式执行此操作。请记住,OGR是GDAL库中与向量数据有关的子集。

安装QGIS时,还可以从命令行获得一些可执行程序,这些程序可以运行GDAL和OGR函数。最简单的方法开始使用这些是使用OSGeo4W快捷方式,出现在你的桌面后,你安装了QGIS。

  1. 双击桌面上的OSGeo4W快捷方式。如果没有快捷方式,请尝试“开始”->“所有程序”->“QGIS”->“OSGeo4W Shell”,或者只搜索OSGeo4W。

    您应该只看到一个黑色的命令窗口,可能会显示设置GDAL和OGR的一些进度输出。

    我们将首先遍历用于处理一个数据集的命令,然后研究如何遍历文件夹中的所有文件。对于这两个任务,我们将使用一个名为ogr2ogr的实用程序。此实用程序处理输入向量数据集,并返回一个新的输出数据集(因此,名称)。您将使用它进行剪切和投影。

    OGR实际上允许您在单个命令中执行剪辑和项目,但是,根据文档,投影首先发生。为了简单和性能起见,让我们将剪辑和投影作为单独的操作来进行。我们先做剪辑,这样就不会投影不必要的数据。

  2. 看一看OGR2OGR的文档,看看您是否能破译它是如何使用的。运行此实用程序时,首先提供一些可选参数,然后提供一些必需参数。第一个必需参数是输出数据集的名称。第二个必需参数是输入数据集的名称。这些是非常基本的必需参数,因此使用ogr2ogr的很多技巧是根据您想要做的事情正确设置可选参数。

  3. 在OSGeo4W窗口中键入以下命令,确保用自己的路径替换路径。

ogr2ogr -skipfailures -clipsrc c:\data\PhiladelphiaBaseLayers\clipFeature\city_limits.shp c:\data\PhiladelphiaBaseLayers\clipped\roads.shp c:\data\PhiladelphiaBaseLayers\roads.shp

  1. 等待几分钟,命令才能运行。您会知道它已经完成了,因为您将返回命令提示符(例如C:>)。如果失败,请按向上箭头键,您的原始命令将重新出现。检查一下是否打错了。

  2. 在QGIS中打开一个新地图并添加clippedroads.shp以验证道路是否已剪裁到费城城市界限。

../../_images/qgis34_693_5.PNG

图3.9费城道路QGIS地图布局示例

仔细查看您在命令中提供的参数。您将注意到两个可选参数:-skipfailures(它确实执行了它所说的操作,并且当您可以获得奇怪的拓扑事件发生时,它对OpenStreetMap数据等非常有用)和--clipsrc(它表示clip特性)。最后两个参数未命名,但您可以从文档中看出它们分别表示输出数据集的路径和输入数据集的路径。

现在让我们运行投影。

  1. 键入以下命令:

ogr2ogr -t_srs EPSG:3857 -s_srs EPSG:4326 c:\data\PhiladelphiaBaseLayers\clippedAndProjected\roads.shp c:\data\PhiladelphiaBaseLayers\clipped\roads.shp

这个应该比剪辑跑得快。

  1. 在QGIS中启动新地图并添加clipped和projectedroads.shp。它应该比以前稍微垂直拉伸一点。

../../_images/qgis34_693_6.PNG

图3.10不同投影下费城道路的QGIS地图布局示例

结合文档检查用于此命令的参数时,您会注意到-sôsrs是源数据集(EPSG:4326或WGS 1984地理坐标系)的坐标系,-tôsrs是目标坐标系(EPSG:3857或web Mercator投影)。因为我们仍在使用ogr2ogr命令,最后两个参数分别是输出和输入数据集路径。

您可能想知道,“我怎么知道要使用哪些EPSG代码进行投影?” 找出现有数据集的EPSG代码的最简单方法(您需要-s_srs参数)是将数据集添加到QGIS中的新地图上,并在屏幕的右下角进行查找,如下所示: 上面的步骤12。找出目标数据集的EPSG代码(-t_srs参数需要)的最简单方法是在QGIS中运行“另存为”命令并搜索投影。EPSG代码将出现,如上面的步骤10所示。

较老版本的QGIS:如果您使用的是旧版本的QGIS(在大约2.14版埃森之前),您可能会看到输出数据集显示在墨卡托投影中,但是投影在右下角被报告为EPSG:54004或用户:100001而不是EPSG:3857。此外,如果将原始城市界限shapefile和投影的城市界限shapefile添加到同一地图项目中,您将注意到两个多边形之间大约有20公里的偏移。为了正确地解释EPSG:3857投影,QGIS需要一个.qpj(QGIS投影文件)与shapefile相关联。默认情况下,ogr2ogr实用程序不会创建.qpj文件,因为ogr2ogr是一个通用实用程序,用于许多不同的程序,而不仅仅是QGIS。要获得一个.qpj文件,您可以手动将带有QGIS的单个数据集投影到EPSG:3857中,就像我们在上面的第一组步骤中所做的那样。这将创建一个shapefile,该shapefile对EPSG:3857具有正确的.qpj。然后将生成的.qpj复制并粘贴到使用ogr2ogr实用程序投影的输出文件文件夹中。您需要为每个shapefile粘贴一次.qpj,并将其命名为<shapefile root name>.qpj。您不必修改.qpj文件的实际内容,因为对于任何具有EPSG:3857坐标系的shapefile,内容都是相同的。

ogr2ogr实用程序非常方便,但它最大的价值在于它能够实现自动化。让我们清除我们已经投影的内容,看看该实用程序如何剪辑和投影文件夹中的所有内容。

  1. 在您的PhiladelphiaBaseLayers文件夹中,删除clipped和clippedAndProjected文件夹中的所有内容。这使您回到本演练开始时的起点。为了成功删除这些数据集,您需要将其从可能正在使用它们的任何打开的QGIS地图中删除。

  2. 返回“命令”窗口,使用如下命令导航到费城篮球队文件夹:cd c:dataPhiladelphiaBaseLayers

  3. 键入以下命令以剪辑此文件夹中的所有数据集:

for %X in (*.shp) do ogr2ogr -skipfailures -clipsrc c:\data\PhiladelphiaBaseLayers\clipFeature\city_limits.shp c:\data\PhiladelphiaBaseLayers\clipped\%X c:\data\PhiladelphiaBaseLayers\%X

您可以看到控制台消息在文件夹中的所有数据集中循环。忽略控制台中出现的任何拓扑错误。这是一些混乱的数据,我们选择跳过失败。

请注意,此命令与您之前运行的命令类似,但它使用一个变量(由%X表示)代替特定的数据集名称。它还使用循环查找文件夹中的任何shapefile并执行命令。

  1. 现在,使用以下命令导航到剪裁的文件夹:

cd c:\data\PhiladelphiaBaseLayers\clipped

  1. 现在运行以下命令来投影所有这些数据集,并将它们放在clippedAndProjected文件夹中:

for %X in (*.shp) do ogr2ogr -t_srs EPSG:3857 -s_srs EPSG:4326 c:\data\PhiladelphiaBaseLayers\clippedAndProjected\%X c:\data\PhiladelphiaBaseLayers\clipped\%X

您可以将所有内容添加到QGIS中进行验证。

../../_images/qgis_693_7mod.png

图3.11显示先前操作输出的QGIS地图

3.5.3. 在批处理文件中运行OGR实用程序

如果知道将来要执行相同的命令系列,可以将这些命令放在批处理文件中。这只是一个包含命令列表的基本文本文件。在Windows上,您只需使用扩展名.bat保存它,然后操作系统就会明白,当您执行文件时,它应该按顺序调用命令。

请尝试以下操作,了解如何在批处理文件中使用ogr2ogr。

  1. 再次,从剪辑和剪辑及投影文件夹中删除所有文件。

  2. 在任何目录中创建一个新的文本文件,并粘贴到以下文本中(您可能需要修改它以匹配您的路径,特别是您的QGIS安装路径,该路径可能使用与3.4不同的版本名):

cd /d c:\data\PhiladelphiaBaseLayers
set ogr2ogrPath="c:\program files\QGIS 3.4\bin\ogr2ogr.exe"
set GDAL_DATA=C:\program files\QGIS 3.4\share\gdal
for %%X in (*.shp) do %ogr2ogrPath% -skipfailures -clipsrc c:\data\PhiladelphiaBaseLayers\clipFeature\city_limits.shp c:\data\PhiladelphiaBaseLayers\clipped\%%X c:\data\PhiladelphiaBaseLayers\%%X
for %%X in (*.shp) do %ogr2ogrPath% -skipfailures -s_srs EPSG:4326 -t_srs EPSG:3857  c:\data\PhiladelphiaBaseLayers\clippedAndProjected\%%X c:\data\PhiladelphiaBaseLayers\clipped\%%X

请注意,这些命令与您之前运行的命令完全相同,只是在开头添加了几行代码来更改工作目录并设置ogr2ogr实用程序的路径。

批处理文件可以像在其他编程语言中一样使用变量。使用set关键字设置变量,然后使用变量名称两边的%符号(例如,%ogr2ogrPath%)引用该变量。用循环内联创建的变量在批处理文件中使用百分比(例如,%%X)表示,这与在命令行窗口中键入命令时使用的语法略有不同。

  1. 将文件另存为clipAndProject.bat(确保文件名的任何部分都没有.txt)。

  2. 在Windows资源管理器中,双击clipAndProject.bat并观察剪裁和投影的文件显示在相应的文件夹中。

3.5.4. 保存数据以备将来使用

你将在以后的课程中使用这些数据。因此,请执行以下操作以便于使用:

  1. 创建一个名为Philadelphia的新文件夹,如c:dataPhiladelphia。此文件夹将保存所有剪裁和投影的数据集,以供将来参考。

  2. 将所有数据集从PhiladelphiaBaseLayersclipped和projected文件夹复制到Philadelphia文件夹中。

  3. 遵循本演练前面的技术,使用QGIS在新的Philadelphia文件夹中保存PhiladelphiaPhiladelphia ClipFeature city_limits.shp数据集的副本。将CRS设置为WGS 84 /伪墨卡托。 (请记住,最初从未投影过此层,因此您现在需要获取它的投影副本。)