An R package for calculating and visualizing spatial accessibility to facilities using cost-distance analysis. The package performs accessibility modeling by computing accumulated travel costs from facility locations to population centers and generates comprehensive visualizations including maps and summary statistics.
- Modular design with individual functions for each analysis step
- Cost-distance analysis using realistic travel impedances
- Motorized friction surfaces from the Malaria Atlas Project
- Flexible point styling with color, shape, and size mapping
- Administrative-level summaries (counties, subcounties, districts)
- Custom travel time categories with automatic label generation
- Publication-ready visualizations with maps and summary charts
- Default Kenya datasets accessible as
accessMap::adm0,accessMap::adm1, etc. - Multiple output formats (PNG, PDF, SVG maps, CSV summaries)
You can install the development version of accessMap from GitHub with:
# install.packages("pak")
pak::pak("cema-uonbi/accessMap")Or using devtools:
# install.packages("devtools")
devtools::install_github("cema-uonbi/accessMap")library(accessMap)
# Define facility coordinates (longitude, latitude)
health_facilities <- matrix(c(
36.8219, -1.2921, # Nairobi
39.6682, -4.0435, # Mombasa
35.2834, 0.5143 # Eldoret
), ncol = 2, byrow = TRUE)
colnames(health_facilities) <- c("lng", "lat")
# Run complete accessibility analysis
result <- accessibility(
points = health_facilities,
label = "Health Facilities",
name = "kenya_health_access"
)
# View summary statistics
print(result$national_summary)
# Display combined map and chart
plot(result$combined_plot)# Access Kenya data directly
plot(accessMap::adm1) # County boundaries
plot(accessMap::population_raster) # Population distribution
# Use in analysis
result <- accessibility(
points = health_facilities,
adm0 = accessMap::adm0,
adm1 = accessMap::adm1,
populationRaster = accessMap::population_raster,
transitionMatrix = accessMap::transition_matrix
)# Create custom categories
custom_cats <- create_categories(
breaks = c(0, 15, 30, 60, Inf),
labels = c("Immediate", "Quick", "Moderate", "Slow"),
palette = "viridis"
)
# Auto-generate labels from breaks
auto_cats <- create_categories(
breaks = c(0, 20, 45, 90, Inf) # Labels: "0-20", "20-45", "45-90", ">90"
)
result <- accessibility(
points = facilities,
categories = custom_cats,
name = "custom_categories"
)For full control, use individual functions:
# Step 1: Load and validate data
kenya_data <- load_default_data()
points <- validate_points(health_facilities)
cats <- default_categories()
# Step 2: Compute accessibility surface
travel_results <- compute_travel_cost(
points,
kenya_data$transitionMatrix,
kenya_data$populationRaster
)
# Step 3: Process data
access_data <- process_access_data(
travel_results$access,
travel_results$pop,
cats
)
# Step 4: Generate summaries
summary_stats <- generate_summary(access_data, cats)
# Step 5: Create custom visualizations
map_plot <- create_map(
access_data, points, kenya_data$adm0, kenya_data$adm1, cats,
point_color = "blue", point_size = 6
)
bar_plot <- create_bar_plot(summary_stats, cats, color_labels = "red")
combined_plot <- combine_plots(map_plot, bar_plot)# County-level summaries
county_summary <- generate_admin_summary(
data = access_data,
admin_sf = accessMap::adm1,
admin_name_cols = "NAME_1"
)
# Multi-level analysis
subcounty_summary <- generate_admin_summary(
data = access_data,
admin_sf = accessMap::adm2,
admin_name_cols = c("NAME_1", "NAME_2")
)# Create facility data with attributes
facilities_df <- data.frame(
lng = c(36.8, 37.0, 36.9),
lat = c(-1.3, -1.5, -1.4),
type = c("Hospital", "Clinic", "Hospital"),
ownership = c("Public", "Private", "Public"),
capacity = c(100, 50, 75)
)
# Color and shape by ownership, size by capacity
map <- create_map(
access_data, facilities_df, accessMap::adm0, accessMap::adm1, cats,
point_color = "ownership",
point_shape = "ownership",
point_size = "capacity",
point_colors = c("Public" = "red", "Private" = "blue"),
point_shapes = c("Public" = 16, "Private" = 17),
label = "Health Facilities"
)# Validate your coordinates (auto-detects column names)
my_points <- validate_points(my_facility_data) # Works with "longitude"/"latitude" too
# Use your own datasets
result <- accessibility(
points = my_points,
transitionMatrix = my_friction_surface,
populationRaster = my_population_data,
adm0 = my_country_boundary,
adm1 = my_admin_boundaries,
categories = my_custom_categories,
label = "Veterinary Clinics",
path = "./outputs",
name = "custom_analysis"
)# Create categories with any ColorBrewer palette
cats <- create_categories(
breaks = c(0, 30, 60, 90, 120, Inf),
labels = c("Excellent", "Good", "Fair", "Poor", "Very Poor"),
palette = "RdYlBu", # Any valid ColorBrewer palette
direction = -1 # Reverse colors
)The accessibility() function automatically generates:
{name}_combined_plot.png- Integrated map and summary chart{name}_map_plot.png- Accessibility map only{name}_bar_plot.png- Summary bar chart only{name}_summary.csv- Population statistics by travel time
Customize outputs:
accessibility(
points = facilities,
save_opts = list(
dpi = 2000, # High resolution
width = 2, # Larger size
height = 2,
units = "in"
),
path = "./publication_maps",
name = "high_res_analysis"
)The analysis uses a standard 5-category system:
- ≤30 minutes:
- 31-60 minutes:
- 61-90 minutes:
- 91-120 minutes:
- >120 minutes:
Create your own categories for specific use cases:
# Emergency services (shorter time bands)
emergency_cats <- create_categories(
breaks = c(0, 5, 10, 15, 30, Inf),
labels = c("Critical", "Urgent", "Priority", "Standard", "Remote")
)
# Rural health (longer acceptable times)
rural_cats <- create_categories(
breaks = c(0, 60, 120, 180, Inf),
labels = c("Accessible", "Moderate", "Difficult", "Very Difficult")
)The package includes ready-to-use datasets accessible as:
accessMap::population_raster- WorldPop 2020 gridded populationaccessMap::transition_matrix- Motorized travel friction (Malaria Atlas Project)accessMap::adm0- Country boundary from GADMaccessMap::adm1- County boundaries from GADMaccessMap::adm2- Sub-county boundaries from GADMaccessMap::adm3- Ward boundaries from GADM
For other countries/regions, provide:
- Facility coordinates: Matrix/data.frame with lng/lat (auto-detected)
- Population raster: High-resolution gridded population data
- Transition matrix: Cost-distance friction surface
- Administrative boundaries: Country and subdivision boundaries (sf objects)
Important: When using custom transition matrices, ensure they are properly cropped and masked with your study area boundaries to avoid computational errors.
- Healthcare accessibility - Hospital and clinic catchment analysis
- Veterinary services - Animal health facility coverage
- Education access - School accessibility mapping
- Emergency services - Response time analysis
- Infrastructure planning - Facility placement optimization
- Policy evaluation - Before/after accessibility comparisons
The accessibility analysis follows established frameworks from:
- Weiss et al. (2018, 2020) - Global travel time mapping methodologies
- Pfeffer et al. (2018) - Malaria Atlas Project data access
- van Etten (2017) - Spatial distance calculations in R
The methodology uses:
- Cost-distance calculation via gdistance package (Dijkstra's algorithm)
- Population-weighted metrics using high-resolution gridded data
- Realistic travel impedances from motorized friction surfaces
- Travel time categorization with flexible band definitions
accessibility()- Main wrapper for complete analysiscompute_travel_cost()- Calculate travel time surfacesprocess_access_data()- Convert rasters to analysis-ready data
load_default_data()- Load Kenya datasetsvalidate_points()- Validate and standardize coordinatesdefault_categories()- Standard travel time categoriescreate_categories()- Custom travel time categories
generate_summary()- National-level population summariesgenerate_admin_summary()- Administrative unit summaries
create_map()- Accessibility maps with flexible stylingcreate_bar_plot()- Population distribution chartscombine_plots()- Integrated map and chart layoutssave_outputs()- Save plots and data with consistent naming
categorize_travel_time()- Assign travel times to categories
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
-
Pfeffer, D. A., et al. (2018). malariaAtlas: an R interface to global malariometric data hosted by the Malaria Atlas Project. Malaria Journal, 17(1), 352.
-
van Etten, J. (2017). R Package gdistance: Distances and Routes on Geographical Grids. Journal of Statistical Software, 76(13), 1-21.
-
Weiss, D. J., et al. (2018). A global map of travel time to cities to assess inequalities in accessibility in 2015. Nature, 553(7688), 333-336.
-
Weiss, D. J., et al. (2020). Global maps of travel time to healthcare facilities. Nature Medicine, 26(12), 1835-1838.