有可能吗?
我尝试过:
from geopy.point import Point
from geopy import geocoders
[...]
p = Point(Latitude, Longitude)
lat, lon, altitude = p
height_metres = altitude
但 height_meters 始终为 0。
请注意,使用地理编码器,您将需要一个 Google 海拔 API 密钥,该密钥现在需要启用计费功能的项目(截至 2018 年 7 月)。
作为替代方案,您可以使用开放的海拔公共 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 知道地球上每个点的高度,我会吃掉我的袜子。如果不进行一些奇特的 GoogleEarth/其他数据库搜索来确定海拔高度,这是不可能的(据我所知)。
lat, lon, altitude = p
之所以起作用是因为Point
具有海拔属性。根据 source,构造函数中海拔高度唯一改变的时间是在 altitude = float(altitude or 0)
行中,该行没有获取海拔高度。
可以使用打开地形数据。它为不同的数据集提供免费的公共 API。尝试 e。 G。 https://api.opentopodata.org/v1/aster30m?locations=53.66,13.84。在Python中这是
import requests
lat, lon = (53.66, 13.84)
url = f"https://api.opentopodata.org/v1/aster30m?locations={lat},{lon}"
r = requests.get(url)
data = r.json()
print(data)
给出(为了可读性而格式化):
{
"results": [
{
"dataset": "aster30m",
"elevation": 9,
"location": {
"lat": 53.66,
"lng": 13.84
}
}
],
"status": "OK"
}
直接获取海拔:
elevation = data['results'][0]['elevation']
print(elevation)
打印
9
当使用
eudem25m
数据集而不是 aster30m
时,您会得到 4.061931610107422
。
对于 Python 示例,Pandas 中有很多坐标
DataFrame
,请参阅我的答案这里。