使用 GDAL 工具创建地理空间 PDF (Geospatial PDF)
GeoPDF 是一种独特的数据格式,它将 PDF 的便携性带入了地理空间数据。GeoPDF 文档可以展示栅格和矢量数据,并保留地理参考信息。对于非 GIS 人员来说,这是一种无需 GIS 软件即可使用 GIS 数据的有用格式。虽然 GeoPDF 是一种专有格式,但我们在开放的 Geospatial PDF 格式中有一个非常接近的替代方案。GDAL 从 1.10 版本开始增加了对创建 Geospatial PDF 文档的支持。在这篇文章中,我将展示如何创建一个包含多个矢量图层的 GeoPDF 文档。
获取工具
Windows
OsGeo4W 是在 Windows 上安装 GDAL 的最佳方式。默认安装会提供支持 PDF 格式的 GDAL 工具。你可以通过安装中包含的 OsGeo4W Shell 使用 GDAL 工具。
Mac
KyngChaos 为 Mac 提供了一个方便的 GDAL 安装程序。你还需要安装额外的 GeoPDF 插件 以启用对 PDF 格式的支持。
安装完成后,将 GDAL 库的路径添加到你的 .bash_profile 文件中,以便能够从终端轻松使用命令。启动终端并输入以下命令。
echo 'export PATH=/Library/Frameworks/GDAL.framework/Programs:$PATH' >> ~/.bash_profile
source ~/.bash_profile
Linux
安装说明因发行版而异。在 Ubuntu 上,你可以安装 gdal-bin 包。
sudo apt-get install gdal-bin
验证 GDAL 安装
如果你已经安装了 GDAL,或者刚刚安装好,请在终端中运行以下命令,以验证你的 GDAL 安装是否正常工作并支持 GeoPDF 格式。
gdalinfo --formats | grep -i pdf
如果你在输出中看到 Geospatial PDF —— 那么你已经准备好了。如果你没有得到任何输出或收到错误,说明你的安装配置不正确。

获取数据
在这个例子中,我选择使用 MapZen 的 OpenStreetMap Metro Extracts。下载你选择城市的 Shapefile (OSM2PGSQL SHP 格式)。本例中我使用的是班加罗尔市(Bangalore)的提取数据。将下载的文件解压到计算机上的一个文件夹中。
步骤
从一堆 Shapefile 创建 GeoPDF 文件的过程只需要运行一个 gdal_translate 命令。但我们需要准备数据并找出正确的命令行选项。所以请跟随下面的步骤来理解如何得出最终的命令 —— 或者直接滚动到底部查看最终的命令行。
latuviitta.org 有一份 全面的概述,介绍了通过 GDAL 创建 GeoPDF 的所有可用选项。以下步骤是该指南的改编和简化版本。
- 第一步是创建一个
.vrt文件,用于容纳我们想要在 PDF 中包含的所有矢量图层。如果你只需要 PDF 中的单个图层,你可以跳过创建.vrt文件,直接引用该图层代替 VRT。注意 VRT 文件中的<SrcSQL>标签。这是为了过滤掉所有 'name' 字段为空的要素。你可以省略它或根据你的数据集进行修改。将此文件命名为osm.vrt并将其保存在与数据相同的文件夹中。
<OGRVRTDataSource>
<OGRVRTLayer name="roads">
<SrcDataSource>bengaluru_india_osm_line.shp</SrcDataSource>
<SrcLayer>bengaluru_india_osm_line</SrcLayer>
<SrcSQL dialect="sqlite">SELECT name, highway, geometry from bengaluru_india_osm_line where name is not NULL</SrcSQL>
<GeometryType>wkbLineString</GeometryType>
<LayerSRS>WGS84</LayerSRS>
</OGRVRTLayer>
<OGRVRTLayer name="pois">
<SrcDataSource>bengaluru_india_osm_point.shp</SrcDataSource>
<SrcLayer>bengaluru_india_osm_point</SrcLayer>
<SrcSQL dialect="sqlite">SELECT name, geometry from bengaluru_india_osm_point where name is not NULL</SrcSQL>
<GeometryType>wkbPoint</GeometryType>
<LayerSRS>WGS84</LayerSRS>
</OGRVRTLayer>
</OGRVRTDataSource>
- GeoPDF 是一种可以在顶部叠加矢量的栅格格式。所以我们需要一个栅格图层作为底图。如果你有该区域的一些卫星图像或扫描的栅格图,你可以将其用作底图层,或者我们可以为矢量图层的范围创建一个空栅格。
ogrtindex命令从给定的输入图层创建一个边界框多边形。然后gdal_rasterize命令用给定的值填充此多边形并创建一个栅格。-tr选项指定栅格的像素分辨率(以度为单位)。你可以调整它以获得所需的输出尺寸。cd到你解压矢量图层的目录并运行以下命令。
cd Users\Ujaval\Downloads\bengaluru_india.osm2pgsql-shapefiles
ogrtindex -accept _different_schemas extent.shp osm.vrt
gdal_rasterize -burn 255 -ot Byte -tr 0.0001 0.0001 extent.shp bangalore.tif

- 现在我们可以将空的
bangalore.tif栅格转换为 PDF —— 叠加来自osm.vrt文件的矢量图层。
gdal_translate -of PDF -a_srs EPSG:4326 bangalore.tif bangalore.pdf -co OGR_DATASOURCE=osm.vrt -co OGR_DISPLAY_FIELD="name"

- 转换完成后,你可以在任何 PDF 查看器中打开生成的
bangalore.pdf文件。在 Adobe Acrobat 查看器中打开它,你可以看到地# 使用 GDAL 工具创建地理空间 PDF (Geospatial PDF)
GeoPDF 是一种独特的数据格式,它将 PDF 的便携性带入了地理空间数据。GeoPDF 文档可以展示栅格和矢量数据,并保留地理参考信息。对于非 GIS 人员来说,这是一种无需 GIS 软件即可使用 GIS 数据的有用格式。虽然 GeoPDF 是一种专有格式,但我们在开放的 Geospatial PDF 格式中有一个非常接近的替代方案。GDAL 从 1.10 版本开始增加了对创建 Geospatial PDF 文档的支持。在这篇文章中,我将展示如何创建一个包含多个矢量图层的 GeoPDF 文档。
获取工具
Windows
OsGeo4W 是在 Windows 上安装 GDAL 的最佳方式。默认安装会提供支持 PDF 格式的 GDAL 工具。你可以通过安装中包含的 OsGeo4W Shell 使用 GDAL 工具。
Mac
KyngChaos 为 Mac 提供了一个方便的 GDAL 安装程序。你还需要安装额外的 GeoPDF 插件 以启用对 PDF 格式的支持。
安装完成后,将 GDAL 库的路径添加到你的 .bash_profile 文件中,以便能够从终端轻松使用命令。启动终端并输入以下命令。
echo 'export PATH=/Library/Frameworks/GDAL.framework/Programs:$PATH' >> ~/.bash_profile
source ~/.bash_profile
Linux
安装说明因发行版而异。在 Ubuntu 上,你可以安装 gdal-bin 包。
sudo apt-get install gdal-bin
验证 GDAL 安装
如果你已经安装了 GDAL,或者刚刚安装好,请在终端中运行以下命令,以验证你的 GDAL 安装是否正常工作并支持 GeoPDF 格式。
gdalinfo --formats | grep -i pdf
如果你在输出中看到 Geospatial PDF —— 那么你已经准备好了。如果你没有得到任何输出或收到错误,说明你的安装配置不正确。

获取数据
在这个例子中,我选择使用 MapZen 的 OpenStreetMap Metro Extracts。下载你选择城市的 Shapefile (OSM2PGSQL SHP 格式)。本例中我使用的是班加罗尔市(Bangalore)的提取数据。将下载的文件解压到计算机上的一个文件夹中。
步骤
从一堆 Shapefile 创建 GeoPDF 文件的过程只需要运行一个 gdal_translate 命令。但我们需要准备数据并找出正确的命令行选项。所以请跟随下面的步骤来理解如何得出最终的命令 —— 或者直接滚动到底部查看最终的命令行。
latuviitta.org 有一份 全面的概述,介绍了通过 GDAL 创建 GeoPDF 的所有可用选项。以下步骤是该指南的改编和简化版本。
- 第一步是创建一个
.vrt文件,用于容纳我们想要在 PDF 中包含的所有矢量图层。如果你只需要 PDF 中的单个图层,你可以跳过创建.vrt文件,直接引用该图层代替 VRT。注意 VRT 文件中的<SrcSQL>标签。这是为了过滤掉所有 'name' 字段为空的要素。你可以省略它或根据你的数据集进行修改。将此文件命名为osm.vrt并将其保存在与数据相同的文件夹中。
<OGRVRTDataSource>
<OGRVRTLayer name="roads">
<SrcDataSource>bengaluru_india_osm_line.shp</SrcDataSource>
<SrcLayer>bengaluru_india_osm_line</SrcLayer>
<SrcSQL dialect="sqlite">SELECT name, highway, geometry from bengaluru_india_osm_line where name is not NULL</SrcSQL>
<GeometryType>wkbLineString</GeometryType>
<LayerSRS>WGS84</LayerSRS>
</OGRVRTLayer>
<OGRVRTLayer name="pois">
<SrcDataSource>bengaluru_india_osm_point.shp</SrcDataSource>
<SrcLayer>bengaluru_india_osm_point</SrcLayer>
<SrcSQL dialect="sqlite">SELECT name, geometry from bengaluru_india_osm_point where name is not NULL</SrcSQL>
<GeometryType>wkbPoint</GeometryType>
<LayerSRS>WGS84</LayerSRS>
</OGRVRTLayer>
</OGRVRTDataSource>
- GeoPDF 是一种可以在顶部叠加矢量的栅格格式。所以我们需要一个栅格图层作为底图。如果你有该区域的一些卫星图像或扫描的栅格图,你可以将其用作底图层,或者我们可以为矢量图层的范围创建一个空栅格。
ogrtindex命令从给定的输入图层创建一个边界框多边形。然后gdal_rasterize命令用给定的值填充此多边形并创建一个栅格。-tr选项指定栅格的像素分辨率(以度为单位)。你可以调整它以获得所需的输出尺寸。cd到你解压矢量图层的目录并运行以下命令。
cd Users\Ujaval\Downloads\bengaluru_india.osm2pgsql-shapefiles
ogrtindex -accept _different_schemas extent.shp osm.vrt
gdal_rasterize -burn 255 -ot Byte -tr 0.0001 0.0001 extent.shp bangalore.tif

- 现在我们可以将空的
bangalore.tif栅格转换为 PDF —— 叠加来自osm.vrt文件的矢量图层。
gdal_translate -of PDF -a_srs EPSG:4326 bangalore.tif bangalore.pdf -co OGR_DATASOURCE=osm.vrt -co OGR_DISPLAY_FIELD="name"

- 转换完成后,你可以在任何 PDF 查看器中打开生成的
bangalore.pdf文件。在 Adobe Acrobat 查看器中打开它,你可以看到地图数据图层。你可以在图层面板中浏览要素,搜索任何属性值并缩放/平移地图。

- GeoPDF 文件的另一个流行用途是使用诸如 Avenza PDF Maps 之类的程序将其用作离线底图。在手机上的 Avenza Maps 中加载
bangalore.pdf文件,你可以使用 GPS 查看当前位置或在顶部追踪 GPS 路线。搜索功能也可以在 PDF 中的各个图层间工作。

你可以下载示例 bangalore.pdf Geospatial PDF 格式文件来亲自探索该格式。图数据图层。你可以在图层面板中浏览要素,搜索任何属性值并缩放/平移地图。

- GeoPDF 文件的另一个流行用途是使用诸如 Avenza PDF Maps 之类的程序将其用作离线底图。在手机上的 Avenza Maps 中加载
bangalore.pdf文件,你可以使用 GPS 查看当前位置或在顶部追踪 GPS 路线。搜索功能也可以在 PDF 中的各个图层间工作。

你可以下载示例 bangalore.pdf Geospatial PDF 格式文件来亲自探索该格式。