使用 gdal2tiles 创建超级叠加层

Mano Marks,Google Geo API 团队
2009 年 9 月

目标

本教程将为您介绍有关使用开源地理空间数据抽象库实用程序创建超级叠加层(一系列使用基于区域的 NetworkLink 的地面叠加层)的基础知识。

简介

Google 地球和 Google 地图等地理浏览器可为您提供卫星图像和地图图块。不过,有时您可能需要使用自己的文件。图像或光栅数据有多种形式,用途有很多。

  • 在地理浏览器中放置自己的卫星或航拍图像
  • 在现有图像(例如 Google 地球中的 Rumsey 地图图层)上方放置历史地图
  • 以光栅形式导入 GIS 数据
  • 在地理浏览器中放置激光雷达或红外图像

然而,高分辨率光栅数据有一个问题,即显示这些数据需要大量的内存。如果您通过网络全面推出这项功能,那么您也会担心带宽问题。要解决此问题,您必须创建卡片。

平铺操作会将您的图片文件拆分为多个可在用户进入视野时加载的图片。您需要创建一张低分辨率图片,以便在用户缩小时显示。在同一区域,您创建了四张分辨率更高的图片,以便于进一步查看。对于图片上叠加的每个区域,您可以制作四张分辨率更高的图片,以便进一步放大等。这称为四叉树方法,也是 Google 地球和 Google 地图平铺图像的方式。如需了解相关流程,请参阅 KML 开发者指南中关于区域的文章。

您可以使用图形化编辑应用(例如 Adobe PhotoShop 或 GIMP)手动执行此操作,但这种做法可能非常复杂和繁琐,而且容易出错。此外,还有一些主要适用于 Windows 的优质应用,例如 SuperOverlayArc2EarthMapCruncherCrunchUp2KML 组合使用。

如果要自动执行此过程,或向您自己的应用添加功能,GDAL 为您提供了一组丰富的光栅和矢量数据处理工具。本文将介绍命令行选项。不过,也可以轻松地将这些库整合到您自己的应用中。在本教程中,您将使用 gdalinfogdal_translategdalwarpgdal2tiles 实用程序。最终的输出是超级叠加层。

命令行步骤

在命令行中使用 GDAL 有六个步骤。

  1. 下载并安装 GDAL
  2. 下载图片
  3. 使用 gdalinfo 确定图片的相关信息
  4. 使用 gdal_translate 对图片进行地理引用
  5. 使用 gdalwarp 更改图片的投影
  6. 使用 gdal2tiles 将图像分解为图块并创建关联的 KML 代码

第 1 步:下载并安装 GDAL

首先,如此处所述,下载并安装 GDAL。

第 2 步:下载图片

您可以使用任意图片。网络上的地理数据的来源有很多。您可以使用其中的任何一个,但您应该知道图片的边界,即图片的每个角的纬度和经度。本教程使用了 NASA 蓝色大理石图片,可通过 NASA 网站下载。这些图像拍摄于 2004 年,呈现了从太空看地球的精美图像。选择右侧导航栏右下角的一个文件。

如果您使用的是自己的图像,并且知道该图像已经经过地理校正,则可以跳到第 5 步。否则,请继续执行第 3 步。

第 3 步:获取图片的相关信息

安装 GDAL 库并选择图片后,您需要获取图片的一些信息,以便对其进行地理引用。具体而言,您需要图片每个角的像素和线条位置。如果您将图片想象成一个表格,其中包含多列和多个行,那么像素就是列,而行则是行。

GDAL 提供了一个方便的实用程序 gdalinfo,用于捕获此信息。在命令行中,只需输入 gdalinfo filename,并将 filename 替换为文件的路径。输出结果应如下所示:

Driver: JPEG/JPEG JFIF
Files: world_200401.jpg
Size is 21600, 10800
Coordinate System is `'
Image Structure Metadata:
  SOURCE_COLOR_SPACE=YCbCr
  INTERLEAVE=PIXEL
  COMPRESSION=JPEG
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0,10800.0)
Upper Right (21600.0,    0.0)
Lower Right (21600.0,10800.0)
Center      (10800.0, 5400.0)
Band 1 Block=21600x1 Type=Byte, ColorInterp=Red
  Image Structure Metadata:
    COMPRESSION=JPEG
Band 2 Block=21600x1 Type=Byte, ColorInterp=Green
  Image Structure Metadata:
    COMPRESSION=JPEG
Band 3 Block=21600x1 Type=Byte, ColorInterp=Blue
  Image Structure Metadata:
    COMPRESSION=JPEG

本教程中的重要信息是左上角、左下角、右上角、右下角线。通过这些数据了解每个角的像素值和线值。在本例中,左上坐标为 0,0,右下坐标为 21600,10800。

第 4 步:对图片进行地理引用

在这种情况下,地理参考意味着创建元数据,用于描述图片的每个角的地理位置。使用第 3 步和 gdal_translate 获得的信息,您可以将地理参考信息分配给文件。此操作会基于 world_200401.jpg 映像 (bluemarble1.vrt) 创建一个 VRT 文件。VRT 文件是包含特定转换相关信息的 XML 文件,在本示例中为 gdal_translate 步骤。您将在下一步中再次使用它来创建最后一组卡片。借助 gdal_translate,您可以执行多种文件输出类型,包括主要的图片文件格式。使用 VRT 输出可基本上延迟到创建输出文件,直到最后一步。使用命令行可提高效率并缩短各个步骤的等待时间。您需要运行的命令如下:

gdal_translate -of VRT -a_srs EPSG:4326 -gcp 0 0 -180 90 -gcp 21600 0 180 90 -gcp 21600 10800 180 -90 world_200401.jpg bluemarble1.vrt

这行代码包含大量信息,下面对其进行了细分:

  • -of 是输出格式,在本例中为 VRT。
  • -a_srs 用于为文件分配空间引用系统。这会告知任何使用它的应用所使用的坐标系。在本例中,它使用的是 EPSG:4326,它与 WGS84(Google 地球使用的坐标系)相同。
  • -gcp 即地面控制点,用于为文件中的位置分配坐标。在本例中,您实际上只需要 3 个点,因为图像是矩形,所以很容易识别第 4 个点。对于 -gcp,请依次设置像素、行号、经度和纬度来定义 gcp。以上各项之间用空格分隔。
  • 最后两个参数是源文件和目标文件。

第 5 步:扭曲图片

原始图片不是为圆球而设计的,而是表面平坦。用 GIS 的术语来说,投影是指投影,也就是说,它是三维对象的二维表示。投影时需要扭曲图像,使地球看起来像平面的平坦图像。

为使图片看起来正确,您必须扭曲图片以适合地球。幸运的是,GDAL 也提供了一个很好的工具。只需输入 gdalwarp -of VRT -t_srs EPSG:4326 bluemarble1.vrt bluemarble2.vrt 即可。这将创建一个新文件 bluemarble2.vrt,该文件会提供关于翘曲过程的元数据。

第 6 步:创建卡片

即将大功告成,但这一部分花费的时间最长。如需创建图块,请输入 gdal2tiles.py -p geodetic -k bluemarble2.vrt-k 会强制执行 KML 输出。这将创建一个具有超级叠加层的目录结构。因为每个图片文件都必须单独创建,所以运行需要一些时间。现在,对于大型图片,您可以去喝杯咖啡、小睡一会,或者去吃便餐。完成后,请打开 doc.kml 并查看结果!

总结

本教程只介绍了 GDAL 的功能,但它提供了一个生成图块的便捷机制。核心 GDAL 库是用 C++ 编写的,但它们为 Perl、Python、VB6、R、Ruby、Java 和 C#/.NET 提供了绑定,这意味着您可以轻松将 GDAL 整合到您自己的应用中。此外,包括 gdal2tiles 在内的许多实用程序都是用 Python 编写的,因此可以轻松地整合到 Python 应用中。gdal2tiles还可以生成Google Maps APIOpenLayers页面。