繁体   English   中英

Python:从纬度和经度值获取高程

[英]Python: Obtaining elevation from latitude and longitude values

首先,这个问题有代码。 但是,它似乎只适用于美国。 正如他们的网站 ( https://nationalmap.gov/epqs/ ) 上所述,当无法找到值时,它将返回 -1000000,这就是我的情况。

我试图在瑞典获得海拔。

使用此示例数据:

lat = [57.728905, 57.728874, 57.728916, 57.728836, 57.728848]
lon = [11.949309, 11.949407, 11.949470, 11.949342, 11.949178]

# create df
df = pd.DataFrame({'lat': lat, 'lon': lon})

如何使下面的代码适用于全球范围而不仅限于美国? 或者至少,有什么方法可以让我把重点放在瑞典上? 美国地质调查局不应该有全球数据吗?

def make_remote_request(url: str, params: dict):
   """
   Makes the remote request
   Continues making attempts until it succeeds
   """

   count = 1
   while True:
       try:
           response = requests.get((url + urllib.parse.urlencode(params)))
       except (OSError, urllib3.exceptions.ProtocolError) as error:
           print('\n')
           print('*' * 20, 'Error Occured', '*' * 20)
           print(f'Number of tries: {count}')
           print(f'URL: {url}')
           print(error)
           print('\n')
           count += 1
           continue
       break

   return response


def elevation_function(x):
   url = 'https://nationalmap.gov/epqs/pqs.php?'
   params = {'x': x[1],
             'y': x[0],
             'units': 'Meters',
             'output': 'json'}
   result = make_remote_request(url, params)
   return result.json()['USGS_Elevation_Point_Query_Service']['Elevation_Query']['Elevation']

要运行该函数:

df['elevation'] = df.apply(elevation_function, axis=1)


# Print output
df

源代码: 使用简单的python脚本从纬度经度坐标获取高程

更新:

使用已接受答案中的建议并在高程函数中添加 time.sleep(1) 允许我获得所有观测的高程数据。 请注意,此 API 仅允许每个请求 100 个位置。 因此,对于更多的行,必须将其分解为不同的请求。

我一直在使用opentopodata.org的 api 来获取高程值。 您可以使用涵盖整个瑞典的EU-DEM数据集。 API 请求非常简单,如下所示:

https://api.opentopodata.org/v1/eudem25m?locations=57.728905,11.949309

另一个高程 API 可以在https://open-elevation.com/找到。 一个请求看起来非常相似:

https://api.open-elevation.com/api/v1/lookup?locations=57.728905,11.949309

因此调整您的elevation_function

def elevation_function(x):
   url = 'https://api.opentopodata.org/v1/eudem25m?'
   # url = 'https://api.open-elevation.com/api/v1/lookup?'
   params = {'locations': f"{x[0]},{x[1]}"}
   result = make_remote_request(url, params)
   return result.json()['results'][0]['elevation']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM