开放街图的海拔API

5
有没有类似于谷歌地图的开放街图高程API呢?在谷歌高程API中,我们可以传递坐标,并得到海拔作为响应。
4个回答

15

我最近发布了Open-Elevation,这是一个免费且开源的高程API,也可在Github上使用。我们提供免费的公共API以及有关如何设置产品自己实例的文档。

它还可以在Github上获得。

欢迎提交pull请求!


公共API背后的数据不清楚,请添加该信息。 - adr
1
Open-Elevation目前似乎无法正常工作。这有点遗憾,因为它看起来是一个很棒的项目。我花了最近几个小时尝试各种方法,甚至公共API也无法正常工作:( - Alex Horlock
1
服务现在应该更加可靠地运行。遗憾的是,该服务被广泛免费使用,但几乎没有捐赠,因此我一直无法适当地升级它以处理负载。在接下来的一个月中进行迁移(每个月从我的口袋里拿出更多的钱),使其再次可用。 - Jorl17

2

3
还有其他公共数据源可供使用,例如SRTM/CGIAR等。 - Karussell

0

0
看看Open Topo Data。它有一个免费且公开的API,提供不同的数据集,例如,可以尝试使用25米分辨率的欧洲数据集。
https://api.opentopodata.org/v1/eudem25m?locations=50.7827,6.0941|50.651,13.1469

这导致了以下结果:
{
  "results": [
    {
      "dataset": "eudem25m",
      "elevation": 192.93936157226562,
      "location": {
        "lat": 50.7827,
        "lng": 6.0941
      }
    },
    {
      "dataset": "eudem25m",
      "elevation": 635.0579833984375,
      "location": {
        "lat": 50.651,
        "lng": 13.1469
      }
    }
  ],
  "status": "OK"
}

Python示例与Pandas DataFrame。顺序必须是纬度,经度!
import pandas as pd
import requests

# assuming you have lat/long coords in a DataFrame, maybe from geopandas
coords = pd.DataFrame([[53.66, 13.84],
                       [51.71, 13.76],
                       [48.75, 13.76],
                       [53.95, 13.81],
                       [50.94, 13.75]],
                      columns=['lat', 'long'])

# convert to a string for the request, like '53.66,13.84|51.71,13.76|...'
coords_str = coords.to_string(col_space=1, index=False, header=False)
coords_str = ",".join(coords_str.replace('\n', '|').split())

# query Open Topo Data using post request
url = "https://api.opentopodata.org/v1/eudem25m"
req_data = {"locations": coords_str, "interpolation": "bilinear"}
r = requests.post(url, data=req_data)
results = r.json()['results']

# add elevations to DataFrame
elevations = [res['elevation'] for res in results]
coords['elevations'] = elevations
print(coords)

输出:

     lat   long  elevations
0  53.66  13.84    4.061932
1  51.71  13.76  144.021271
2  48.75  13.76  692.658936
3  53.95  13.81   23.207273
4  50.94  13.75  249.106003

对于超过100个位置,请使用分块技术:
results = []
for i, coords in tqdm(all_coords.groupby(all_coords.index // 100)):
    coords_str = ...
    ...
    results += r.json()['results']

要查询单个位置,请查看我的SO答案这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接