内容


真正的 Web 2.0

Geonames.org 上的开放地理信息系统

探索一个可以处理位置和地点名称的免费开放站点

系列内容:

此内容是该系列 # 部分中的第 # 部分: 真正的 Web 2.0

敬请期待该系列的后续内容。

此内容是该系列的一部分:真正的 Web 2.0

敬请期待该系列的后续内容。

Web 的动人之处在于您经常会遇到某些资源,而几个星期之后不禁感叹如果没有这些资源自己该如何是好。而 Web 2.0 开放数据的动人之处(也是本专栏的焦点所在)则在于这类资源有时包括了在 Web 中创建自己的一席之地所需要的全部数据。GeoNames 就是这样一个站点和服务,它本身就是一个不可或缺的资源,而且还是其他 必需服务的重要组成部分。此站点围绕经良好设计且可免费使用的地理信息数据库构建。其主页很好地描述了这一点:

GeoNames 地理信息数据库可在知识共享归属许可下免费下载。它包含 800 万个地理名称,由 650 万个特征组成,其中包括 220 万个居住地和 180 万个备用名称。所有特征均分门别类地放入 9 个特征类,这些特征类再细分为 645 个特性代码。[...]。数据可通过一系列 web 服务和数据库导出免费使用。GeoNames 现可服务每天 1100 多万次的 web 服务请求。[...] 。GeoNames 也在集成各种地理信息数据,比如不同语言的地名、海拔、人口数量和其他一些信息。

在本文中,我将向您展示 GeoNames 为用户和开发人员提供的主要特性。

GeoNames 主页

在本专栏中,我将站点的主用户页面称为站点的主页(façade),将开放数据的接口称为基础。GeoNames 主页 是用来指出确切位置的有用工具。假设您正在阅读一本小说,在小说中提及了科罗拉多的一个小镇,名为 “Superior”。您可以直接登录这个站点并在主搜索框内输入 “Superior, Colorado”。显示结果应该如图 1 所示。

图 1. GeoNames 针对 “Superior, Colorado” 的搜索结果
GeoNames 搜索结果
GeoNames 搜索结果

就搜索引擎而言,最顶部的结果通常与所查找内容最为接近,可以单击本地名 “Superior” 或是单击左侧的地图推针(push-pin)图标。但是得到的结果不同。单击本地名会转到一个由 Google 地图支持的信息页面,给出此位置的纬度和经度,在本例中,这个信息页面是 http://www.geonames.org/maps/google_39.953_-105.169.html (一个整洁、干净、不容易攻击的 URL,这也是 GeoNames 的优势之一)。此位置位于 Boulder County 的东南角,并且地图包含了多个特性:所查询的地区(Superior 镇本身)、诸如山和湖这样的地理特性、一些显著的建筑和其他地标(比如本地邮局)。图 2 是此页面的一个快照。

图 2. GeoNames 内的纬度/经度地区页面
纬度/经度地区页面
纬度/经度地区页面

注意到此地区的图标是与顶部搜索结果(图 1)相关联的那个图标相同的 “P” 形推针(泪滴形状)。如果返回那个搜索结果页并单击该图标,就会得到针对该具体特性放大的更详细的地图,这次由不同的 URL http://www.geonames.org/5440838/superior.html 给出。图 3 是此页面的一个快照。

图 3. GeoNames 内的具体特性页面
具体特性页面
具体特性页面

基础

您可能已经注意到 GeoNames 非常有助于您对地理位置上下文的了解,而不管您的起点如何,但是,让此服务如此有特色的还是它的开放数据基础。您可以下载此站点的全部数据库转储文本,而且得益于知识共享归属许可,您还能免费使用它,该许可只要求您确认如果使用了服务,还会链接回 GeoNames。此服务可以在 Web 或其他的商业应用程序内使用。

您也可以通过其丰富的 Web 服务来使用 GeoNames。它是基于 REST 风格设计的,所以您可以使用任何用来从 URL 请求数据的代码。在 GeoNames 上所能执行的查询的种类很多。如下所示的是其中一个例子:

  • 找到某个邮编所代表位置的周边地区,按国家返回(返回 XML 文件或 JSON 提要)。
  • 找到接近给定纬度/经度的邮编(返回 XML 文件)。
  • 找到具有给定地理特征的 “子集(例如,某个国家的省、该省管辖的各地区,返回 XML 文件或 JSON 提要)。
  • 找到接近给定纬度/经度、邮编或地名的相关 Wikipedia 文章(返回 XML 文件或 JSON 提要).
  • 找到某个国家的所有邻国(返回 XML 文件或 JSON 提要)。
  • 找到由 4 个纬度/经度对所确定的地理范围内的全部气象台及其最新的气象观测(返回 XML 文件)。
  • 获得给定纬度/经度所在的时区(返回 XML 文件或 JSON 提要)。
  • 获得代表陆地地区的纬度/经度所对应的以米为单位的海拔(返回 XML 文件或 JSON 提要)。

真正的 Web 3.0

GeoNames 不仅是 Web 2.0 最有用的支持站点,而且现在也是构成 “Web 3.0”(Semantic Web)的一部分。在本专栏的早期文章(参见 参考资料)中,我讨论过 Linking Open Data (LOD),它是 Semantic Web 出现的最初推动力。GeoNames 是 LOD 的关键部分,这归功于其对地理 RDF 元数据的支持(实际上,它支持非常详细的本体论以尝试建立清晰的上下文)。在之前的讨论中,我论及了使用 HTTP 303 代码将 URI 赋予非计算性资源,比如人和抽象的属性。GeoNames 使用这种方式为各个地区提供适合 Semantic Web 的 URI。以上述 Colorado Superior 镇的 URI http://www.geonames.org/5440838/superior.html 为例,将 “www” 替换为 “sws” 并删除文件部分,就得到了 GeoNames Semantic Web URI http://sws.geonames.org/5440838/。如果通过支持 RDF 的代理访问它,就会得到如清单 1 所示的 303 重定向:

清单 1. 对 GeoNames 的 Semantic Web 请求
    $ curl -I -H "Accept: application/rdf+xml"
    http://sws.geonames.org/5440838/HTTP/1.1 303 See Other
Date: Mon, 07 Jul 2008 05:23:47 GMT
Server: Apache/2.2.4 (Linux/SUSE)
Location: http://sws.geonames.org/5440838/about.rdf
Vary: Accept-Encoding
Content-Type: text/html; charset=iso-8859-1

cURL 是用来打造 HTTP 请求的一个命令行工具,该工具可以针对几乎所有类型的请求进行配置。 我通过头部设置 -H "Accept: application/rdf+xml" 向服务器给出 Semantic Web 代理的信号,这样的头部设置表明用户代理期待的是一个 RDF 响应。 我还使用了 -I 选项来要求它使用 HTTP HEAD 请求,只获得响应头。您可以看到 303 响应代码,而且 Semantic Web 代理可以遵循 Location: http://sws.geonames.org/5440838/about.rdf 响应头来获得有关此地区的更多信息,如清单 2 所示。

清单 2. 对某个 GeoNames 地区的 RDF 数据的 cURL 请求
    $ curl -H "Accept: application/rdf+xml" http://sws.geonames.org/5440838/about.rdf
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<rdf:RDF
    xmlns="http://www.geonames.org/ontology#"
    xmlns:foaf="http://xmlns.com/foaf/0.1/"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:wgs84_pos="http://www.w3.org/2003/01/geo/wgs84_pos#">
<Feature rdf:about="http://sws.geonames.org/5440838/">
<name>Superior</name>
<featureClass rdf:resource="http://www.geonames.org/ontology#P"/>
<featureCode rdf:resource="http://www.geonames.org/ontology#P.PPL"/>
<inCountry rdf:resource="http://www.geonames.org/countries/#US"/>
<population>11186</population>
<wgs84_pos:lat>39.9527634</wgs84_pos:lat>
<wgs84_pos:long>-105.1685977</wgs84_pos:long>
<parentFeature rdf:resource="http://sws.geonames.org/5574999/"/>
<nearbyFeatures rdf:resource="http://sws.geonames.org/5440838/nearby.rdf"/>
<locationMap>http://www.geonames.org/5440838/superior.html</locationMap>
<wikipediaArticle rdf:resource="http://en.wikipedia.org/wiki/Superior%2C_Colorado"/>
<owl:sameAs rdf:resource="http://dbpedia.org/resource/Superior%2C_Colorado"/>
<wikipediaArticle rdf:resource="http://de.wikipedia.org/wiki/Superior_%28Colorado%29"/>
<wikipediaArticle rdf:resource="http://nl.wikipedia.org/wiki/Superior_%28Colorado%29"/>
<wikipediaArticle rdf:resource="http://pt.wikipedia.org/wiki/Superior_%28Colorado%29"/>
<wikipediaArticle rdf:resource="http://vo.wikipedia.org/wiki/Superior_%28Colorado%29"/>
</Feature>
</rdf:RDF>

请注意,这里没有使用 -I 选项,因此得到的将是响应体。如果还想得到响应头,可以使用 -i 选项。结果 RDF 文档包括很多有关此资源的有用信息,所有内容均根据 GeoNames ontology 提供。除了能得到用来提供此地区的常用名的 name 属性之外,有时还会得到 alternateName,它能提供地名的其他版本,包括其他语言的地名版本。纬度和经度根据 W3C “Basic Geo (WGS84 lat/long) Vocabulary” 的要求给出。父特征 http://sws.geonames.org/5574999/ 指的是 Boulder County。locationMap 属性给出的是我在第一节中提到的那个用户友好的地图显示。 owl:sameAs 给出的是 DBPedia 上的抽象资源,DBPedia 是另一个重要的 LOD 站点,它提供了 Wikipedia 文章的 Seman tic Web 版本。您还可以看到指向 Wikipedia 的直接链接,包括除英语之外的其他语言的链接。

请注意,如果在访问 sws.geonames.org 时省略了 Accept 头,或者如果对 Accept: */* 使用了典型的浏览器设置,那么得到的将不是到 RDF 的 303 重定向,而是到用户地图视图的 301(永久)重定向。其主要目的是避免那些尚不支持 Semantic Web 约定的客户机产生混淆。

结束语

GeoNames 的使用几乎是无止境的,这主要得益于它在易于使用的数据平台上综合了丰富的地理信息。您不必过多考虑该平台的细节,因为现在已经有了很多针对 GeoNames 的客户机库,并且语言版本众多,包括 Java、Python、Ruby 和 Perl。总之,相关工具、库、插件等领域都在迅速发展,这一点与其他任何一种有用的服务无异。在享用 GeoNames 带来的各种好处的同时,也请您考虑为之做出自己的贡献,或自愿担任它的代表。最近我注意到 Nigeria 地区缺少一个代表,我就自告奋勇担任了此职。


相关主题

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Web development
ArticleID=349111
ArticleTitle=真正的 Web 2.0: Geonames.org 上的开放地理信息系统
publish-date=10312008