技术开发 频道

精通 Grails: Grails 服务和 Google 地图

  【IT168技术文档】自本系列的 第一篇文章 开始,我就一直在构建一个 trip-planner 应用程序。目前基本的模型-视图-控制器(Model-View-Controller,MVC)框架已经准备就绪,我将加入一些外部技术,具体来讲,我将加入地图功能。虽然我可以表示 “我的旅程是从丹佛到罗利,途经圣何塞和西雅图”,但地图将能更好地描述旅途路线。您可能知道西雅图和罗利是在美国的两端,但地图能够帮助您显示出两个城市之间的距离。

  这个应用程序有什么用?本文的末尾为您提供一个大体的介绍。请访问 http://maps.google.com 并在搜索框内输入 IATA 代码 DEN。将出现丹佛国际机场(Denver International Airport),如图 1 所示(更多的 IATA 代码,参见 上个月的文章)。

  图 1. 丹佛机场(由 Google Map 友情提供)  

  除了能显示您在 HTML 表创建的美国机场以外,trip planner 还将在地图上把机场描绘出来。在本文中,我将使用免费的 Google Maps API。我还可以使用免费的 Yahoo! Maps API,等等(参见 参考资料)。一旦了解在线 Web 地图绘制的基本原理之后,您将发现不同的 API 之间能够合理地互换。在讨论该解决方案的地图绘制部分之前,您需要了解如何将一个简单的三个字母的字符串(如 DEN)转换为地图上的一点。

  地理编码

  当向 Google Map 输入 DEN 时,这个应用程序在幕后进行了一些转换。您可能用街道地址(如 123 Main Street)的方式想象地理位置,但 Google Map 需要一个纬度/经度点,以便在地图上把它显示出来。这并不需要您自己设法提供纬度/经度点,应用程序会替您把人类能够识别的地址转换为纬度/经度点。这一转换过程称为地理编码。

  浏览 Web 时,也会发生一个类似的转换。从技术角度来说,联系远程 Web 服务器的惟一方式是提供服务器的 IP 地址。幸运的是,您不需要自己输入 IP 地址。只要将友好的 URL 输入到 Web 浏览器,它将调用域名系统(DNS)服务器。DNS 服务器会将 URL 转换为对应的 IP 地址,然后浏览器与远程服务器建立 HTTP 连接。所有这些对用户而言都是透明的。DNS 使 Web 的使用容易了很多。同样,地理编码器也使基于 Web 的地图绘制应用程序更加容易使用。

  在 Web 上快速搜索免费地理编码器 会产生许多符合 trip planner 地理编码需求的结果。Google 和 Yahoo! 都提供地理编码服务,并把它作为 API 的标准部分,但针对这个应用程序,我将使用由 geonames.org(参见 参考资料)提供的免费地理编码服务。它的 RESTful API 允许我指明我提供的是 IATA 代码,而不是通用的文本搜索术语。比如,ORD 并不是指内布拉斯加州 Ord. 市的居民,ORD 指的是 Chicago O'Hare International Airport。

  在 Web 浏览器中输入 URL http://ws.geonames.org/search?name_equals=den&fcode=airp&style=full。您将看到 XML 响应,如清单 1 所示:

  清单 1. 来自地理编码请求的 XML 结果

<geonames style="FULL">
  
<totalResultsCount>1</totalResultsCount>
  
<geoname>
    
<name>Denver International Airport</name>
    
<lat>39.8583188</lat>
    
<lng>-104.6674674</lng>
    
<geonameId>5419401</geonameId>
    
<countryCode>US</countryCode>
    
<countryName>United States</countryName>
    
<fcl>S</fcl>
    
<fcode>AIRP</fcode>
    
<fclName>spot, building, farm</fclName>
    
<fcodeName>airport</fcodeName>
    
<population/>
    
<alternateNames>DEN,KDEN</alternateNames>
    
<elevation>1655</elevation>
    
<continentCode>NA</continentCode>
    
<adminCode1>CO</adminCode1>
    
<adminName1>Colorado</adminName1>
    
<adminCode2>031</adminCode2>
    
<adminName2>Denver County</adminName2>
    
<alternateName lang="iata">DEN</alternateName>
    
<alternateName lang="icao">KDEN</alternateName>
    
<timezone dstOffset="-6.0" gmtOffset="-7.0">America/Denver</timezone>
  
</geoname>
</geonames>

  您在 URL 中输入的 name_equals 参数是该机场的 IATA 代码。这只是在每个查询中需要更改的 URL 的一部分。fcode=airp 表明您正在搜索的特征代码是一个机场。style 参数 — short、medium、long 或 full — 指定了 XML 响应的详细程度。

  现在已经准备好地理编码器,下一步就是将它与 Grails 应用程序集成在一起。为此,您需要一个服务。

0
相关文章