这是可能的吗?
我尝试过:
from geopy.point import Point
from geopy import geocoders
[...]
p = Point(Latitude, Longitude)
lat, lon, altitude = p
height_metres = altitude
但是 height_metres 总是为 0。
这是可能的吗?
我尝试过:
from geopy.point import Point
from geopy import geocoders
[...]
p = Point(Latitude, Longitude)
lat, lon, altitude = p
height_metres = altitude
但是 height_metres 总是为 0。
请注意,使用地理编码器需要一个谷歌高程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不错的选择,并且简单测试表明其运行良好。
使用geocoder而不是geopy可以实现此功能:
# pip install geocoder
>>> import geocoder
>>> g = geocoder.elevation('<address or [lat,lng]>')
>>> print (g.meters)
lat, lon, altitude = p
之所以可行,是因为Point
有一个海拔高度属性。根据源代码,构造函数中修改海拔高度的唯一时间是在这一行:altitude = float(altitude or 0)
,但这并没有获得海拔高度。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
。DataFrame
中,可以参考我的Stack Overflow回答here。