| Title: | Air Quality Data from CPCB, OAQ, and WUSTL Satellite PM2.5 |
|---|---|
| Description: | Download and analyze air pollution data from three sources. CPCB (Central Pollution Control Board) CAAQMS stations provide historical and real-time PM2.5, PM10, and AQI readings across 400+ sites in India. OAQ (Open Air Quality) aggregates low-cost sensor networks such as Airnet, also in India. WUSTL ACAG V5GL04 provides satellite-derived PM2.5 at 1 km resolution globally (1998-2022). Includes geospatial station matching, AQI categorization, and NetCDF raster extraction for arbitrary regions. |
| Authors: | Saket Choudhary [aut, cre], Mahesh Kumar Prajapat [aut], Darakhshan [email protected] Nehal [ctb] |
| Maintainer: | Saket Choudhary <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.2.0.9001 |
| Built: | 2026-09-21 11:11:02 UTC |
| Source: | https://github.com/saketlab/vayuayanR |
Comprehensive analysis of station data
analyze_station_data(data)analyze_station_data(data)
data |
List of cities with nested stations |
List with analysis results
Convert station name to clean underscore-separated format
clean_station_name(station_name)clean_station_name(station_name)
station_name |
Original station name string |
Cleaned station name with underscores
Add lat/lon coordinates to a station data frame by querying the CPCB
live coordinates API (iit_rss_feed_with_coordinates). This is the
same source used by the Python vayuayan package and returns authoritative
coordinates directly from CPCB – no geocoding, no rate limiting, no NAs
for oddly-named stations.
Falls back to Nominatim geocoding for any stations not found in the CPCB response (e.g. offline stations absent from the live feed).
cpcb_add_coords(stations)cpcb_add_coords(stations)
stations |
Data frame from |
Same data frame with lat and lon columns added
## Not run: stations <- cpcb_get_station_list("Mumbai") stations_with_coords <- cpcb_add_coords(stations) head(stations_with_coords) ## End(Not run)## Not run: stations <- cpcb_get_station_list("Mumbai") stations_with_coords <- cpcb_add_coords(stations) head(stations_with_coords) ## End(Not run)
Download daily PM2.5 AQI data for a city from the CPCB data repository for a given year. Data is saved as a CSV file with one row per day and one column per month.
cpcb_download_city_data(city, year, save_location)cpcb_download_city_data(city, year, save_location)
city |
Character. City name (e.g. |
year |
Integer. Year for data (e.g. |
save_location |
Character. Full file path to save the downloaded CSV. |
Data frame preview (first 6 rows) of the downloaded data, invisibly.
The full data is saved to save_location.
## Not run: cpcb_download_city_data( city = "Delhi", year = 2022, save_location = tempfile(fileext = ".csv") ) ## End(Not run)## Not run: cpcb_download_city_data( city = "Delhi", year = 2022, save_location = tempfile(fileext = ".csv") ) ## End(Not run)
Download daily PM2.5 AQI data for a single CPCB monitoring station for a given year. Data is saved as a CSV file with one row per day and one column per month.
cpcb_download_station_data(station_id, year, save_location)cpcb_download_station_data(station_id, year, save_location)
station_id |
Character. Station ID from |
year |
Integer. Year for data (e.g. |
save_location |
Character. Full file path to save the downloaded CSV. |
Data frame preview (first 6 rows) of the downloaded data, invisibly.
The full data is saved to save_location.
## Not run: cpcb_download_station_data( station_id = "site_103", year = 2022, save_location = tempfile(fileext = ".csv") ) ## End(Not run)## Not run: cpcb_download_station_data( station_id = "site_103", year = 2022, save_location = tempfile(fileext = ".csv") ) ## End(Not run)
Get all air quality monitoring stations in India from CPCB live dashboard.
cpcb_get_all_india()cpcb_get_all_india()
List of station data
## Not run: stations <- cpcb_get_all_india() df <- stations_to_dataframe(stations) head(df) ## End(Not run)## Not run: stations <- cpcb_get_all_india() df <- stations_to_dataframe(stations) head(df) ## End(Not run)
Get list of cities in a given state from CPCB.
cpcb_get_city_list(state)cpcb_get_city_list(state)
state |
Character. State name (e.g. |
Character vector of city names
## Not run: cities <- cpcb_get_city_list("Maharashtra") head(cities) ## End(Not run)## Not run: cities <- cpcb_get_city_list("Maharashtra") head(cities) ## End(Not run)
Fetch the complete list of all India stations and cities from CPCB.
cpcb_get_complete_list()cpcb_get_complete_list()
List containing station and city data
## Not run: all_data <- cpcb_get_complete_list() names(all_data) ## End(Not run)## Not run: all_data <- cpcb_get_complete_list() names(all_data) ## End(Not run)
Get file path for downloading data from CPCB. Used internally by
cpcb_download_city_data() and cpcb_download_station_data().
cpcb_get_file_path( station_id = "", station_name = "", state = "", city = "", year = "", frequency = "daily", data_type = "cityLevel" )cpcb_get_file_path( station_id = "", station_name = "", state = "", city = "", year = "", frequency = "daily", data_type = "cityLevel" )
station_id |
Character. Station ID (e.g. |
station_name |
Character. Station name. |
state |
Character. State name. |
city |
Character. City name. |
year |
Integer or character. Year for data (e.g. |
frequency |
Character. Data frequency: |
data_type |
Character. Type of data: |
List of file path information with filePath and year elements
## Not run: paths <- cpcb_get_file_path( city = "Delhi", frequency = "daily", data_type = "cityLevel" ) str(paths[[1]]) ## End(Not run)## Not run: paths <- cpcb_get_file_path( city = "Delhi", frequency = "daily", data_type = "cityLevel" ) str(paths[[1]]) ## End(Not run)
Get live AQI data with flexible parameters. Automatically resolves station from coordinates or IP location if not provided.
cpcb_get_live_aqi_data( station_id = NULL, coords = NULL, date = NULL, hour = NULL )cpcb_get_live_aqi_data( station_id = NULL, coords = NULL, date = NULL, hour = NULL )
station_id |
Optional character. Station ID. If NULL, nearest station
is found automatically using |
coords |
Optional numeric vector |
date |
Optional character. Date in |
hour |
Optional integer (0–23). Hour of the day. Defaults to the most recent full hour. |
List with processed live AQI data
## Not run: # Get live AQI at current location and time aqi <- cpcb_get_live_aqi_data() # Get live AQI for a specific station and time aqi <- cpcb_get_live_aqi_data( station_id = "site_103", date = "2024-01-15", hour = 10 ) ## End(Not run)## Not run: # Get live AQI at current location and time aqi <- cpcb_get_live_aqi_data() # Get live AQI for a specific station and time aqi <- cpcb_get_live_aqi_data( station_id = "site_103", date = "2024-01-15", hour = 10 ) ## End(Not run)
Get live AQI data for a specific station at a specific time.
cpcb_get_live_aqi_data_for_station(station_id, date_time)cpcb_get_live_aqi_data_for_station(station_id, date_time)
station_id |
Character. Station ID (e.g. |
date_time |
Character. Date and time in |
List with live AQI data including pollutant readings
## Not run: aqi <- cpcb_get_live_aqi_data_for_station( station_id = "site_103", date_time = "2024-01-15T10:00:00Z" ) ## End(Not run)## Not run: aqi <- cpcb_get_live_aqi_data_for_station( station_id = "site_103", date_time = "2024-01-15T10:00:00Z" ) ## End(Not run)
Find nearest CPCB monitoring station to given coordinates. If no coordinates provided, uses IP-based geolocation automatically. Returns station ID, name, and distance in kilometres.
cpcb_get_nearest_station(coords = NULL)cpcb_get_nearest_station(coords = NULL)
coords |
Optional numeric vector c(lat, lon). If NULL, uses IP location. |
List with station_id, station_name, and distance_km
## Not run: # Auto-detect location nearest <- cpcb_get_nearest_station() cat( "Nearest station:", nearest$station_name, "(", round(nearest$distance_km, 1), "km)" ) # Provide coordinates manually (Mumbai) nearest <- cpcb_get_nearest_station(coords = c(19.076, 72.877)) ## End(Not run)## Not run: # Auto-detect location nearest <- cpcb_get_nearest_station() cat( "Nearest station:", nearest$station_name, "(", round(nearest$distance_km, 1), "km)" ) # Provide coordinates manually (Mumbai) nearest <- cpcb_get_nearest_station(coords = c(19.076, 72.877)) ## End(Not run)
Get list of states available for AQI data from CPCB.
cpcb_get_state_list()cpcb_get_state_list()
Character vector of state names
## Not run: states <- cpcb_get_state_list() head(states) ## End(Not run)## Not run: states <- cpcb_get_state_list() head(states) ## End(Not run)
Get station list available in given city from CPCB.
cpcb_get_station_list(city)cpcb_get_station_list(city)
city |
Character. City name (e.g. |
Data frame with columns value (station ID) and label (station name)
## Not run: stations <- cpcb_get_station_list("Delhi") head(stations) ## End(Not run)## Not run: stations <- cpcb_get_station_list("Delhi") head(stations) ## End(Not run)
Get approximate system location using IP-based geolocation. Returns city-level coordinates based on the machine's public IP address.
cpcb_get_system_location()cpcb_get_system_location()
Numeric vector c(lat, lon)
## Not run: loc <- cpcb_get_system_location() cat("Latitude:", loc["lat"], "Longitude:", loc["lon"]) ## End(Not run)## Not run: loc <- cpcb_get_system_location() cat("Latitude:", loc["lat"], "Longitude:", loc["lon"]) ## End(Not run)
Convert vector of AQI values to categories
get_aqi_categories(aqi_values)get_aqi_categories(aqi_values)
aqi_values |
Numeric vector of AQI values |
Character vector of AQI categories
Convert AQI numeric value to category
get_aqi_category(aqi_value)get_aqi_category(aqi_value)
aqi_value |
Numeric AQI value |
AQI category string
Calculate great circle distance between two points
haversine_distance(lat1, lon1, lat2, lon2)haversine_distance(lat1, lon1, lat2, lon2)
lat1 |
Latitude of first point |
lon1 |
Longitude of first point |
lat2 |
Latitude of second point |
lon2 |
Longitude of second point |
Distance in kilometers
For every row in from (e.g. low-cost sensors), find the k
closest rows in to (e.g. reference stations) by haversine distance.
Useful for pairing sensor networks for calibration or cross-validation.
nearest_stations(from, to, k = 1, from_id = "id", to_id = "id")nearest_stations(from, to, k = 1, from_id = "id", to_id = "id")
from |
Data frame of source points. Must contain |
to |
Data frame of candidate target points. Must contain
|
k |
Integer number of nearest targets to return per source point. |
from_id, to_id
|
Column names identifying each point, carried into the
output as |
A data frame with one row per (source, nearest target) pair:
from_id, to_id, rank (1 = closest), and
dist_km.
## Not run: nearest_stations(airnet, cpcb, k = 3, from_id = "id", to_id = "id") ## End(Not run)## Not run: nearest_stations(airnet, cpcb, k = 3, from_id = "id", to_id = "id") ## End(Not run)
Pulls the station list for provider, optionally restricts it to one
or more cities, then fetches monthly aggregates for every station across the
requested months. Returns a single tidy data frame with station metadata
(id, name, lat, lon) joined to each daily record. Stations that return no
data for a month are skipped.
oaq_fetch_monthly_stations( session, provider, year, months = sprintf("%02d", 1:12), city = NULL )oaq_fetch_monthly_stations( session, provider, year, months = sprintf("%02d", 1:12), city = NULL )
session |
List returned by |
provider |
Character provider id (e.g. |
year |
Integer year (e.g. |
months |
Character vector of zero-padded months (e.g.
|
city |
Optional character vector of city names to keep (matched against
the station list's |
A data frame of daily records with station_id, date,
the pollutant columns returned by the API, and lat/lon/
name from the station list.
## Not run: session <- oaq_session() blr <- oaq_fetch_monthly_stations( session, "airnet", year = 2026, months = c("03", "04"), city = "Bengaluru" ) ## End(Not run)## Not run: session <- oaq_session() blr <- oaq_fetch_monthly_stations( session, "airnet", year = 2026, months = c("03", "04"), city = "Bengaluru" ) ## End(Not run)
Retrieve annual aggregated air quality data for a specific sensor and year.
oaq_get_annual(session, provider, sensor_id, year)oaq_get_annual(session, provider, sensor_id, year)
session |
List returned by |
provider |
Character. Provider name (e.g. |
sensor_id |
Character. Sensor station ID. |
year |
Integer or character. Year (e.g. |
Parsed annual aggregate record.
## Not run: session <- oaq_session() annual <- oaq_get_annual(session, "AURASSURE", "sensor_001", 2024) ## End(Not run)## Not run: session <- oaq_session() annual <- oaq_get_annual(session, "AURASSURE", "sensor_001", 2024) ## End(Not run)
Get the latest air quality map readings for all sensors in a city.
oaq_get_city_latest(session, provider, city)oaq_get_city_latest(session, provider, city)
session |
List returned by |
provider |
Character. Provider name (e.g. |
city |
Character. City name as it appears in the provider hierarchy. |
Parsed list of sensor readings for the city.
## Not run: session <- oaq_session() latest <- oaq_get_city_latest(session, "AURASSURE", "Bengaluru") ## End(Not run)## Not run: session <- oaq_session() latest <- oaq_get_city_latest(session, "AURASSURE", "Bengaluru") ## End(Not run)
Retrieve daily aggregated air quality data for a specific sensor, date.
oaq_get_daily(session, provider, sensor_id, year, month, day)oaq_get_daily(session, provider, sensor_id, year, month, day)
session |
List returned by |
provider |
Character. Provider name (e.g. |
sensor_id |
Character. Sensor station ID. |
year |
Integer or character. Year (e.g. |
month |
Integer or character. Month (1–12). |
day |
Integer or character. Day of month (1–31). |
Parsed daily data record.
## Not run: session <- oaq_session() daily <- oaq_get_daily(session, "AURASSURE", "sensor_001", 2024, 1, 15) ## End(Not run)## Not run: session <- oaq_session() daily <- oaq_get_daily(session, "AURASSURE", "sensor_001", 2024, 1, 15) ## End(Not run)
Get the Country > City > Sensor geographical tree for a data provider.
oaq_get_hierarchy(session, provider)oaq_get_hierarchy(session, provider)
session |
List returned by |
provider |
Character. Provider name (e.g. |
Parsed hierarchy list.
## Not run: session <- oaq_session() hierarchy <- oaq_get_hierarchy(session, "AURASSURE") ## End(Not run)## Not run: session <- oaq_session() hierarchy <- oaq_get_hierarchy(session, "AURASSURE") ## End(Not run)
Retrieve monthly aggregated air quality data for a specific sensor and month.
oaq_get_monthly(session, provider, sensor_id, year, month)oaq_get_monthly(session, provider, sensor_id, year, month)
session |
List returned by |
provider |
Character. Provider name (e.g. |
sensor_id |
Character. Sensor station ID. |
year |
Integer or character. Year (e.g. |
month |
Integer or character. Month (1–12). |
Parsed monthly aggregate record.
## Not run: session <- oaq_session() monthly <- oaq_get_monthly(session, "AURASSURE", "sensor_001", 2024, 1) ## End(Not run)## Not run: session <- oaq_session() monthly <- oaq_get_monthly(session, "AURASSURE", "sensor_001", 2024, 1) ## End(Not run)
Retrieve the last 24 hours of readings for a specific sensor station.
oaq_get_station_24h(session, provider, sensor_id)oaq_get_station_24h(session, provider, sensor_id)
session |
List returned by |
provider |
Character. Provider name (e.g. |
sensor_id |
Character. Sensor station ID. |
Parsed list of hourly readings.
## Not run: session <- oaq_session() data <- oaq_get_station_24h(session, "AURASSURE", "sensor_001") ## End(Not run)## Not run: session <- oaq_session() data <- oaq_get_station_24h(session, "AURASSURE", "sensor_001") ## End(Not run)
Get the latest sensor readings from all monitoring stations under a provider.
oaq_get_stations_latest(session, provider)oaq_get_stations_latest(session, provider)
session |
List returned by |
provider |
Character. Provider name (e.g. |
Parsed list of station-level latest readings.
## Not run: session <- oaq_session() stations <- oaq_get_stations_latest(session, "AURASSURE") ## End(Not run)## Not run: session <- oaq_session() stations <- oaq_get_stations_latest(session, "AURASSURE") ## End(Not run)
Retrieve the list of all available data providers on the OAQ platform, including their IDs, display names, and data attribution.
oaq_list_providers(session)oaq_list_providers(session)
session |
List returned by |
List with a providers element containing id, name, and
attribution for each provider.
## Not run: session <- oaq_session() providers <- oaq_list_providers(session) sapply(providers$providers, `[[`, "id") ## End(Not run)## Not run: session <- oaq_session() providers <- oaq_list_providers(session) sapply(providers$providers, `[[`, "id") ## End(Not run)
Performs the OAQ 2-step handshake: calls the Data Broker with your API key and returns the signed-URL parameters needed for all subsequent data requests. Sessions are valid for 24 hours.
The API key is read from the OAQ_API_KEY environment variable if
api_key is not supplied.
oaq_session(api_key = Sys.getenv("OAQ_API_KEY"))oaq_session(api_key = Sys.getenv("OAQ_API_KEY"))
api_key |
Character. Your OAQ API key. Defaults to
|
Named list with base_url and sig_string (the full
query-string to append to every data URL).
## Not run: session <- oaq_session() ## End(Not run)## Not run: session <- oaq_session() ## End(Not run)
Delete all cached NetCDF files from the cache directory to free disk space.
pm25_clear_cache(cache_dir = "pm25_data")pm25_clear_cache(cache_dir = "pm25_data")
cache_dir |
Character. Directory containing cached files.
Default: |
Invisibly returns NULL.
## Not run: pm25_clear_cache() ## End(Not run)## Not run: pm25_clear_cache() ## End(Not run)
Download a WUSTL ACAG V6GL02 NetCDF file from AWS S3 and cache it locally. If the file is already cached and complete (>1 MB), the cached version is returned without re-downloading.
pm25_download_netcdf( year, month = NULL, cache_dir = "pm25_data", force_download = FALSE )pm25_download_netcdf( year, month = NULL, cache_dir = "pm25_data", force_download = FALSE )
year |
Integer. Year for data (e.g. |
month |
Optional integer (1–12). If NULL, downloads the annual file. |
cache_dir |
Character. Directory to cache NetCDF files.
Default: |
force_download |
Logical. Force re-download even if file exists.
Default: |
Character. Path to the downloaded (or cached) NetCDF file.
## Not run: # Download monthly data nc_path <- pm25_download_netcdf(year = 2023, month = 11) # Download annual data nc_path <- pm25_download_netcdf(year = 2023) ## End(Not run)## Not run: # Download monthly data nc_path <- pm25_download_netcdf(year = 2023, month = 11) # Download annual data nc_path <- pm25_download_netcdf(year = 2023) ## End(Not run)
Compute mean, SD, min, max, and pixel count of satellite PM2.5 for a region defined by a GeoJSON file. Optionally group by a column in the GeoJSON (e.g. district name) to return per-group statistics.
pm25_get_stats( geojson_file, year = NULL, month = NULL, cache_dir = "pm25_data", group_by = NULL, nc_file = NULL )pm25_get_stats( geojson_file, year = NULL, month = NULL, cache_dir = "pm25_data", group_by = NULL, nc_file = NULL )
geojson_file |
Character. Path or URL to a GeoJSON file defining the
region (remote |
year |
Integer. Year of the NetCDF data (e.g. |
month |
Optional integer (1–12). If NULL, uses annual data. Ignored
when |
cache_dir |
Character. Directory to cache NetCDF files.
Default: |
group_by |
Optional character. Column name(s) in the GeoJSON to group polygons by (comma-separated for multiple columns). |
nc_file |
Optional character. Path to a local NetCDF file to use
directly. When supplied, no download is attempted and |
List (or data frame if group_by is specified) with
PM2.5 statistics: mean, std, min, max,
count.
## Not run: # Single region (remote BharatViz boundary) stats <- pm25_get_stats( "https://geo.bharatviz.org/geojsons/cities/delhi.geojson", year = 2023, month = 11 ) cat("Mean PM2.5:", round(stats$mean, 1), "ug/m3") # Grouped by district stats_by_district <- pm25_get_stats( "https://geo.bharatviz.org/geojsons/districts/India_LGD_districts.geojson", year = 2023, month = 11, group_by = "district_name" ) # Use a local (offline) NetCDF file directly stats <- pm25_get_stats( "https://geo.bharatviz.org/geojsons/cities/delhi.geojson", nc_file = "V5GL04.HybridPM25.Global.202211-202211.nc" ) ## End(Not run)## Not run: # Single region (remote BharatViz boundary) stats <- pm25_get_stats( "https://geo.bharatviz.org/geojsons/cities/delhi.geojson", year = 2023, month = 11 ) cat("Mean PM2.5:", round(stats$mean, 1), "ug/m3") # Grouped by district stats_by_district <- pm25_get_stats( "https://geo.bharatviz.org/geojsons/districts/India_LGD_districts.geojson", year = 2023, month = 11, group_by = "district_name" ) # Use a local (offline) NetCDF file directly stats <- pm25_get_stats( "https://geo.bharatviz.org/geojsons/cities/delhi.geojson", nc_file = "V5GL04.HybridPM25.Global.202211-202211.nc" ) ## End(Not run)
List all cached NetCDF files in the cache directory with file sizes.
pm25_list_cached_files(cache_dir = "pm25_data")pm25_list_cached_files(cache_dir = "pm25_data")
cache_dir |
Character. Directory containing cached files.
Default: |
Character vector of cached file paths.
## Not run: files <- pm25_list_cached_files() ## End(Not run)## Not run: files <- pm25_list_cached_files() ## End(Not run)
Reads the pixels covering shape's bounding box and returns them as a
terra raster in EPSG:4326, ready for masking or zonal extraction.
pm25_load_netcdf_bbox( nc_path, shape, var = "GWRPM25", lon_name = "lon", lat_name = "lat" )pm25_load_netcdf_bbox( nc_path, shape, var = "GWRPM25", lon_name = "lon", lat_name = "lat" )
nc_path |
Path to a gridded PM2.5 NetCDF file. |
shape |
An |
var |
NetCDF variable name. Defaults to |
lon_name, lat_name
|
Longitude/latitude dimension names. |
A terra SpatRaster cropped to the bounding box.
## Not run: shape <- sf::st_read("https://geo.bharatviz.org/geojsons/cities/delhi.geojson") r <- pm25_load_netcdf_bbox(pm25_v5gl04_path(2022, 11, "."), shape) ## End(Not run)## Not run: shape <- sf::st_read("https://geo.bharatviz.org/geojsons/cities/delhi.geojson") r <- pm25_load_netcdf_bbox(pm25_v5gl04_path(2022, 11, "."), shape) ## End(Not run)
Reads only the pixels covering shape's bounding box and returns the
mean value. Useful for a quick monthly figure over a city or district.
pm25_read_netcdf_bbox( nc_path, shape, var = "GWRPM25", lon_name = "lon", lat_name = "lat" )pm25_read_netcdf_bbox( nc_path, shape, var = "GWRPM25", lon_name = "lon", lat_name = "lat" )
nc_path |
Path to a gridded PM2.5 NetCDF file. |
shape |
An |
var |
NetCDF variable name. Defaults to |
lon_name, lat_name
|
Longitude/latitude dimension names. |
Numeric mean value over the bounding box.
## Not run: shape <- sf::st_read("https://geo.bharatviz.org/geojsons/cities/delhi.geojson") pm25_read_netcdf_bbox(pm25_v5gl04_path(2022, 11, "."), shape) ## End(Not run)## Not run: shape <- sf::st_read("https://geo.bharatviz.org/geojsons/cities/delhi.geojson") pm25_read_netcdf_bbox(pm25_v5gl04_path(2022, 11, "."), shape) ## End(Not run)
Build the file path for a WUSTL V5GL04 monthly NetCDF
pm25_v5gl04_path(year, month, base_dir)pm25_v5gl04_path(year, month, base_dir)
year |
Integer year (1998–2022). |
month |
Integer month (1–12). |
base_dir |
Directory holding the monthly NetCDF files. |
Character path to the monthly NetCDF file.
pm25_v5gl04_path(2022, 11, base_dir = "~/data/V5GL04/Monthly")pm25_v5gl04_path(2022, 11, base_dir = "~/data/V5GL04/Monthly")
Convert nested station data to a flat data frame with geographic information, AQI values, and categories. This is the primary way to get station coordinates (latitude/longitude) from live CPCB data.
stations_to_dataframe(data)stations_to_dataframe(data)
data |
List of cities with nested stations (from cpcb_get_all_india()) |
Data frame with columns: station_id, station_name, city_name, city_id, state_id, longitude, latitude, live, avg_aqi, status, aqi_category
Display package information and usage
vayuayan_welcome()vayuayan_welcome()