5. 补充内容 (Supplement)
5.1 检查支持的格式和功能
GDAL 二进制文件构建时包含了对许多常见数据格式的支持。要检查你的 GDAL 发行版支持哪些格式,可以运行以下命令:
gdalinfo --formats
或者,--format 标志可以与任何其他实用程序(如 gdal_translate 或 ogrinfo)一起使用以获取此列表。
输出列出了所有驱动程序的短名称、是否支持矢量或栅格数据,以及指示功能的缩写。
| 缩写 | 功能 |
|---|---|
| r | 读取 (read) |
| ro | 只读 (read only) |
| w | 写入 (创建数据集) |
| w+ | 写入 (支持更新) |
| s | 支持子数据集 |
| v | 支持虚拟访问 - 例如 /vsimem/ |
这意味着 rov 的缩写表示它是一个支持虚拟访问的只读格式。
5.2 提取图像元数据和统计信息
你可以使用 -json 选项运行 gdalinfo 命令,该选项将信息作为 JSON 字符串返回。这允许你以编程方式访问信息并对其进行解析。
假设我们要提取在 合并图块 部分创建的 merged.vrt 的最大值。我们可以通过提供 -json 选项来获取命令的 JSON 输出。
gdalinfo -stats -json merged.vrt
接下来,我们需要一种方法来解析 JSON 并提取我们感兴趣的字段。有许多命令行实用程序专门用于此目的。这里我们使用流行的 JSON 处理工具 jq。你可以下载并安装适用于你操作系统的 jq CLI,并确保它在系统路径中。然后我们可以像下面这样使用 jq 查询提取所需数据。
gdalinfo -stats -json merged.vrt | jq ".bands[0].maximum"

或者,你也可以通过 Python 运行命令,并使用 json 模块解析和提取结果。下面的代码显示了如何提取前面示例中使用的每个 SRTM 图块的最小值和最大值。
import os
import json
import subprocess
input_dir = 'srtm'
command = 'gdalinfo -stats -json {input}'
for file in os.listdir(input_dir):
if file.endswith('.hgt'):
input = os.path.join(input_dir, file)
filename = os.path.splitext(os.path.basename(file))[0]
output = subprocess.check_output(command.format(input=input), shell=True)
info_dict = json.loads(output)
bands = info_dict['bands']
for band in bands:
band_id = band['band']
min = band['minimum']
max = band['maximum']
print('{},{},{},{}'.format(filename, band_id, min, max))
5.3 验证 COGs
如果你想检查给定的 GeoTIFF 文件是否为有效的云优化 GeoTIFF (COG),有几种方法。
-
使用
rio命令行实用程序Rasterio 提供了一个名为 rio 的命令行实用程序,用于在命令行上执行各种栅格操作。Rasterio 的 rio-cogeo 插件添加了对 COG 创建和验证的支持。
你可以在 conda 环境中安装所需的库,如下所示:
bash conda create --name cogeo conda activate cogeo conda install -c conda-forge rasterio rio-cogeo安装后,你可以使用
rio cogeo命令验证 COG。bash rio cogeo validate merged_cog.tif这也适用于云托管文件。
bash rio cogeo validate /vsicurl/https://storage.googleapis.com/spatialthoughts-public-data/ntl/viirs/viirs_ntl_2021_global.tif -
使用 Python
你可以使用 validate_cloud_optimized_geotiff.py 脚本来检查文件是否为有效的 COG。
bash python validate_cloud_optimized_geotiff.py merged_cog.tif
5.4 创建等高线 (Creating Contours)
注意: 下面使用的
merged.tif文件是在 合并图块 部分创建的。
GDAL 软件包附带了 gdal_contour 实用程序,可从 DEM 创建等高线和多边形。
你可以使用 -i 选项指定等高线之间的间隔。
gdal_contour merged.tif contours.gpkg -i 500

使用默认选项运行命令会生成带有等高线的矢量图层,但它们没有任何属性。如果你想在地图中标注等高线,你可能希望创建带有高程值作为属性的等高线。你可以使用 -a 选项并指定属性名称。
gdal_contour merged.tif contours.gpkg -i 500 -a elev

你还可以创建多边形等高线。多边形等高线在某些应用中很有用,例如水文学,你可能希望得出等雨量线之间区域的平均降雨深度。你可以指定 -p 选项来创建多边形等高线。可以提供 -amin 和 -amax 选项来指定存储每个多边形最小和最大高程的属性名称。下面的命令为输入 merged.tif DEM 创建等高线 shapefile。
gdal_contour merged.tif contour_polygons.shp -i 500 -p -amin MINELEV -amax MAXELEV

5.5 创建彩色图像
我们可以使用 gdaldem color-relief 命令将调色板应用于任何单波段图像以创建渲染图像。
我们创建一个文件 ntl_colormap.txt,其中包含映射到 RGB 颜色的像素强度值。键 nv 用于为 NoData 值分配颜色。
0 0 0 4
20 145 43 129
40 251 133 96
50 254 216 154
60 252 253 191
nv 255 255 255
将颜色映射应用于单波段夜间灯光图像。
gdaldem color-relief \
/vsicurl/https://storage.googleapis.com/spatialthoughts-public-data/ntl/viirs/viirs_ntl_2021_india.tif \
ntl_colormap.txt ntl_colorized.tif
将彩色 GeoTIFF 转换为 PNG。指定值 255 以设置 NoData 值的透明度。
gdal_translate -of PNG -a_nodata 255 ntl_colorized.tif ntl_colorized.png

5.6 创建彩色山体阴影
如果你想合并山体阴影和彩色地形以创建彩色晕渲地貌图,可以使用 gdal_calc.py 进行伽马和叠加计算以组合这 2 个栅格。
gdal_calc.py -A hillshade.tif --outfile=gamma_hillshade.tif \
--calc="uint8(((A / 255.)**(1/0.5)) * 255)"
gdal_calc.py -A gamma_hillshade.tif -B colorized.tif --allBands=B \
--calc="uint8( ( \
2 * (A/255.)*(B/255.)*(A<128) + \
( 1 - 2 * (1-(A/255.))*(1-(B/255.)) ) * (A>=128) \
) * 255 )" --outfile=colorized_hillshade.tif

5.7 去除 JPEG 压缩伪影
对航空或无人机影像应用 JPEG 压缩可能会导致结果出现边缘伪影。由于 JPEG 是一种有损压缩算法,它会导致无数据值(通常为 0)转换为非零值。当你想镶嵌不同的图块或掩盖黑色像素时,这会导致问题。幸运的是,GDAL 附带了一个名为 nearblack 的便捷工具,旨在解决此问题。你可以指定一个容差值来去除可能不完全为 0 的边缘像素。它向内扫描图像,直到找到这些近乎黑色的像素值并将其掩盖。
nearblack -near 5 -setmask -o aoi_masked.tif aoi.tif \
-co COMPRESS=JPEG -co TILED=YES -co PHOTOMETRIC=YCBCR

5.8 将镶嵌图分割为图块
在交付大型镶嵌图时,最好将大型输入文件分割成更小的块。GDAL 附带了一个名为 gdal_retile.py 的便捷脚本,专为此任务设计。
假设我们有一个大型 GeoTIFF 文件 aoi.tif,并希望将其分割成 256 x 256 像素的图块,重叠 10 个像素。
首先我们创建一个目录,用于写入输出图块。
mkdir tiles
现在我们可以使用以下命令分割文件并将输出写入 tiles 目录。
gdal_retile.py -ps 256 256 -overlap 10 -targetDir tiles/ aoi.tif
这将创建较小的 GeoTiff 文件。如果你想训练深度学习模型,通常需要 JPEG 或 PNG 图块。你可以使用 批量运行命令 部分中显示的技术将这些批量转换为 JPEG 格式。由于 JPEG/PNG 无法保存地理参考信息,我们提供 WORLDFILE=YES 创建选项。
gdal_translate -of JPEG <input_tile>.tif <input_tile>.jpg -co WORLDFILE=YES
这将创建一个扩展名为 .wld 的 sidecar 文件,用于存储每个图块的地理参考信息。只要此文件存在于同一目录中,GDAL 就会自动将地理参考信息应用于 JPEG 图块。
5.9 从栅格提取投影信息
有时你可能需要从栅格中提取并保留地理参考信息,以便稍后使用或用于不同的文件。一个典型的用例是深度学习——你需要将地理参考图块(即 GeoTIFF 文件)转换为 PNG 或 JPEG 图块。如果你按照 上一节 使用了 gdal_retile.py,你将拥有每个图块附带的 World File。但很多时候,你只有原始 GeoTIFF 文件和生成的 PNG 图块。要从 GeoTIFF 复制地理参考信息并将其应用于 PNG,可以使用以下过程。
假设我们有一个名为 tile_1_1.tif 的地理参考图块和一个来自训练数据集的此图块的非地理参考注释版本 tile_1_1_annotated.png。我们希望使用 GeoTIFF 文件的投影和范围对这个 PNG 文件进行地理配准。

我们可以使用 listgeo 工具提取原始 GeoTIFF 的范围和分辨率。此工具已经是标准 GDAL conda 发行版的一部分。我们将使用 -tfw 标志提取 world file,该标志生成 ESRI world file。
listgeo -tfw tile_1_1.tif
你会看到在原始 GeoTIFF 旁边生成了一个名为 tile_1_1.tfw 的新文件。接下来我们使用 gdalsrsinfo 命令提取投影信息。我们将输出保存到扩展名为 .prj 的文件中。
gdalsrsinfo tile_1_1.tif > tile_1_1.prj
tile_1_1.tfw 和 tile_1_1.prj 包含我们需要对 PNG 图块进行地理配准的所有信息。
让我们将 PNG 转换为 GeoTIFF 文件并分配原始图块的投影。
gdal_translate -a_srs tile_1_1.prj tile_1_1_annotated.png tile_1_1_annotated.tif
生成的文件包含投影,但范围不正确。我们可以使用 geotifcp 工具将 world file 中的范围应用于 GeoTIFF。
geotifcp -e tile_1_1.tfw tile_1_1_annotated.tif tile_1_1_annotated_georeferenced.tif
5.10 合并不同分辨率的文件
如果你有一堆想要合并的图块,但某些图块的分辨率不同,你可以使用 gdalbuildvrt 指定 -resolution 标志,以确保输出文件具有预期的分辨率。
继续 处理航空影像 部分的示例,我们可以创建一个虚拟栅格并指定 resolution 标志。
gdalbuildvrt -input_file_list filelist.txt naip.vrt -resolution highest -r bilinear
使用 gdal_translate 转换此文件或使用 gdalwarp 对其进行子集化将产生具有源图块中最高分辨率的镶嵌图。
5.11 计算多个栅格的逐像素统计
gdal_calc.py 可以计算许多输入栅格或多波段栅格的逐像素统计信息。从 GDAL v3.3 开始,它支持全方位的 numpy 函数,例如 numpy.average()、numpy.sum() 等。
下面是一个示例,展示如何计算 12 个不同输入栅格的逐像素总和。你的数据包中的 prism 文件夹包含 12 个美国大陆降水量栅格。我们将计算这些栅格的逐像素总降水量。当你使用相同的输入标志 -A 读取多个栅格时,gdal_calc.py 会创建一个 3D numpy 数组。然后可以沿轴 0 对其进行缩减以产生总和。
cd prism
gdal_calc.py \
-A PRISM_ppt_stable_4kmM3_201701_bil.bil \
-A PRISM_ppt_stable_4kmM3_201702_bil.bil \
-A PRISM_ppt_stable_4kmM3_201703_bil.bil \
-A PRISM_ppt_stable_4kmM3_201704_bil.bil \
-A PRISM_ppt_stable_4kmM3_201705_bil.bil \
-A PRISM_ppt_stable_4kmM3_201706_bil.bil \
-A PRISM_ppt_stable_4kmM3_201707_bil.bil \
-A PRISM_ppt_stable_4kmM3_201708_bil.bil \
-A PRISM_ppt_stable_4kmM3_201709_bil.bil \
-A PRISM_ppt_stable_4kmM3_201710_bil.bil \
-A PRISM_ppt_stable_4kmM3_201711_bil.bil \
-A PRISM_ppt_stable_4kmM3_201712_bil.bil \
--calc='numpy.sum(A, axis=0)' \
--outfile total.tif
5.12 从栅格提取值
GDAL 套件附带了一个名为 gdallocationinfo 的有用工具,可以在一个或多个坐标对处从栅格进行点查找。结合 GDAL 使用 虚拟文件系统 从云数据集流式传输数据的功能,你可以有效地从栅格中查找像素值,而无需将整个栅格加载到内存中。
例如,我们在 Google Cloud Storage 存储桶上有一个大型 (8GB) 单波段云优化 GeoTiff (COG) 文件。此文件是 2021 年 VIIRS 夜间灯光的全球镶嵌图,像素值是辐射值。

要访问此文件,我们使用 /vsigs/ (Google Cloud Storage 文件) 处理程序。
gdalinfo /vsigs/spatialthoughts-public-data/ntl/viirs/viirs_ntl_2021_global.tif --config GS_NO_SIGN_REQUEST YES
现在让我们使用 gdallocationinfo 查询单个坐标处的像素值。我们以 WGS84 经度/纬度格式指定位置,因此使用 -wgs84 选项。
gdallocationinfo -valonly /vsigs/spatialthoughts-public-data/ntl/viirs/viirs_ntl_2021_global.tif -wgs84 77.5946 12.9716 --config GS_NO_SIGN_REQUEST YES
你也可以从文件中查找多个点的值。假设我们有一个名为 coordinates.txt 的文本文件,其中包含以下 2 个坐标。
77.5946 12.9716
77.1025 28.7041
我们可以通过将其提供给 gdallocationinfo 命令来查找这些坐标处的像素值。我们还提供 -xml 选项,以便输出是结构化的,可用于后处理。
cat coordinates.txt | gdallocationinfo /vsigs/spatialthoughts-public-data/ntl/viirs/viirs_ntl_2021_global.tif \
-wgs84 --config GS_NO_SIGN_REQUEST YES -xml

5.13 使用二进制栅格掩膜值
通常我们有表示数据掩膜的二进制图像。我们可以将 numpy.where() 函数与 gdal_calc.py 一起使用,以使用掩膜图像掩膜任何栅格中的像素。
假设我们有一个包含像素值 0 和 1 的 binary.tif。我们现在想将 merged.tif 中 binary.tif 为 0 的所有像素设置为 No Data。假设我们想使用 -32768 作为 No Data 值,我们可以使用如下命令。
gdal_calc.py -A merged.tif -B binary.tif \
--calc="numpy.where(B==1, A, -32768)" \
--NoDataValue -32768 --outfile masked.tif
5.14 栅格转矢量
GDAL 附带了 gdal_polygonize.py,允许我们将栅格转换为矢量图层。假设我们要从 合并图块 部分的合并栅格中提取最高高程的坐标。使用 gdalinfo -stats 查询栅格显示最高像素值为 8748。
我们可以使用 gdal_calc.py 创建一个仅匹配具有该值的像素的栅格。
gdal_calc.py --calc 'A==8748' -A merged.vrt --outfile everest.tif --NoDataValue=0
像上面这样的布尔表达式的结果将是一个具有 1 和 0 像素值的栅格。由于我们将 NoData 设置为 0,我们只有一个像素值为 1(条件匹配的地方)。我们可以使用 gdal_polygonize.py 将其转换为矢量。
gdal_polygonize.py everest.tif everest.shp
如果我们想提取多边形的质心并打印坐标,我们可以使用 ogrinfo 命令。
ogrinfo everest.shp -sql 'SELECT AsText(ST_Centroid(geometry)) from everest' -dialect SQLite
5.15 视域分析 (Viewshed Analysis)
gdal_viewshed 命令可以使用高程栅格进行可见性分析。这对包括城市规划和电信在内的许多应用都是非常有用的分析。我们可以获取伦敦 1m DSM 数据集并从某个位置进行可见性分析。
我们将确定从 Tower 42 建筑物顶部可见的所有伦敦区域。
我们获取为 作业 1 创建的合并 DSM 并生成视域。
数据集的 CRS 是 EPSG:27700,因此我们需要获取此 CRS 中的观察者位置坐标。我们可以使用 gdaltransform 命令将经度/纬度坐标转换为目标 CRS 中的坐标。运行下面的命令并按回车。
gdaltransform -s_srs EPSG:4326 -t_srs EPSG:27700
该命令从终端获取输入。输入 X 和 Y 坐标如下:
-0.083738 51.515178

命令的输出是 X 和 Y 坐标 533061.985055201 181323.948402008。我们将它们四舍五入并在 gdal_viewshed 命令中使用。
gdal_viewshed -b 1 -ox 533062 -oy 181324 -oz 10 -md 100000.0 -f GTiff -co COMPRESS=DEFLATE -co PREDICTOR=2 merged.tif viewshed_tower42.tif

5.16 处理 KML 文件
Keyhole 标记语言 (KML) 是一种主要由 Google Earth 使用的基于 XML 的文件格式。通常,GIS 用户希望将其数据导出为 KML 以在 Google Earth 中进行可视化。你可能还希望从 KML 文件中提取数据或将其转换为 GIS 中使用的其他空间格式。GDAL KML 驱动程序 既可以读取也可以写入 KML 文件,并提供许多选项以使转换兼容。
将数据导出为 KML 文件
让我们获取数据包中 spatial_query.gpkg 文件中的 metro_stations 图层,并将其导出为 KML 文件 metro_stations.kml。
ogr2ogr -f KML metro_stations.kml spatial_query.gpkg metro_stations

虽然上面的命令有效,但你会注意到当你在 Google Earth 中打开生成的文件时,每个要素的地标没有任何标签。这是因为 KML 格式期望图层中有一个名为 Name 的字段,用作每个地标的标签。如果你的数据图层没有这样的字段,你可以使用 -dsco 选项提供一个用作标签的替代字段名称。metro_stations 图层有一个名为 station 的字段,我们可以将其用作名称字段。
ogr2ogr -f KML metro_stations.kml spatial_query.gpkg metro_stations -dsco NameField=station

将 KML 文件转换为其他格式
KML 文件格式支持在同一 KML 文件中包含多个数据图层。我们现在将学习如何提取特定数据图层并将其转换为 shapefile。GDAL 支持使用 虚拟文件系统 从 URL 读取数据。我们可以使用 vsicurl/ 前缀从互联网读取 KML 文件。
ogrinfo /vsicurl/https://developers.google.com/kml/documentation/KML_Samples.kml

让我们读取 Paths 图层
ogrinfo /vsicurl/https://developers.google.com/kml/documentation/KML_Samples.kml Paths

要从该 KML 文件中提取 Paths 图层,我们可以使用 ogr2ogr 命令。默认选项会在输出中创建许多不需要的字段。我们可以使用 -select 选项选择输入字段的子集。
ogr2ogr -f "ESRI Shapefile" paths.shp /vsicurl/https://developers.google.com/kml/documentation/KML_Samples.kml Paths -select "NAME,Description"

你还可以将 KML 图层转换为 CSV 文件。GDAL CSV 驱动程序 能够使用 GEOMETRY 图层创建选项提取要素的几何形状。让我们将 KML_Samples.kml 中的 Placemark 图层转换为 CSV 文件,并从几何形状中提取 X、Y 和 Z 列。
ogr2ogr -f CSV points.csv /vsicurl/https://developers.google.com/kml/documentation/KML_Samples.kml Placemarks -lco GEOMETRY=AS_XYZ

KML 与 LIBKML 驱动程序
如果你的 GDAL 二进制文件是在支持 LIBKML 驱动程序 的情况下编译的,则最好使用它而不是 KML 驱动程序。LIBKML 驱动程序支持更多选项,并允许你创建功能齐全的 KML。
下面是使用 LIBKML 驱动程序进行数据转换的示例。要指定名称字段,LIBKML 驱动程序使用名为 LIBKML_NAME_FIELD 的环境变量,可以使用 --config 选项指定。
ogr2ogr -f LIBKML metro_stations.kml spatial_query.gpkg metro_stations --config LIBKML_NAME_FIELD station
如果你的 GDAL 版本同时具有 KML 和 LIBKML 驱动程序,OGR 将首选 LIBKML 驱动程序。要强制 OGR 使用 KML 驱动程序读取文件,你可以向命令添加 --config OGR_SKIP LIBKML。
5.17 分组统计
我们可以在 ogr2ogr 中使用 SQL GROUP BY 子句从图层生成汇总统计信息。让我们首先从 worldcities.csv 图层创建一个 geopackage。
ogr2ogr -oo X_POSSIBLE_NAMES=lng -oo Y_POSSIBLE_NAMES=lat -a_srs EPSG:4326 \
-sql "SELECT city, country, CAST(population as integer) as population from worldcities" \
worldcities.gpkg worldcities.csv -nln worldcities
我们有一个 worldcities.gpkg 图层,其中包含 population 和 country 列。让我们计算每个国家的总人口。我们可以将生成的统计信息保存为 Excel 表格。
ogr2ogr stats.xlsx worldcities.gpkg \
-sql "SELECT country, sum(population) as total_population from worldcities GROUP BY country"
5.18 使用虚拟图层 (Using Virtual Layers)
与 GDAL 类似,OGR 也支持 虚拟文件格式 (VRT)。与栅格版本相比,OGR 虚拟驱动程序功能更强大,可用于动态数据转换。可以使用基于 XML 的 .vrt 格式文件将多个数据图层组合成单个 虚拟 图层。VRT 文件也用于配置将表格数据读取为空间数据格式。
读取 Geonames 文件
你的数据包在 geonames 文件夹中包含 3 个来自 Geonames 的大型文本文件。这些是制表符分隔值 (TSV) 格式的纯文本文件。切换到 geonames 目录。
cd geonames
让我们尝试读取其中一个文件 CA.txt - 其中包含超过 30 万条加拿大地名记录。要读取此文件,我们需要创建一个名为 CA.vrt 的新文件,内容如下。将文件保存在同一 geonames 目录中。
<OGRVRTDataSource>
<OGRVRTLayer name="CA">
<SrcDataSource>CSV:CA.txt</SrcDataSource>
<SrcLayer>CA</SrcLayer>
</OGRVRTLayer>
</OGRVRTDataSource>

让我们检查 OGR 是否可以通过新创建的 CA.vrt 文件读取源文本文件。
ogrinfo -al -so CA.vrt

ogrinfo 命令能够成功读取数据并向我们显示属性摘要以及总要素计数。请注意,OGR 内置了对 geonames 文件格式的支持。因此,它能够正确检测几何列,而无需我们指定。对于其他数据集,你必须通过 VRT 文件中的 <GeometryField> 属性显式指定几何列。
应用过滤器
VRT 格式支持使用 <SrcSQL> 字段对源图层应用 SQL 查询。这允许我们创建一个动态过滤器,仅读取数据的一个子集。使用以下内容更新 CA.vrt。
<OGRVRTDataSource>
<OGRVRTLayer name="CA">
<SrcDataSource>CSV:CA.txt</SrcDataSource>
<SrcLayer>CA</SrcLayer>
<SrcSQL>select * from CA where "FEATCLASS" = 'T'</SrcSQL>
</OGRVRTLayer>
</OGRVRTDataSource>

VRT 文件现在包含一个 SQL 查询,仅从源文件中选择山脉要素。让我们再次运行 ogrinfo 并检查输出。
ogrinfo -al -so CA.vrt

你会看到输出包含要素的子集,即使我们从未更改源数据。
合并文件
VRT 文件格式的真正威力在于它能够将多个数据源动态组合成单个数据图层。我们可以调整以前创建的文件,并使用 <OGRVRTUnionLayer> 从 3 个单独的文本文件创建一个图层。将以下内容保存到名为 NA.vrt 的新文件中。
<OGRVRTDataSource>
<OGRVRTUnionLayer name="NA">
<OGRVRTLayer name="CA">
<SrcDataSource>CSV:CA.txt</SrcDataSource>
<SrcLayer>CA</SrcLayer>
<SrcSQL>select * from CA where "FEATCLASS" = 'T'</SrcSQL>
</OGRVRTLayer>
<OGRVRTLayer name="MX">
<SrcDataSource>CSV:MX.txt</SrcDataSource>
<SrcLayer>MX</SrcLayer>
<SrcSQL>select * from MX where "FEATCLASS" = 'T'</SrcSQL>
</OGRVRTLayer>
<OGRVRTLayer name="US">
<SrcDataSource>CSV:US.txt</SrcDataSource>
<SrcLayer>US</SrcLayer>
<SrcSQL>select * from US where "FEATCLASS" = 'T'</SrcSQL>
</OGRVRTLayer>
</OGRVRTUnionLayer>
</OGRVRTDataSource>

现在让我们使用 ogr2ogr 命令将 NA.vrt 转换为 GeoPackage。
ogr2ogr -f GPKG NA.gpkg NA.vrt -a_srs EPSG:4326
此操作需要大量处理,可能需要几分钟。你可以添加
--config GDAL_CACHEMAX 512选项来加速该过程。有关更多详细信息,请参阅 提高性能的技巧 部分。
此命令读取所有 3 个文本文件,过滤匹配的要素,将它们组合并写出包含北美所有山脉的空间图层。

资源 (Resources)
- GDAL Tips Twitter 上的
@gdaltips - Robert Simmon 的 GDAL 简明介绍 Part-1, Part-2, Part-3, Part-4, Part-5, Part-6, Part-7
- Jeroen Janssens 的 Data Science at the Command Line
数据致谢 (Data Credits)
- Landsat: Landsat-8 图像由美国地质调查局提供。
- Earth at Night 图像: 来源:NASA Earth Observatory/NOAA NGDC。
- William Mackenzie 1870 南印度地图: 从 Hipkiss’s Scanned Old Maps 下载的版权过期扫描地图。
- NAIP 2016 加利福尼亚航空影像: 国家农业影像计划 (NAIP)。USDA-FSA-APFO 航空摄影外业办公室。
- London 1m DSM: 从 Defra Data Services Platform 下载。© Environment Agency 版权所有。
- Melbourne Metro Stations: © 2019 墨尔本市开放数据门户。
- Melbourne Bars and Pubs: © 2019 墨尔本市开放数据门户。
- VIIRS Annual VNL V2 for 2021: C. D. Elvidge 等人。