Python从 Google 地图空气质量 API 获取空气污染数据

获取给定位置当前的空气质量

让我们开始吧!在本节中,我们将介绍如何使用 Google 地图获取给定位置的空气质量数据。您首先需要一个 API 密钥,可以通过您的 Google Cloud 帐户生成该密钥。他们有90 天的免费试用期,之后您将为您使用的 API 服务付费。在开始大量拨打电话之前,请确保启用“空气质量 API”,并了解定价政策!

Google Cloud API 库的屏幕截图,您可以在其中激活空气质量 API。图片由作者生成。

我通常将 API 密钥存储在一个文件中,并使用这样的函数.env加载它dotenv

from dotenv import load_dotenv 
from pathlib import Path 

def  load_secets (): 
    load_dotenv() 
    env_path = Path( "." ) / ".env"
     load_dotenv(dotenv_path=env_path) 

    google_maps_key = os.getenv( "GOOGLE_MAPS_API_KEY" ) 

    return { 
        "GOOGLE_MAPS_API_KEY" : google_maps_key, 
    }

获取当前条件需要 POST 请求,详细信息请参见此处。我们将从googlemaps包中获得灵感,以一种可以推广的方式来做到这一点。首先,我们构建一个用于requests进行调用的客户端类。目标非常简单 - 我们希望构建一个如下所示的 URL,并包含特定于用户查询的所有请求选项。

https://airquality.googleapis.com/v1/currentConditions:lookup?key=YOUR_API_KEY

该类Client接受我们的 API 密钥 as ,然后为查询key构建。request_url它接受请求选项作为params字典,然后将它们放入 JSON 请求正文中,该self.session.post()正文由调用处理。

import requests
import io


class Client(object):
    DEFAULT_BASE_URL = "https://airquality.googleapis.com"

    def __init__(self, key):
        self.session = requests.Session()
        self.key = key

    def request_post(self, url, params):
        request_url = self.compose_url(url)
        request_header = self.compose_header()
        request_body = params

        response = self.session.post(
            request_url,
            headers=request_header,
            json=request_body,
        )

        return self.get_body(response)

    def compose_url(self, path):
        return self.DEFAULT_BASE_URL + path + "?" + "key=" + self.key

    @staticmethod
    def get_body(response):
        body = response.json()

        if "error" in body:
            return body["error"]

        return body

    @staticmethod
    def compose_header():
        return {
            "Content-Type": "application/json",
        }

现在我们可以创建一个函数来帮助用户为当前条件 API 组装有效的请求选项,然后使用此 Client 类来发出请求。同样,这也是受到 googlemaps 包设计的启发。

def current_conditions(
    client,
    location,
    include_local_AQI=True,
    include_health_suggestion=False,
    include_all_pollutants=True,
    include_additional_pollutant_info=False,
    include_dominent_pollutant_conc=True,
    language=None,
):
    """
    See documentation for this API here
    https://developers.google.com/maps/documentation/air-quality/reference/rest/v1/currentConditions/lookup
    """
    params = {}

    if isinstance(location, dict):
        params["location"] = location
    else:
        raise ValueError(
            "Location argument must be a dictionary containing latitude and longitude"
        )

    extra_computations = []
    if include_local_AQI:
        extra_computations.append("LOCAL_AQI")

    if include_health_suggestion:
        extra_computations.append("HEALTH_RECOMMENDATIONS")

    if include_additional_pollutant_info:
        extra_computations.append("POLLUTANT_ADDITIONAL_INFO")

    if include_all_pollutants:
        extra_computations.append("POLLUTANT_CONCENTRATION")

    if include_dominent_pollutant_conc:
        extra_computations.append("DOMINANT_POLLUTANT_CONCENTRATION")

    if language:
        params["language"] = language

    params["extraComputations"] = extra_computations

    return client.request_post("/v1/currentConditions:lookup", params)

该 API 的选项相对简单。它需要一个包含您想要调查的点的经度和纬度的字典,并且可以选择接受控制返回信息量的各种其他参数。让我们看看它的实际效果,所有参数都设置为True

# set up client
client = Client(key=GOOGLE_MAPS_API_KEY)
# a location in Los Angeles, CA
location = {"longitude":-118.3,"latitude":34.1}
# a JSON response
current_conditions_data = current_conditions(
  client,
  location,
  include_health_suggestion=True,
  include_additional_pollutant_info=True
)

返回了很多有趣的信息!我们不仅有来自通用和美国 AQI 指数的空气质量指数值,而且还有主要污染物的浓度、每种污染物的描述以及针对当前空气质量的一套整体健康建议。

{'dateTime': '2023-10-12T05:00:00Z',
 'regionCode': 'us',
 'indexes': [{'code': 'uaqi',
   'displayName': 'Universal AQI',
   'aqi': 60,
   'aqiDisplay': '60',
   'color': {'red': 0.75686276, 'green': 0.90588236, 'blue': 0.09803922},
   'category': 'Good air quality',
   'dominantPollutant': 'pm10'},
  {'code': 'usa_epa',
   'displayName': 'AQI (US)',
   'aqi': 3
  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gis收藏家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值