基于Python的单次/批量高程查询_python dem高程数据-程序员宅基地

技术标签: 网络爬虫  爬虫  python  Python工具  pycharm  

通常来说,高程数据的获取途径有以下两个:
1、如果有全球/全国DEM数据,可以在arcgis中获取点的value值,即为高程值。
2、在科学上网的前提下,通过谷歌地图右下角可以查询。
本文介绍一个以Python为技术手段查询/批量查询的方法:


数据来源:数据来源

这个API接口的限制如下图所示,每秒最大发送一次请求,每次请求最多查询100个地址,每天最多发送1000次请求,也就是说每天可以查询10万次,足够科研/学习所用。
在这里插入图片描述

代码先放在下面,对于单次查询和多次查询分别在下文讲解。

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)

单次查询

在实例化对象之后,调用GetSingleElevation方法,传入纬度和经度,即可得到返回值,即高程数据

if __name__ == "__main__":
    ele = GetElevation()
    # 单个查询
    singleEle = ele.GetSingleElevation(50, 112)
    print(singleEle)

批量查询

在实例化对象之后,从本地导入数据或者直接定义纬度和经度数组(注意:输入类型为数组),调用GetMultiElevation方法,传入两个数组,即可得到返回的高程数组。


初次之外,如果是通过pandas读取的DataFrame类型的数据可以调用ExportToXlsx方法,将其导出到本地。

if __name__ == "__main__":
    ele = GetElevation()
    # 批量查询
    latLongDf = pd.read_excel(r"C:\Users\wzj\Desktop\工作簿1.xlsx")
    multiEle = ele.GetMultiElevation(latLongDf["lat"], latLongDf["lng"])
    print(multiEle)
    # 导出到本地excel
    ele.ExportToXlsx(latLongDf, multiEle, r"C:\Users\wzj\Desktop\工作簿1.xlsx")
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51116182/article/details/120856262

智能推荐

大型分布式存储方案MinIO介绍,看完你就懂了_minio为什么是分布式-程序员宅基地

1、MinIO是什么?官方解释:MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例..._minio为什么是分布式

JDBC开发步骤和prepareStatement的优点-程序员宅基地

一、JDBC开发步骤创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。 例如: try{ //加载MySql的

Vista vs XP,.NET vs win32,大家应该擦亮眼睛了_vista .net-程序员宅基地

Vista,华而不实的东西。进入市场以来被大家用过时了的XP无情地换掉,这说明什么? MS正尾随IBM进入假大空的时代,所谓的新而酷技术,一旦脱离了人民群众的实际需要,必将“曲高和寡”,众叛亲离。 诸位.NET的爱好者们,其实回头想一想,学了老半天,有没有当初的VB和ASP好用。不过是速度慢了几个数量级、开发效率降了一大半。无非是大家开始所谓OOP了,自我感觉技术高了,薪水好要了,多了一堆华而不实_vista .net

【matplotlib】matplotlib画图,读取图像_matplotlib读取图像-程序员宅基地

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.image as gImagefrom PIL import Image# create datax1 = np.linspace(0.0, 5.0)x2 = np.linspace(0.0, 2.0)y1 = np.sin(x1)y2 = np.e..._matplotlib读取图像

CentOS 6.5 Zabbix-agent3.2 安装 1.0版-程序员宅基地

1.关闭防火墙service iptables stop2.更换源、安装zabbix-agentrpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpmyum install -y zabbix-agent3....

C++编程实用技巧 #32:尽可能地推迟变量的定义-程序员宅基地

是的,我们同意C语言中变量要放在模块头部定义的规定;但在C++中,还是取消这种做法吧,它没必要,不自然,而且昂贵。还记得吗?如果定义了一个有构造函数和析构函数的类型的变量,当程序运行到变量定义之处时,必然面临构造的开销;当变量离开它的生命空间时,又要承担析构的开销。这意味着定义无用的变量必然伴随着不必要的开销,所以只要可能,就要避免这种情况发生。正如我所知道的,你的编程方式优雅

随便推点

netbeans 8.0.1 修改行间距-程序员宅基地

C:\Users\{Administrator}\AppData\Roaming\NetBeans\8.0\config\Editors\Preferences 目录下

Linux创建用户和组管理_group -r-程序员宅基地

用户和组管理文章目录用户和组管理各配置文件说明加密方式useradd 作用:创建用户userdel 作用:删除用户id 作用:查看账户信息usermod 作用:修改用户账号属性su 作用:切换用户passwd 作用:密码管理chage 作用:改变用户密码过期信息命令openssl 作用:密码生成工具group组管理各配置文件说明配置文件作用/etc/passwd用户及..._group -r

有限体积法(11)——交错网格-程序员宅基地

前面计算对流扩散问题的算例中都直接假设了计算域的流场是已知的(假设是均匀流场,各地流速的方向和大小都相同),然而,实际情况下流场是未知的,是需要求解的量,而其他输运量(例如ϕ\phiϕ)的对流通量是和当地速度的大小与方向密切相关的。因此,计算出流场是关键性的一步。本文主要介绍求解流场中面对的问题及解决方法。二维的动量方程和连续性方程如下:∂∂x(ρuu)+∂∂y(ρvu)=∂∂x(μ∂u∂x)+∂∂y(μ∂u∂y)−∂p∂x+Su∂∂x(ρuv)+∂∂y(ρvv)=∂∂x(μ∂v∂x)+∂∂y(μ∂v∂_交错网格

基于jsp+java+SSM学生兼职项目网站_jsp项目网站_q_q1262330535的博客-程序员宅基地

运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。IDE环境: Eclipse,Myeclipse,IDEA都可以tomcat环境: Tomcat 7.x,8.x,9.x版本均可硬件环境: windows 7/8/10 1G内存以上管理员角色包含以下功能:管理员管理,用户管理,兼职管理,帖子管理,聊天管理,广告管理,信箱管理,收藏管理,合同管理,系统管理等功能。用户角色包含以下功能:用户首页,用户登录,论坛管理,平台公告,签订简单合同,和用户在线聊天,个人信_jsp项目网站

大数据杠杆与零售业-程序员宅基地

近几十年来,信息技术和电子数据应用在美国零售业中发挥着举足轻重的作用——它们提升了整个行业的生产效率以及个人产业利润,这不得不引起人的注意力。为此我们开展了这项对美国零售业的研究,同时还结合了世界各地的公司的实践经验,我们所描述的美国的绝大部分大数据杠杆可以带来的潜在正面影响与其他发达国家是相似的。好不容易走出了凛冽寒冬,迎接它的却不是春天的故事。经..._杠杆数据

关于使用微信生成临时的分享二维码见解-程序员宅基地

关于使用微信临时生成二维码进行分享心得微信二维码简介:永久二维码有限,只有10w个临时二维码具有时效性,最大不能超过30天二维码每天生成有限,上线100w需求简介 功能需要,需要实现微信分享功能,分享的是用户的二维码,当用户把二维码分享出去,用户扫描二维码即可关注该公众号,计算用户邀请成功了一名用户,得到相应的报酬思路分析(最佳解决方法)建一张分享表,里面存取用户的openid和分享