代码改变世界

Google Map —— The Google Elevation API

2010-07-22 12:56  废墟中的垃圾  阅读(3471)  评论(2)    收藏  举报

The Google Elevation API Google 海拔信息应用程序接口(如有转载请联系本人。)

 

注释:也许这个API已经被很多人所熟知,但是我也发现很多人不知道如何通过Google地图获得海拔信息,所以写了这篇文章。大部分内容来自于API的翻译,如果有误,请大家指正。也欢迎大家进行进交流。

===================================以下为翻译内容===========================================

欢迎大家使用 Google 海拔信息 API 。这里为您查询某个地点的海拔信息提供了一个简单的接口。此外允许您计算某个路径的海拔变化,这样你可以获取沿着路线的抽样海拔信息。

 

注意:这个API 不需要Google 地图的接口开发密钥。 但是在您使用 Google 地图的时候是需要首先注册一个接口密钥的。

 

1. 通过 Google 海拔信息应用程序接口我们可以做些什么?

通过这个接口我们可以提供包括低谷和海洋(返回负值)之内的所有地球表面的所有地点的海拔信息。在您的精确地点请求中,我们返回的海拔信息并不一定是非常精确的,我们会返回一个附近地区的一个平均值。

通过这个接口您可以做一个徒步、单车、移动定位甚至是不是非常精确的测绘应用程序。

您可以通过Http接口访问这个API。Google Map V3版本的用户可以直接使用这个API的 ElevationService() 类。(这里我们在接下来的地方会介绍怎么使用。)

 

2. 适用人群

我们为那些系统通过Google地图应用程序接口进行网站和移动设备开发的开发者提供了这样一个文档。他介绍了Google 海拔信息应用程序接口的使用方法和一些参数的参考信息。

 

有事情要紧急处理,先到这里。

3. 使用限制

Google 还把信息应用程序接口每天只允许2.5万个位置的信息查询, 高级用户可以把这个数字提高到100万。需要注意的是,我们可能一次查询多个地点的海拔信息,我们是按照地点的数目来计算您的查询信息数,而不是只计算一次。一直到2.5万个地点信息(高级用户100万个)我们都会允许独立的请求。这样的限制是为了防止接口的滥用,当然这个限制在未来可能会在不通知的情况下被修改。此外,我们也会限制搜索的频率。如果您超过了24小时的限制,或者滥用了接口,我们会临时性的停止给您提供服务。如果您继续超过这个限制,您的接口账号将被锁定而不能使用。

接口对于某单一点的查询会返回比较精确的海拔信息,如果是批量的查询,精确度将会降低,特别是在一些海拔延伸阶段,我们会返回一些平滑的数据。

需要强调的是,在url编码之前我们最大接受的url长度为2048字节,如果您要进行多个地点的海拔信息查询,请注意这个限制。

提示:接口只允许在配合显示Google地图的时候使用。在不展示google地图的前提下使用Google海拔信息是不会允许的。完整的使用规范请查看 Maps API Terms of ServiceLicense Restrictions 。

4. 海拔请求

海拔信息接口返回地球上任何地点的海拔信息。您有两种方法来指定地点的具体位置:

1) 一个或者多个点的集合

2) 某一个路径的一系列点

这两种方法比较相似都是使用经纬度来确定点或者路径节点的位置。说明文档介绍了接口URL的数据格式和属性说明。

海拔信息接口的URL格式必须是这样的

http://maps.google.com/maps/api/elevation/outputFormat?parameters

输出格式

接口的输出格式是在请求的URL里面被指定的。目前我们支持一下两种数据格式:

1) json 使用Json对象返回

2) xml  返回数据使用xml信息,包裹在<ElevationResponse>节点中

参数使用

基于我们是查询点还是路径,对于Google 海拔信息应用程序接口的请求我们会使用不同的参数。对于分散的点,我们在请求的时候返回的是明确的点的数据信息。对于路径来说,是返回路径上一些抽样的点。

根据URL参数的标准,参数都用 “&” 来进行分割。下面我们来介绍参数和他们可能的值。

1、 地点请求

位置信息(必须):地球表面的位置的位置信息需要被定义从而才可以返回海拔信息。参数可以是一个使用逗号分开的经纬度的数据对(例如"40.714728,-73.998672"),或者一个多个经纬度数据对的数组,又或者是编码过的线。更多的信息可以参考下面的信息 Specifying Locations。

或者

2、 简单路径请求

路径(必须):地球表面的某一个路径的路径信息需要被定义从而才可以返回海拔信息。参数是沿着地球表面的用来定义这个路径的两个或者更多个的经纬度数据对。参与必须基于抽样的参数,具体说明在下面。更多信息请查看Specifying Paths

抽样:被指定数量的抽样位置信息从而获得海拔信息。抽样数据时这个路径上等距的一系列点。

3、 汇报参数

传感器(必须):应用程序的请求是否使用传感器来确定用户的位置。所有的请求都需要这个参数。更多的信息请查看Denoting Sensor Usage

 规范的地点

地点的请求是通过指定的地点的位置信息,通过经纬度的数据对来进行请求。

地点参数需要一下的参数:

独立坐标:locations=40.714728,-73.998672

坐标的数组是使用 “|” 进行分割:locations=40.714728,-73.998672|-34.397,150.644

通过线编码规则的多个点的集合:locations=enc:gfo}EtohhU

经纬度坐标字符串是有逗号分割的字符串。例如:"40.714728,-73.998672" 就是一个有效的地点值。经纬度的值必须符合地球表面的经纬度值。纬度可以去 -90 到 +90之间的任何值,精度可以取 -180 到 180之间的任何值。如果您请求了一个不符合规范的经纬度值,我们会认为这是一次错误的请求。

在没有超过每天的数量限制和url长度限制的前提下,您可以请求任意多个地点的海拔信息。当然多个点的请求会比单一点的海拔请求返回的信息精确度要稍微低一些。

规范的路径

这里的信息和地点的差不多,暂不翻译了。

传感器标识的使用方法

Google 海拔应用程序接口的使用必须确定是否使用传感器来确定用户的位置。这一点对于手持设备更加的重要。

应用程序决定使用传感器来确定位置就必须在请求路径里面设置 sensor=true .如果您的应用程序不需要传感器则需要设置 sensor=false

5. 海拔输出

海拔应用程序接口会对于每一个正确的请求会返回在请求URL中指定的格式的返回信息。每一个返回信息包括以下的元素:

1) 海拔状态分为

OK  表示请求成功

INVALID_REQUEST   表示API请求出错

OVER_QUERY_LIMIT  标识超出了请求限制

REQUEST_DENIED 表示没有完成的请求,例如传递的参数没有设置 sensor 这个参数

UNKNOWN_ERROR 表示未知的错误

2) 结果的数组元素

地点的位置信息元素(包含精度和纬度两个元素)是海拔计算所需要的。如果是路径计算,则包括沿着这个路径抽取的一系列点的集合。

海拔元素使用米作为单位进行表示。

地点的海拔例子

下面是请求丹佛城、卡罗拉多和里高城的某一个海拔信息

 

http://maps.google.com/maps/api/elevation/json?locations=39.7391536,-104.9847034&sensor=true_or_false
{
"status": "OK",
"results": [ {
"location": {
"lat": 39.7391536,
"lng": -104.9847034
},
"elevation": 1608.8402100
} ]
}

下面是请求上面三个城市的请求格式

 

 

http://maps.google.com/maps/api/elevation/json?locations=39.7391536,-104.9847034|36.455556,-116.866667&sensor=true_or_false

 

{
  "status": "OK",
  "results": [ {
    "location": {
      "lat": 39.7391536,
      "lng": -104.9847034
    },
    "elevation": 1608.8402100
  }, {
    "location": {
      "lat": 36.4555560,
      "lng": -116.8666670
    },
    "elevation": -50.7890358
  } ]
}

以下是以xml格式发送请求和返回的结果

 

http://maps.google.com/maps/api/elevation/xml?locations=39.7391536,-104.9847034|36.455556,-116.866667&sensor=true_or_false
<ElevationResponse>
 <status>OK</status> 
 <result> 
  <location> 
   <lat>39.7391536</lat> 
   <lng>-104.9847034</lng> 
  </location> 
  <elevation>1608.8402100</elevation> 
 </result> 
 <result> 
  <location> 
   <lat>36.4555560</lat> 
   <lng>-116.8666670</lng> 
  </location> 
  <elevation>-50.7890358</elevation> 
 </result> 
</ElevationResponse>

路径海拔例子

 

 

下面的例子是请求从加利福尼亚的惠妮特山到坏水河的,美洲大陆的最高点和最低点。我们设置三个取样点,所以包括两个端点和一个中间点。

 

http://maps.google.com/maps/api/elevation/json?path=36.578581,-118.291994|36.23998,-116.83171&samples=3&sensor=true_or_false
{
  "status": "OK",
  "results": [ {
    "location": {
      "lat": 36.5785810,
      "lng": -118.2919940
    },
    "elevation": 4411.9418945
  }, {
    "location": {
      "lat": 36.4115029,
      "lng": -117.5602608
    },
    "elevation": 1381.8616943
  }, {
    "location": {
      "lat": 36.2399800,
      "lng": -116.8317100
    },
    "elevation": -84.6169968
  } ]
}

创建海拔图表

 

海拔数据必须和Google地图配合使用。图表应用程序接口(http://code.google.com/apis/chart/)可以很好的配合海拔应用程序接口在您的地图旁边绘制海拔图表。

下面是python写的是在加利福尼亚的惠妮特山、坏水河和死谷之间绘制的高度图表。

 

import simplejson
import urllib

ELEVATION_BASE_URL = 'http://maps.google.com/maps/api/elevation/json'
CHART_BASE_URL = 'http://chart.apis.google.com/chart'

def getChart(chartData, chartDataScaling="-500,5000", chartType="lc",chartLabel="Elevation in Meters",chartSize="500x160",chartColor="orange", **chart_args):
    chart_args.update({
      'cht': chartType,
      'chs': chartSize,
      'chl': chartLabel,
      'chco': chartColor,
      'chds': chartDataScaling,
      'chxt': 'x,y',
      'chxr': '1,-500,5000'
    })

    dataString = 't:' + ','.join(str(x) for x in chartData)
    chart_args['chd'] = dataString.strip(',')

    chartUrl = CHART_BASE_URL + '?' + urllib.urlencode(chart_args)

    print chartUrl

    def getElevation(path="36.578581,-118.291994|36.23998,-116.83171",samples="100",sensor="false", **elvtn_args):
      elvtn_args.update({
        'path': path,
        'samples': samples,
        'sensor': sensor
      })

      url = ELEVATION_BASE_URL + '?' + urllib.urlencode(elvtn_args)
      response = simplejson.load(urllib.urlopen(url))

      # Create a dictionary for each results[] object
      elevationArray = []

      for resultset in response['results']:
        elevationArray.append(resultset['elevation'])

      # Create the chart passing the array of elevation data
      getChart(chartData=elevationArray)

if __name__ == '__main__':
    # Mt. Whitney
    startStr = "36.578581,-118.291994"
    # Death Valley
    endStr = "36.23998,-116.83171"

    pathStr = startStr + "|" + endStr

    getElevation(pathStr)

下面的图片是最终的显示效果

 

显示结果

海拔图表

 

以上是 Google 海拔信息的API 文档说明。如果错误请大家指出。