将 GIS 矢量数据转换为 KML

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

目标

本教程介绍了使用 OGR 开源库将 GIS 矢量数据转换为 KML 的基础知识。虽然这些库可用于大多数 GIS 文件,但本教程将重点介绍如何使用 ESRI 形状文件。

简介

地理位置数据可通过网络上的多种形式提供。KML 是最常用的文件格式之一,但也采用了许多其他文件类型。大型公司、政府和非政府组织利用地理位置信息系统以及专门的文件格式来制作自己的地图。这些应用通常需要经过专业培训,或需要大量时间进行学习。专有价格可能非常昂贵。另一方面,这些工具非常强大,可为专业地图制作人员提供一组丰富的地图工具。

许多政府实体会开放部分 GIS 数据供公众使用。借助 Data.gov马萨诸塞州地理信息系统DataSF 等门户,可以轻松查找所在社区的数据。本文介绍了如何将矢量数据(即由点、线和多边形等简单几何图形构成的数据)转换为 KML。这样您便可以访问各种不同类型的数据,包括:

  • 表示建造地块边界的地块数据
  • 突发事件数据,例如犯罪报告
  • 边界数据,表示市、州、县、省等的边界。
  • 道路数据,包括规划的道路和现有道路
  • 施工许可证,注明签发地点
  • 健康数据,例如描述流感爆发事件的地点

目前有许多优秀的应用可用于进行数据转换,如 Google 地球 Proshp2KMLKML2KMLArc2Earth 等等。本文将重点介绍如何使用命令行形式的开源地理空间数据抽象库 (GDAL) 实用程序将矢量数据转换为 KML,以便在 Google 地球或 Google 地图中使用,并且也许会启发您将这些库整合到您自己的应用中。

关于文件类型的注意事项

虽然本文逐步介绍了将 ESRI 形状文件转换为 KML 的操作步骤,但 GDAL 实用程序(尤其是 OGR)可用于从各种文件类型(包括 CSVPostGRES/PostGIS 数据库以及各种其他格式)进行转换。我们将支持您遇到的大多数主要数据格式。如果发现不支持的格式,则可以编写 OGR 的驱动程序,因为它是开源库。

Shapefile

ESRI 的常用形状文件格式是最常见的 GIS 数据格式之一。虽然从技术上来说,shapefile 是带有 .shp 扩展名的单个文件,但 .shp 本身不能打开。该文件至少需要一个 .dbf 和 .shx 文件,并且还有其他多种文件,用于各种用途。因此,如果您看到对 shapefile 的引用,这通常意味着文件的集合,通常某种压缩文件集中在一起,在本文的其余部分,我们将使用“shapefile”一词。

Shapefile 包含大量关于其描述的地理区域的信息。它们说明了实际几何图形、有关几何图形的元数据、所使用的空间参考系统的信息,以及数据的许多其他方面。在本文中,我们最关注的是几何图形、元数据和空间参考系统。

几何图形和元数据是很简单的概念。几何图形是点、线和多边形,可使用 KML 轻松表示。元数据是有关数据的数据,通常用于过滤或查询。例如,一条描述道路的线可能包含有关道路类型(市政街道、国道、转弯机等)、速度限制、资金提供方、规模等的元数据。

空间参考系统 (SRS) 用于标识用于创建矢量数据的坐标系和投影。KML 采用 WGS84 坐标系中的纬度和经度。不过,还有其他方法可用于识别地图上的坐标。热门工具包括:通用横轴墨卡托投影英国国家网格州平面系统。要将数据转换为 KML,您可能需要找出该信息。KML 仅支持 WGS84。通常,shapefile 会随身携带这些信息,通常是存储在 .prj 文件中,而 OGR 可以从那里检测该信息。不过,有时必须确定 SRS。有时,数据源以某种形式在数据源下载页面上提供,或者在包含下载内容的自述文档中或其他格式中提供。通常情况下,这样就足够了。空间参考网站包含有关 SRS 的更多信息,并且提供了用于查找单个参考系统的参考。

ogr2ogr

GDAL 提供了一组强大的库来处理矢量数据。具体来说,ogr2ogr 是一个强大的数据转换实用程序。许多应用(包括上述某些应用)都纳入了 GDAL/OGR。

首先,请下载并安装 GDAL。然后,您需要一个形状文件。在本教程中,请尝试使用 DataSF 中的相应代码。以下示例使用的是 realtor_neighborhoods 形状文件,您可以在同意其许可后(点击此处获取该文件)。下载文件后,将其解压缩到一个您能记住的目录中。打开命令行,然后导航至您将数据存放到的目录。接下来是充满乐趣的部分。

可从命令行中轻松使用 ogr2ogr。将 realtor_neighborhoods 从 Shapefile 转换为 KML 的方法如下:

ogr2ogr -f "KML" -where "NBRHOOD='Telegraph Hill'" realtor_neighborhoods.kml realtor_neighborhoods.shp

此命令的作用如下所示:

  • ogr2ogr:这是核心命令。
  • -f "KML:将输出格式设置为 KML。
  • -where "NBRHOOD='Telegraph Hill'":这是一个可选的 where 子句,如在 SQL 中。基本上,它允许您根据元数据查询数据。它支持形状文件和其他支持查询的文件类型。在本例中,它查询 NBRHOOD 字段,并且仅选择 NBRHOOD 为 Telegraph Hill 的功能。如果您关闭此参数,ogr2ogr 会为您提供每个街区多边形。
  • realtor_neighborhoods.kml:这是输出文件名。输出文件名在前。
  • realtor_neighborhoods.shp:这是输入文件名。.shp 文件代表整个形状文件。

就是这么简单。此命令会编写如下所示的 KML 文件:

<?xml version="1.0" encoding="utf-8" ?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document><Folder><name>realtor_neighborhoods</name>
    <Schema name="realtor_neighborhoods" id="realtor_neighborhoods">
      <SimpleField name="Name" type="string"></SimpleField>
      <SimpleField name="Description" type="string"></SimpleField>
      <SimpleField name="OBJECTID" type="float"></SimpleField>
      <SimpleField name="NBRHOOD" type="string"></SimpleField>
      <SimpleField name="SFAR_DISTR" type="string"></SimpleField>
    </Schema>
    <Placemark>
      <ExtendedData><SchemaData schemaUrl="#realtor_neighborhoods">
        <SimpleData name="OBJECTID">81</SimpleData>
        <SimpleData name="NBRHOOD">Telegraph Hill</SimpleData>
        <SimpleData name="SFAR_DISTR">District 8 - Northeast</SimpleData>
      </SchemaData></ExtendedData>
      <Polygon><outerBoundaryIs><LinearRing><coordinates>-122.41041847319012,37.805924016582715,0 -122.407203813674,37.806324902060979,0 -122.40667792852096,37.803710121958744,0 -122.40348255423899,37.804117462290641,0 -122.40237202127015,37.798540648764529,0 -122.40876046662795,37.797723222540775,0 -122.41041847319012,37.805924016582715,0</coordinates></LinearRing></outerBoundaryIs></Polygon>
      <Style><LineStyle><color>ff0000ff</color></LineStyle>  <PolyStyle><fill>0</fill></PolyStyle></Style>
    </Placemark>
  </Folder></Document></kml>

您可以看到,Shapefile 中的元数据在 SchemaSimpleData 元素中得以保留。如需详细了解如何使用 ExtendedData 和如何保留自定义数据,请参阅添加自定义数据的 KML 开发者指南。

后续操作

GDAL/OGR 可为您提供超强的能力。在最简单的实现方式中,您现在可将所有数据转换为 KML,以便在 Google 地球、Google 地图或其他任何支持 KML 的地理浏览器中使用。不仅如此,您还可以将 GDAL/OGR 库整合到应用中,从而将 GIS 数据自动转换为 KML,并控制该转换的输出。请尝试将此文件与 libKML 结合使用,以便通过编程方式更好地控制您的 KML 世代。