Comprehensive Geospatiotemporal Analysis and Multimodal Integration Toolkit for R
geospatialsuite is a powerful R package for geospatial analysis featuring 60+ vegetation indices, universal spatial analysis, auto-geocoding without coordinates, efficient raster visualization, and comprehensive workflows for agricultural research, environmental monitoring, and remote sensing applications.
# Install the stable version from CRAN
install.packages("geospatialsuite")# install.packages("devtools")
devtools::install_github("cwru-sdle/geospatialsuite")library(geospatialsuite)
# Test your installation
test_geospatialsuite_package_simple()
# Check function availability
test_function_availability(verbose = TRUE)# Load built-in sample data
red <- load_sample_data("sample_red.rds")
nir <- load_sample_data("sample_nir.rds")
blue <- load_sample_data("sample_blue.rds")
study_sites <- load_sample_data("sample_coordinates.csv")
# 1. One-line mapping (auto-detects everything!)
quick_map(red, title = "Red Band")
# 2. Universal spatial join (most common operation- Requires your own data)
result <- universal_spatial_join(
source_data = study_sites,
target_data = red,
method = "extract"
)
# 3. Calculate vegetation indices with sample data
ndvi <- calculate_vegetation_index(
red = red,
nir = nir,
index_type = "NDVI",
verbose = TRUE
)
# 4. Enhanced NDVI with quality filtering
enhanced_ndvi <- calculate_ndvi_enhanced(
red = red,
nir = nir,
quality_filter = TRUE
)
# 5. Multiple indices at once
indices <- calculate_multiple_indices(
red = red,
nir = nir,
blue = blue,
indices = c("NDVI", "EVI", "SAVI"),
output_stack = TRUE
)Work with data that doesnβt have latitude/longitude coordinates. geospatialsuite automatically detects and geocodes geographic identifiers:
# Works with state names or abbreviations
state_data <- data.frame(
state = c("Ohio", "PA", "Michigan"),
population = c(11.8, 13.0, 10.1)
)
spatial_data <- auto_geocode_data(state_data)
# Works with FIPS codes
county_data <- data.frame(
fips = c("39049", "39035", "39113"),
unemployment = c(4.2, 5.1, 4.8)
)
county_sf <- auto_geocode_data(county_data)
# Works with HUC codes (any format!)
watershed_data <- data.frame(
HUC_8 = c("04100009", "04100012"), # or HUC-8, huc8, Huc 8, etc.
water_quality = c(72, 65)
)
huc_sf <- auto_geocode_data(watershed_data)
# Works with ZIP codes
zip_data <- data.frame(
zip = c("43215", "44113", "45202"),
median_income = c(58000, 45000, 72000)
)
zip_sf <- auto_geocode_data(zip_data)
# Preview what will be detected before geocoding
preview_geocoding(my_data)Supported geographic entities: - β States (names or abbreviations) - β Counties - β FIPS codes - β HUC watershed codes (HUC-8, HUC_8, huc8, etc.) - β ZIP codes - β City names
Column name flexibility: The package handles any
naming convention - HUC_8, HUC-8,
huc8, State, STATE,
state_name, etc.
# View all available functions
help(package = "geospatialsuite")
# Auto-geocoding functions
?auto_geocode_data
?preview_geocoding
# Test function availability
test_function_availability()
# Run basic package tests
test_geospatialsuite_package_simple()
# Run minimal functionality test
test_package_minimal(verbose = TRUE)# Load census data with just state names - no coordinates!
census_data <- data.frame(
state = c("California", "Texas", "Florida", "New York"),
population_millions = c(39.5, 29.1, 22.2, 20.2),
median_income = c(75000, 64000, 59000, 72000),
unemployment_rate = c(4.8, 4.1, 3.2, 4.3)
)
# Auto-geocode and visualize
census_sf <- auto_geocode_data(census_data, verbose = TRUE)
quick_map(census_sf, variable = "median_income",
title = "Median Household Income by State")# Water quality data with HUC-8 codes (no coordinates!)
watershed_data <- data.frame(
HUC_8 = c("04100009", "04100012", "04110002", "05120201"),
basin_name = c("Great Miami", "Mill Creek-Cincinnati",
"Middle Ohio", "Upper Wabash"),
nitrogen_mg_l = c(2.3, 3.1, 1.8, 2.7),
phosphorus_mg_l = c(0.08, 0.12, 0.06, 0.09)
)
# Auto-geocode watersheds
huc_sf <- auto_geocode_data(watershed_data, verbose = TRUE)
# Comprehensive water quality analysis
water_results <- analyze_water_quality_comprehensive(
water_data = huc_sf,
variable = "nitrogen_mg_l",
thresholds = list(
Normal = c(0, 2),
Elevated = c(2, 5),
High = c(5, Inf)
)
)
quick_map(huc_sf, variable = "nitrogen_mg_l",
title = "Nitrogen Levels by Watershed")# Get crop codes for analysis
corn_codes <- get_comprehensive_cdl_codes("corn")
grain_codes <- get_comprehensive_cdl_codes("grains")# County data with FIPS codes (no coordinates needed!)
county_data <- data.frame(
fips = c("39049", "39035", "39113", "39061"),
county_name = c("Franklin", "Cuyahoga", "Montgomery", "Hamilton"),
air_quality_index = c(45, 52, 48, 41),
tree_canopy_pct = c(28, 35, 32, 40)
)
# Auto-geocode counties
county_sf <- auto_geocode_data(county_data, verbose = TRUE)red <- load_sample_data("sample_red.rds")
nir <- load_sample_data("sample_nir.rds")
blue <- load_sample_data("sample_blue.rds")
spectral_stack <- c(red, nir, blue)
names(spectral_stack) <- c("red", "nir", "blue")
result <- analyze_crop_vegetation(
spectral_data = spectral_stack,
crop_type = "corn",
analysis_type = "comprehensive"
)
# Structure:
result$vegetation_indices # SpatRaster with calculated indices
result$analysis_results # Detailed analysis results
result$metadata # Processing metadataanalyze_crop_vegetation() classifies vegetation stress,
growth stage, and yield potential using literature-informed thresholds
across multiple indices:
Stress detection applies independent thresholds to each available index (NDVI, EVI, GNDVI, SIPI). NDVI stress ranges (healthy β₯ 0.6, moderate stress 0.4β0.6, severe stress < 0.4) follow Tucker (1979) and Hatfield et al.Β (2008). EVI and GNDVI thresholds are similarly derived from Hatfield et al.Β (2008).
Growth stage is predicted from mean NDVI using crop-specific cutoffs consistent with Anyamba et al.Β (2021), who applied explicit per-crop NDVI thresholds for large-scale crop monitoring with MODIS and crop mask data β the same conceptual approach used here. The MODIS + CDL crop monitoring framework follows Akanbi et al.Β (2024).
Yield potential uses a composite score averaging up to five normalized indices (NDVI, EVI, GNDVI, DVI, RVI), consistent with the multi-index approach of Bolton & Friedl (2013) and Mkhabela et al.Β (2011).
Note: Thresholds are literature-informed starting points. Exact NDVI boundaries vary by region, cultivar, sensor, and season. Calibration with local ground truth data is recommended.
References: - Tucker (1979). Remote Sensing of Environment, 8(2), 127β150. https://doi.org/10.1016/0034-4257(79)90013-0
Hatfield et al.Β (2008). Agronomy Journal, 100(S3), S-117βS-131. https://doi.org/10.2134/agronj2006.0370c
Anyamba et al.Β (2021). Remote Sensing, 13(21), 4227. https://doi.org/10.3390/rs13214227
Akanbi et al.Β (2024). Journal of Geovisualization and Spatial Analysis, 8, 9 https://doi.org/10.1007/s41651-023-00164-y
Bolton & Friedl (2013). Agricultural and Forest Meteorology, 173, 74β84. https://doi.org/10.1016/j.agrformet.2013.01.007
Mkhabela et al.Β (2011). Agricultural and Forest Meteorology, 151(3), 385β393. https://doi.org/10.1016/j.agrformet.2010.11.012
No more manual coordinate lookups! Work directly with: - State names, county names, FIPS codes - HUC watershed codes (any format) - ZIP codes, city names - Flexible column naming (HUC_8, HUC-8, huc8 all work!)
Works with any spatial data combination - no need to learn different
functions for different data types. The
universal_spatial_join() function automatically handles: -
Vector-to-vector joins - Vector-to-raster extractions
- Raster-to-raster operations - Multi-dataset integrations
terra::plot() and terra::plotRGB()quick_map()
function for instant visualizationuniversal_spatial_join()Designed specifically for reproducible research with: - Comprehensive
testing suite (test_geospatialsuite_package_simple()) -
Function availability checking
(test_function_availability()) - Quality control and
filtering options - Integration with modern R spatial ecosystem
geospatialsuite is optimized for:
For realistic satellite imagery (5KΓ5K pixels):
# Test basic functionality
test_package_minimal(verbose = TRUE)
# Check which functions are available
test_function_availability(verbose = TRUE)| # | Index | Category | Application | Required Bands | Description |
|---|---|---|---|---|---|
| 1 | NDVI | basic | general | Red, NIR | Normalized Difference Vegetation Index |
| 2 | SAVI | basic | soil | Red, NIR | Soil Adjusted Vegetation Index |
| 3 | MSAVI | basic | soil | Red, NIR | Modified Soil Adjusted Vegetation Index |
| 4 | OSAVI | basic | soil | Red, NIR | Optimized Soil Adjusted Vegetation Index |
| 5 | EVI | basic | general | Red, NIR, Blue | Enhanced Vegetation Index |
| 6 | EVI2 | basic | general | Red, NIR | Two-band Enhanced Vegetation Index |
| 7 | DVI | basic | biomass | Red, NIR | Difference Vegetation Index |
| 8 | RVI | basic | general | Red, NIR | Ratio Vegetation Index |
| 9 | GNDVI | basic | chlorophyll | Green, NIR | Green NDVI |
| 10 | WDVI | basic | soil | Red, NIR | Weighted Difference Vegetation Index |
| 11 | ARVI | enhanced | atmospheric | Red, NIR, Blue | Atmospherically Resistant Vegetation Index |
| 12 | RDVI | enhanced | general | Red, NIR | Renormalized Difference Vegetation Index |
| 13 | PVI | enhanced | general | Red, NIR | Perpendicular Vegetation Index |
| 14 | IPVI | enhanced | general | Red, NIR | Infrared Percentage Vegetation Index |
| 15 | TNDVI | enhanced | general | Red, NIR | Transformed NDVI |
| 16 | GEMI | enhanced | general | Red, NIR | Global Environment Monitoring Index |
| 17 | VARI | enhanced | general | Red, Green, Blue | Visible Atmospherically Resistant Index |
| 18 | TSAVI | enhanced | soil | Red, NIR | Transformed Soil Adjusted VI |
| 19 | ATSAVI | enhanced | soil | Red, NIR | Adjusted Transformed Soil Adjusted VI |
| 20 | GESAVI | enhanced | soil | Red, NIR | Generalized Soil Adjusted VI |
| 21 | MTVI | enhanced | general | Red, NIR | Modified Triangular VI |
| 22 | CTVI | enhanced | canopy | Red, NIR | Corrected Transformed VI |
| 23 | NDRE | advanced | stress | NIR, RedEdge | Normalized Difference Red Edge |
| 24 | MTCI | advanced | stress | RedEdge, NIR | MERIS Terrestrial Chlorophyll Index |
| 25 | IRECI | advanced | stress | RedEdge, NIR | Inverted Red-Edge Chlorophyll Index |
| 26 | S2REP | advanced | stress | RedEdge | Sentinel-2 Red-Edge Position |
| 27 | PSRI | advanced | stress | RedEdge, NIR | Plant Senescence Reflectance Index |
| 28 | CRI1 | advanced | stress | Red, Green | Carotenoid Reflectance Index 1 |
| 29 | CRI2 | advanced | stress | RedEdge, Green | Carotenoid Reflectance Index 2 |
| 30 | ARI1 | advanced | stress | RedEdge, Green | Anthocyanin Reflectance Index 1 |
| 31 | ARI2 | advanced | stress | RedEdge, NIR | Anthocyanin Reflectance Index 2 |
| 32 | MCARI | advanced | stress | Red, Green | Modified Chlorophyll Absorption Ratio Index |
| 33 | PRI | stress | stress | Green, NIR | Photochemical Reflectance Index |
| 34 | SIPI | stress | stress | Red, NIR | Structure Insensitive Pigment Index |
| 35 | CCI | stress | stress | RedEdge, Green | Canopy Chlorophyll Index |
| 36 | NDNI | stress | stress | NIR, SWIR1 | Normalized Difference Nitrogen Index |
| 37 | CARI | stress | stress | Red, Green | Chlorophyll Absorption Ratio Index |
| 38 | TCARI | stress | stress | Red, Green | Transformed Chlorophyll Absorption Ratio Index |
| 39 | MTVI1 | stress | stress | Red, NIR | Modified Triangular Vegetation Index 1 |
| 40 | MTVI2 | stress | stress | Red, NIR | Modified Triangular Vegetation Index 2 |
| 41 | TVI | stress | stress | Red, NIR | Triangular Vegetation Index |
| 42 | NPCI | stress | stress | Red, Blue | Normalized Pigment Chlorophyll Index |
| 43 | RARS | stress | stress | Red, NIR | Ratio Analysis of Reflectance Spectra |
| 44 | NPQI | stress | stress | Red, Blue | Normalized Phaeophytinization Index |
| 45 | NDWI | water | water | Green, NIR | Normalized Difference Water Index |
| 46 | MNDWI | water | water | Green, SWIR1 | Modified Normalized Difference Water Index |
| 47 | NDMI | water | water | NIR, SWIR1 | Normalized Difference Moisture Index |
| 48 | MSI | water | water | NIR, SWIR1 | Moisture Stress Index |
| 49 | NDII | water | water | NIR, SWIR1 | Normalized Difference Infrared Index |
| 50 | WI | water | water | NIR, SWIR1 | Water Index |
| 51 | SRWI | water | water | NIR, SWIR1 | Simple Ratio Water Index |
| 52 | LSWI | water | water | NIR, SWIR1 | Land Surface Water Index |
| 53 | LAI | specialized | forestry | Red, NIR | Leaf Area Index |
| 54 | FAPAR | specialized | forestry | Red, NIR | Fraction of Absorbed PAR |
| 55 | FCOVER | specialized | forestry | Red, NIR | Fraction of Vegetation Cover |
| 56 | NBR | specialized | forestry | NIR, SWIR2 | Normalized Burn Ratio |
| 57 | BAI | specialized | forestry | Red, NIR | Burn Area Index |
| 58 | NDSI | specialized | snow | Green, SWIR1 | Normalized Difference Snow Index |
| 59 | GRVI | specialized | general | Red, Green | Green-Red Vegetation Index |
| 60 | VIG | specialized | general | Green, NIR | Vegetation Index Green |
| 61 | CI | specialized | canopy | Red, Green | Coloration Index |
| 62 | GBNDVI | specialized | general | Green, Blue, NIR | Green-Blue NDVI |
Total: 60+ indices with automatic band detection across satellite platforms
# Core dependencies (automatically installed with geospatialsuite)
# These are listed in DESCRIPTION Imports and will be installed automatically
terra (>= 1.6-17)
sf (>= 1.0-0)
dplyr (>= 1.0.0)
ggplot2 (>= 3.3.0)
magrittr
viridis
leaflet # Interactive web mapping
rnaturalearth # Natural Earth country boundaries
tigris # US Census boundaries (states, counties, FIPS)
# Plus: graphics, grDevices, htmlwidgets, mice, parallel,
# RColorBrewer, stats, stringr, tools, utils# These packages provide additional functionality but are not required
# Install them separately for enhanced capabilities
# Raster visualization enhancements
install.packages(c(
"tidyterra", # Efficient raster visualization with ggplot2
"RStoolbox" # Remote sensing tools and visualization
))
# Figure composition and animation
install.packages(c(
"patchwork", # Multi-panel figures and layouts
"gganimate" # Animated visualizations
))
# Extended geocoding capabilities (listed in DESCRIPTION Suggests)
install.packages(c(
"nhdplusTools", # HUC watershed boundaries
"zipcodeR", # ZIP code centroids
"tidygeocoder" # City name geocoding
))If you use geospatialsuite in your research, please cite:
citation("geospatialsuite")MIT License - see LICENSE file for details.
terra, sf, ggplot2, and broader R
spatial communityterra package developers (Robert J. Hijmans et
al.)sf package developers (Edzer Pebesma et al.)tigris,
nhdplusTools, zipcodeR,
tidygeocoder)