env-agents v2.0 provides a unified interface for environmental data integration through a simple 3-method pattern.
The primary interface for environmental data access.
from env_agents.core import SimpleEnvRouter
router = SimpleEnvRouter(base_dir=".")Parameters:
base_dir(str): Project directory for credentials and registry files
Register an environmental data adapter.
from env_agents.adapters import NASA_POWER, WQP
router.register(NASA_POWER())
router.register(WQP())Parameters:
adapter(BaseAdapter): Adapter instance implementing BaseAdapter interface
Returns:
bool: True if registration successful
Find services and capabilities.
# List all services
services = router.discover()
# → ['NASA_POWER', 'WQP']
# Search for temperature data
temp_services = router.discover(query="temperature")
# → {'services': ['NASA_POWER', 'WQP'], 'total_variables': 26}
# Service-specific discovery
nasa_vars = router.discover(service="NASA_POWER", limit=5)Parameters:
query(str, optional): Search term for variablesservice(str, optional): Specific service to querylimit(int, optional): Limit results (default: 20)domain(str, optional): Domain filter ("climate", "water", etc.)
Returns:
List[str]: Service names (if no filters)Dict: Detailed discovery results with variables and metadata
Retrieve environmental data.
from env_agents.core.models import RequestSpec, Geometry
# Define request
spec = RequestSpec(
geometry=Geometry(type="point", coordinates=[-122.4194, 37.7749]),
time_range=("2024-08-01", "2024-08-03"),
variables=["T2M", "PRECTOTCORR"]
)
# Fetch data
df = router.fetch('NASA_POWER', spec)
# → pandas.DataFrame with 6 observationsParameters:
service(str): Service name from registered adaptersspec(RequestSpec): Data request specification
Returns:
pandas.DataFrame: Standardized data with 24 core columns
Standardized request specification for all services.
from env_agents.core.models import RequestSpec, Geometry
spec = RequestSpec(
geometry=Geometry(type="point", coordinates=[-122.4, 37.7]),
time_range=("2024-01-01", "2024-01-31"),
variables=["temperature", "precipitation"],
extra={"timeout": 60}
)Parameters:
geometry(Geometry): Spatial specificationtime_range(Tuple[str, str]): ISO date rangevariables(List[str], optional): Variable names to retrieveextra(Dict, optional): Service-specific parameters
Spatial geometry specification.
# Point
point = Geometry(type="point", coordinates=[-122.4, 37.7])
# Bounding box
bbox = Geometry(type="bbox", coordinates=[-123, 37, -122, 38])Types:
"point": Single coordinate pair[longitude, latitude]"bbox": Bounding box[min_lon, min_lat, max_lon, max_lat]
All services return DataFrames with standardized 24-column schema:
observation_id: Unique identifierdataset: Service name (e.g., "NASA_POWER")source_url: Data source URLsource_version: API versionlicense: Data license
geometry_type: "point", "polygon", etc.latitude,longitude: Decimal degreesgeom_wkt: Well-Known Text geometryspatial_id: Location identifiersite_name: Human-readable locationadmin: Administrative regionelevation_m: Elevation in meters
time: ISO 8601 timestamptemporal_coverage: Time period descriptionretrieval_timestamp: When data was fetched
variable: Standardized variable namevalue: Numeric valueunit: Measurement unitdepth_top_cm,depth_bottom_cm: Depth rangeqc_flag: Quality control flag
attributes: Native service attributes (JSON)provenance: Data lineage information
env-agents v2.0 includes 10 canonical environmental data services:
| Service | Variables | Coverage | Authentication |
|---|---|---|---|
| NASA_POWER | 6 weather/solar | Global | API Key |
| WQP | 22,736 water quality | US/International | None |
| EARTH_ENGINE | 100+ satellite assets | Global | Service Account |
| EPA_AQS | 9 air quality | US | API Key |
| USGS_NWIS | 15 streamflow/groundwater | US | None |
| SoilGrids | 15 soil properties | Global | None |
| OpenAQ | 40 air quality | Global | API Key |
| GBIF | 8 biodiversity | Global | None |
| OSM_Overpass | 70 infrastructure | Global | None |
| SSURGO | 10 soil survey | US | None |
Total: 22,921+ environmental variables
All methods raise descriptive exceptions:
from env_agents.core.errors import FetchError
try:
df = router.fetch('SERVICE_NAME', spec)
except FetchError as e:
print(f"Data retrieval failed: {e}")Services requiring API keys use template-based credential management:
- Copy credential template:
cp config/templates/credentials.yaml.template config/credentials.yaml-
Add your API keys to
config/credentials.yaml -
Never commit credential files (protected by .gitignore)
See CREDENTIALS.md for detailed setup instructions.
from env_agents.core import SimpleEnvRouter
from env_agents.adapters import NASA_POWER
from env_agents.core.models import RequestSpec, Geometry
# 1. Initialize
router = SimpleEnvRouter(base_dir=".")
# 2. Register services
router.register(NASA_POWER())
# 3. Discover capabilities
services = router.discover()
print(f"Available: {services}")
# 4. Fetch data
spec = RequestSpec(
geometry=Geometry(type="point", coordinates=[-122.4, 37.7]),
time_range=("2024-08-01", "2024-08-03"),
variables=["T2M", "PRECTOTCORR"]
)
df = router.fetch('NASA_POWER', spec)
print(f"Retrieved {len(df)} observations")For complete examples, see examples/quick_start.py and the notebook tutorials.