9.5. 演练:从OpenStreetMap获取源数据

从OpenStreetMap(OSM)中获取数据比将数据放入OSM带来更多的技术挑战。当您将数据放入OSM中时,可以使用多种不同类型的编辑器。你可以使用任何你想要的标签,当然要坚持标签惯例。

相反,当您从OSM中获取数据时,必须处理以下问题:

  • 只检索所需的标记

  • 检索所需的数据格式

  • 不会因为请求太多数据而让自己或服务器不知所措

使问题复杂化的是,OSM以其自己的XML结构返回数据,许多GIS应用程序无法立即读取这些数据。因此,从OSM获取数据通常需要将XML转换成其他格式。

有多种下载OSM数据的机制。最简单的方法通过提供一种过滤所需标记的方法,允许您指定输出格式,并允许您为请求的数据指定地理边界框,这样您就不会检索太多数据,从而解决了这些难题。

我发现用于检索OSM数据的最用户友好的面向GUI的方式之一是位于`BBBike.org <https://extract.bbbike.org/>`_上的服务器。这个基于Web的小工具允许您交互式地绘制边界框并指定所需的输出格式。一段时间后,您会收到一封电子邮件,其中包含下载数据的链接。

../../_images/bbbike.png

图9.6

不过,在演练中,我们将使用直接构建到QGIS中的OSM下载机制。虽然这种方式比BBPUK提取服务更先进一些,但它更直接,并允许更大的灵活性来选择数据和标签。

9.5.1. 利用QGIS下载OSM数据

检查下面的图片卡宴,法属圭亚那。你会注意到这个城市有详细的建筑足迹多边形可用。假设我们想用QGIS得到这些建筑脚印的形状。

../../_images/walkthrough_9_7.png

图9.7

请注意,我们已经定义了三条基本信息来过滤所需的OSM数据:

  • 我们需要的标记:任何填充了building标记的多边形,而不是building=no(这是一个很少见的值,但偶尔会用到)

  • 我们想要的格式:shapefile

  • 我们想要的数据的边界框:只是卡宴的城市

在早期版本的QGIS中,下载OSM数据已集成到主程序中,并且可以在“向量”>“ OpenStreetMap”>“下载数据”下使用,但此功能已被删除,现在需要安装插件。从积极的方面来看,这些插件现在需要更少的步骤来获取数据。有几个可用于下载OSM数据的插件。我们在这里向您展示使用OSMDownloader插件的步骤。继续并从QGIS插件管理器安装此插件。您应该可以在“未安装”下找到它。激活后,该插件将向QGIS添加带有单个按钮的工具栏:

../../_images/osmdl2.PNG

单击它时,此按钮将变为突出显示,然后您可以在地图画布中选择要下载其OSM数据的区域。

现在执行以下步骤:

  1. 创建一个新的数据文件夹,如c:datacayen,以便将数据下载到。

  2. 在QGIS中,启动一个新项目,并使用EPSG:4326作为坐标参考系。这只是为了让QGIS显示的所有坐标都是WGS84经纬度坐标。

  3. 将OSM底图添加到项目中,然后导航到南美北海岸法属圭亚那的Cayenne。如果您在地图上找不到城市,下图中的坐标将为您提供帮助。

  4. 激活前一段中描述的OSMDownloader按钮,然后在地图画布中单击并拖动以选择包含城市的矩形区域。这将打开如下所示的OSMDownloader对话框。如果要使用与此处完全相同的区域,请手动编辑纬度和经度坐标的上下边界,使其与屏幕截图中的坐标相同。

../../_images/osmdl3.PNG

图9.8

  1. 在“保存位置”下,按“保存文件”按钮并导航到在步骤1中创建的文件夹。然后使用cayenne.osm作为文件名。

  2. 单击“确定”将启动下载过程。将出现一个进度条,最后是一个窗口,通知您下载已完成。

../../_images/osmdl_1.PNG

图9.9

  1. 我们已经完成使用下载插件了。接下来,我们将下载的.osm文件和osm数据添加到我们的QGIS项目中。为此,您只需将cayenne.osm文件从Windows文件资源管理器拖到QGIS的地图画布上。.osm文件包含不同几何类型的实体。但是,将添加到QGIS的图层只能包含单个几何图形类型的要素。因此,将显示一个对话框窗口,您必须在其中选择该几何图形类型。由于我们对构建多边形感兴趣,您应该在这里选择“多多边形”,然后单击“确定”。

../../_images/osmdl_4.PNG

图9.10

  1. 您应该会在QGIS项目中看到一个名为cayen_multipolygons的新图层,如下图所示。

../../_images/osmdl5.PNG

图9.11

现在只需要从该层选择建筑多边形。

  1. 在内容列表中,右键单击cayenne_polygons,然后单击“打开属性表”。快速浏览属性表并检出建筑物列。这就是我们将在查询中引用的用于过滤图层的内容。

  2. 在属性表的顶部,单击使用expressionExpression选择要素

../../_images/select_expression.png

按钮。

将以下查询粘贴到包括所有引号的“表达式”框中:“ building”!='NULL'AND“ building”!='no'

../../_images/osmdl6.PNG

图9.12

这个表达式过滤掉所有不是建筑物的东西。使用自己感兴趣的数据执行此操作时,需要创建一些表达式,该表达式只选择所需的标记组合。

  1. 单击“选择要素”。您应该可以看到在地图中选择的建筑特征。

  2. 在地图目录中,右键单击“卡宴多边形”图层,然后单击“导出”->“功能另存为…”....

  3. 选择Esri shapefile作为格式并指定输出位置。选择“仅保存选定的要素”选项。然后单击“确定”。

../../_images/osmdl7.PNG

图9.13

  1. 使用QGIS验证导出的形状文件是否仅包含建筑。

../../_images/osmdl8.PNG

图9.14

9.5.2. 使用立交桥OpenStreetMap查询API下载数据

在OSM的任何数据检索机制背后,都有一个web服务请求。您可以直接从web浏览器或使用OSM查询API的自动程序发送这些请求。这些API中最强大的一个称为Overpass。请尝试以下操作:

  1. 将以下URL粘贴到web浏览器中,并等待一分钟,直到提示保存文件:

http://www.overpass-api.de/api/xapi_meta?*[building=yes][bbox=-52.35,4.88,-52.25,4.98]

注意这是什么要求…它应该看起来很熟悉。

2. When prompted to save the file, save it as buildings.osm .

3. Open buildings.osm in a text editor and see what all the buildings in Cayenne look like when expressed as OSM-formatted XML.

您可以使用Python或其他脚本语言自动发出这些请求。例如,下面是如何使用Python查询费城所有农贸市场的OSM并将其保存到.OSM文件中的方法。(不需要运行此代码)。

import urllib

workspace = "C:\\data\\OSMdev\\"

# Make data queries to jXAPI
marketsXml = urllib.urlopen("http://www.overpass-api.de/api/xapi_meta?*%5Bshop=farm%5D%5Bbbox=-75.29,39.86,-74.95,40.15%5D").read()

# Make farmers markets file
marketsPath = workspace + "markets.osm"
marketsFile = open(marketsPath, 'w')
marketsFile.write(marketsXml)
marketsFile.close()

对于Python迷:上面的代码使用一个名为urllib的库,这个库能够发出web请求并读取响应。您只需提供请求的URL。为了不被解释为定义了一个列表 [“和”] “字符分别使用%5B和%5D序列转义,但其他情况下,查询的语法与您在上面为卡宴建筑发布的查询的语法相同。然后使用标准Python write方法将生成的XML写入文件。

如果希望定期更新一个或多个数据集,这样的脚本可能很有用。该脚本可以与GDAL处理相结合,将数据转换成适合web地图的格式。最新版本的GDAL(1.10及更高版本)可以读取OSM XML并将其转换为不同的格式,如GeoJSON或shapefile。(不过,要小心shapefile,因为GDAL会将大多数不太常见的“其他标记”放到一个字段中,该字段会被截断256个字符,这是shapefile格式的限制)。

作为所有这些怪胎的结尾的感叹号,请使用图形工具overpass turbo 几分钟。这为您提供了一个交互式环境,用于查询OSM并在地图上查看结果。您可以以流行格式保存任何有趣的结果,例如KML。如果您只想对OSM进行一次性查询以获得特定的功能类型,这将非常有用。

有许多情况和需求会影响从OSM检索数据的方式。希望本演练提供了足够的选项,使您能够就如何最好地获得所需数据的范围和规模做出明智的决策。现在,让我们进入课程作业,在这里您将获得一些与其他方面有关的经验:将数据放入OSM。