4.9 KiB
4.9 KiB
In [3]:
import json import time from typing import List import requests import pandas as pd class GetElevation: @classmethod def __SendQuery(cls, latLngString: str) -> json: query = ('https://api.opentopodata.org/v1/mapzen?locations={}&interpolation=bilinear'.format(latLngString)) res = requests.get(query).json() if res["status"] != "OK": raise Exception(res["error"]) return res def GetSingleElevation(self, latitude: float, longitude: float) -> float: """ 获取单个高程,输入经纬度格式为数值类型,返回值为高程float类型 :param latitude: 纬度 :param longitude: 经度 :return: 高程 """ if latitude < -90 or latitude > 90: raise Exception("纬度的范围应在-90-90之间!请检查数据源!") latLngString = str(latitude) + "," + str(longitude) res = self.__SendQuery(latLngString) elevation = res["results"][0]["elevation"] return elevation def GetMultiElevation(self, latitude: List[float], longitude: List[float]) -> List[float]: """ 获取数组类型的高程,输入经纬度格式为经度数组和纬度数组,返回值为高程数组 :param latitude:纬度数组 :param longitude:经度数组 :return:高程数组 """ if len(latitude) != len(longitude): raise Exception("纬度数组和经度数组长度不一致!请检查数据源!") for lat in latitude: if lat < -90 or lat > 90: raise Exception("纬度的范围应在-90-90之间!请检查数据源!") elevationList = [] hundredNums = len(latitude) // 100 # 查询整百的高程 for i in range(hundredNums): latLngString = "" for idx in range(100 * i, 100 * (i + 1)): latLngString += (str(latitude[idx]) + "," + str(longitude[idx]) + "|") res = self.__SendQuery(latLngString) for idx in range(100): elevationList.append(res["results"][idx]["elevation"]) time.sleep(1) # 查询剩余的不到100的高程 latLngString = "" for i in range(hundredNums * 100, len(latitude)): latLngString += (str(latitude[i]) + "," + str(longitude[i]) + "|") res = self.__SendQuery(latLngString) for i in range(len(latitude) - hundredNums * 100): elevationList.append(res["results"][i]["elevation"]) return elevationList def ExportToXlsx(self, latLongDf: pd.DataFrame, elevationList: List[float], outputPath: str) -> None: """ 如果用户可以传入一个DataFrame数据,可以将返回得到的高程拼接并输出 :param latLongDf: DataFrame数据 :param elevationList: 高程数组 :param outputPath: 输出路径 :return: 无返回值 """ latLongDf["elevation"] = elevationList latLongDf.to_excel(outputPath, index=False)
In [7]:
data = pd.read_excel('./lat_lon.xlsx') data.columns = ['plant', 'longitude', 'latitude']
In [ ]:
multiEle = ele.GetMultiElevation(data["latitude"], data["longitude"]) print(multiEle)