Skip to content

命令行上的空间连接

来源: https://spatialthoughts.com/2015/07/12/ogr-spatial-join/

GDAL 和 OGR 库附带了便捷的 命令行工具。如果你知道如何使用它们,这些工具将非常强大,可以为你节省大量精力。在这里,我将展示如何使用 ogrinfoogr2ogr 工具执行空间连接。一条简单的命令就可以对你的空间数据执行复杂的操作,并为你省去在 GIS 中进行大量点击和数据处理的麻烦。

获取工具

在 Windows 上获取命令行工具的最佳方式是通过 OSGeo4W 安装程序。如果你使用的是 Linux 或 Mac,请参阅 这些说明 以获取适合你平台的软件包。

获取数据

查看 执行空间连接 教程中的数据和问题陈述。下载行政区边界 (Borough Boundaries) 和疗养院 (Nursing Homes) 的 shapefile。

步骤

OGR 命令行工具只接受 1 个输入。但我们的空间连接有 2 个输入。解决这个问题的一个简单方法是使用 VRT 文件。VRT 文件允许我们指定多个输入,并将它们作为单个输入的图层传递给命令行工具。

将输入的 shapefile 解压到硬盘上的同一个文件夹中。在同一文件夹中创建一个名为 input.vrt 的文件,内容如下:

<OGRVRTDataSource>
    <OGRVRTLayer name="boroughs">
        <SrcDataSource>nybb.shp</SrcDataSource>
        <SrcLayer>nybb</SrcLayer>
    </OGRVRTLayer>
    <OGRVRTLayer name="nursinghomes">
        <SrcDataSource>OEM_NursingHomes_001.shp</SrcDataSource>
        <SrcLayer>OEM_NursingHomes_001</SrcLayer>
    </OGRVRTLayer>
</OGRVRTDataSource>

打开 OSGeo4W shell 并 cd 到包含 shapefile 和 vrt 文件的目录。运行 ogrinfo 命令以检查 VRT 文件是否正确。

ogrinfo input.vrt

OGR 工具可以对输入图层运行 SQL 查询。我们将使用 ST_INTERSECTS 函数查找所有与行政区边界相交的疗养院,并使用 SUM 函数计算行政区的疗养院总容量。运行以下命令:

ogrinfo -sql "SELECT b.BoroName, sum(n.Capacity) as total_capacity from
boroughs b, nursinghomes n WHERE ST_INTERSECTS(b.geometry, n.geometry) group
by b.BoroName" -dialect SQLITE input.vrt

你可以看到,通过一条命令,我们就完成了在 GIS 环境中需要大量点击操作才能完成的空间连接并获得了结果。我们也可以进行反向空间连接。我们可以将行政区的名称连接到疗养院图层的每个要素上。使用 ogr2ogr 工具,我们可以从连接结果中输出一个 shapefile。请注意,我们在 SELECT 语句中添加了 geometry 列,这将生成空间输出。运行以下命令:

ogr2ogr -sql "SELECT n.Name, n.Capacity, n.geometry, b.BoroName from
boroughs b, nursinghomes n WHERE ST_INTERSECTS(b.geometry, n.geometry)"
-dialect SQLITE output.shp input.vrt

在 GIS 中打开 output.shp,验证新的 shapefile 是否具有连接自相交行政区的属性。你也可以使用 ogrinfo 命令来进行检查。

ogrinfo -al output.shp