可以在Python中使用geopy得到经度/纬度的海拔高度吗?

2024-03-29 13:35:49 发布

您现在位置:Python中文网/ 问答频道 /正文

有可能吗?

我试过:

from geopy.point import Point
from geopy import geocoders
[...]
p = Point(Latitude, Longitude)
lat, lon, altitude = p
height_metres = altitude

但是高度总是0。


Tags: fromimport高度pointlonlatheightgeopy
3条回答

请注意,使用geocoder,您将需要一个Google elevation API密钥,该密钥现在需要一个启用计费的项目(截至2018年7月)。

作为替代方案,您可以使用open elevation公共API。下面是一个返回高程的示例函数(请注意,python 3.6用于字符串格式设置):

import requests
import pandas as pd

# script for returning elevation from lat, long, based on open elevation data
# which in turn is based on SRTM
def get_elevation(lat, long):
    query = ('https://api.open-elevation.com/api/v1/lookup'
             f'?locations={lat},{long}')
    r = requests.get(query).json()  # json object, various ways you can extract value
    # one approach is to use pandas json functionality:
    elevation = pd.io.json.json_normalize(r, 'results')['elevation'].values[0]
    return elevation

注意,API在未来可能会发生变化,我不能对数据的准确性发表评论,但目前它是Google的一个不错的替代品,抽查显示它运行良好。

使用地理编码器而不是geopy是可能的:

# pip install geocoder
>>> import geocoder
>>> g = geocoder.elevation('<address or [lat,lng]>')
>>> print (g.meters)

如果geopy知道地球上每一个点的高度,我会吃我的袜子。这是不可能的(afaik)没有做一些奇特的谷歌地球/其他数据库搜索,以找出海拔高度。

之所以lat, lon, altitude = p有效,是因为Point具有高度属性。根据source,构造器中唯一改变高度的时间是在altitude = float(altitude or 0)行中,该行没有得到高度。

相关问题 更多 >