Skip to contents

Introduction

This vignette demonstrates how to use the openaq R package to query air quality measurements from the OpenAQ API. We will walk through the process of retrieving a list of locations, inspecting their sensors and parameters, and finally, fetching and plotting the actual measurements for a specific sensor.

Listing Locations

The list_locations() function allows us to retrieve information about monitoring locations. We can filter locations based on parameters and countries. Here, we are searching for locations that measure PM2.5 (parameter ID 2) in Madagascar (country ID 182). By default resource functions return a data frame but we set as_data_frame = FALSE to receive the data as a list, which we will use for easier inspection in the following steps.

locations <- list_locations(
  parameters_id = 2,
  countries_id = 182,
  as_data_frame = FALSE
)

The locations object is a list, where each element represents a monitoring location. Let’s examine the first location in the list and explore its sensors.


location <- locations[[1]]
sensors <- location$sensors
sensors
# > [[1]]
# > [[1]]$id
# > [1] 225221
# >
# > [[1]]$name
# > [1] "pm25 µg/m³"
# >
# > [[1]]$parameter
# > [[1]]$parameter$id
# > [1] 2
# >
# > [[1]]$parameter$name
# > [1] "pm25"
# >
# > [[1]]$parameter$units
# > [1] "µg/m³"
# >
# > [[1]]$parameter$displayName
# > [1] "PM2.5"

Each location contains information about its sensors. Each sensor has an id, name, and details about the measured parameter, including its name, units, and ID.

Each location also provides the timezone of where it is local, which will be helpful when querying measurements, so we will store this for later.

tz <- location$timezone
tz
# > [1] "Indian/Antananarivo"

To fetch measurements, we need the sensor ID. This location only measures PM2.5 and in turn only has one sensor so we can extract it as follows:


sensors_id <- sensors[[1]]$id
sensors_id
# > [1] 225221

Fetching Measurements

Now we can use the list_sensor_measurements() function to retrieve the measurements for the sensor. We need to provide the sensors_id, datetime_from, and datetime_to arguments. We will query for all measurements during the month of January 2025.It is important to use the correct timezone for your dates, we use the timezone for location that we stored in the tz variable above. The limit argument controls the maximum number of measurements returned in a single page of results. Because this is hourly data, and we are querying 31 days of measurements, we will be able to view all the results in one page (24 hourly measurements * 31 days = 744 measurements).

measurements <- list_sensor_measurements(
  sensors_id,
  datetime_from = as.POSIXct("2025-01-01", tz = tz),
  datetime_to = as.POSIXct("2025-01-31", tz = tz),
  limit = 1000
)

Finally, we can visualize the measurements using the plot() function.

plot(measurements)