API Examples

This guide shows how to use CruisePlan’s Python API for programmatic cruise planning.

Quick Start

The simplest workflow: process a YAML configuration and generate a schedule.

import cruiseplan

# Process configuration (enrich + validate + map)
process_result = cruiseplan.process("my_cruise.yaml")

# Generate schedule from the enriched config
schedule_result = cruiseplan.schedule(process_result.config)

print(f"Files created: {schedule_result.files_created}")

Or combine both steps with cruiseplan.run:

import cruiseplan

process_result, schedule_result = cruiseplan.run("my_cruise.yaml")

print(f"Process files: {process_result.files_created}")
print(f"Schedule files: {schedule_result.files_created}")

Top-Level API

All public functions are importable directly from cruiseplan.

Bathymetry

import cruiseplan

# Download bathymetry data (gebco2025 by default)
result = cruiseplan.bathymetry(bathy_source="gebco2025", output_dir="data/bathymetry")
print(f"Downloaded: {result.data_file}")

Enrich

import cruiseplan

result = cruiseplan.enrich(
    config_file="cruise.yaml",
    add_depths=True,
    add_coords=True,
    expand_sections=True,
)
print(f"Enriched config: {result.output_file}")

Validate

import cruiseplan

result = cruiseplan.validate("cruise_enriched.yaml")
if result.success:
    print("Configuration is valid")
else:
    print(f"Errors: {result.errors}")

Process

import cruiseplan

result = cruiseplan.process(
    config_file="cruise.yaml",
    output_dir="data",
    add_depths=True,
    add_coords=True,
)
print(f"Enriched config: {result.config}")
print(f"Files: {result.files_created}")

Schedule

import cruiseplan

result = cruiseplan.schedule(
    config_file="cruise_enriched.yaml",
    output_dir="data",
)
print(f"Timeline entries: {len(result.timeline)}")
print(f"Files: {result.files_created}")

Run (process + schedule)

import cruiseplan

process_result, schedule_result = cruiseplan.run(
    config_file="cruise.yaml",
    output_dir="data",
    bathy_source="gebco2025",
    include_eez=True,
)

Map

import cruiseplan

result = cruiseplan.map(
    config_file="cruise.yaml",
    output_dir="data",
    figsize=[14, 10],
    include_eez=True,
)
print(f"Map files: {result.files_created}")

Result Types

Each API function returns a typed result object:

from cruiseplan.api.types import ProcessResult, ScheduleResult, EnrichResult

process_result: ProcessResult = cruiseplan.process("cruise.yaml")
process_result.config          # Path to enriched YAML, or None if process failed
process_result.files_created   # list[Path]
process_result.summary         # dict with run metadata

schedule_result: ScheduleResult = cruiseplan.schedule("cruise_enriched.yaml")
schedule_result.timeline        # list[dict] — one entry per activity
schedule_result.files_created   # list[Path]
schedule_result.summary         # dict with run metadata

Advanced: CruiseInstance

For direct access to the enrichment and scheduling machinery:

from cruiseplan.runtime.cruise import CruiseInstance

# Load from YAML
cruise = CruiseInstance("cruise_config.yaml")

# Access configuration data
print(f"Cruise: {cruise.config.cruise_name}")
print(f"Start date: {cruise.config.start_date}")

# Add bathymetry depths to stations
cruise.enrich_depths()

# Add formatted coordinate fields (DDM)
cruise.add_coordinate_displays()

# Save processed configuration
cruise.to_yaml("enriched_cruise.yaml")

Timeline Generation

from cruiseplan.timeline import generate_timeline

# Returns list[dict] — one dict per scheduled activity
timeline = generate_timeline(cruise)

# Inspect individual activities
for entry in timeline:
    print(entry.get("name"), entry.get("start_time"), entry.get("duration_hours"))

Distance Calculations

from cruiseplan.timeline.distance import haversine_distance

# Distance between two points in kilometres
distance_km = haversine_distance((60.0, -30.0), (61.0, -29.0))
print(f"Distance: {distance_km:.1f} km")

Working with PANGAEA Data

from cruiseplan.data.pangaea import PangaeaManager, load_campaign_data

# Search for datasets
manager = PangaeaManager()
datasets = manager.search(
    query="CTD North Atlantic",
    bbox=(-30, 60, 0, 70),  # min_lon, min_lat, max_lon, max_lat
    limit=20,
)

# Load previously downloaded campaign data
historical_data = load_campaign_data("data/historical_stations.pkl")
print(f"Loaded {len(historical_data)} campaigns")

Error Handling

from cruiseplan.config.exceptions import ValidationError, FileError
from cruiseplan.runtime.cruise import CruiseInstance

try:
    cruise = CruiseInstance("cruise_config.yaml")

except ValidationError as e:
    print(f"Configuration error: {e}")

except FileError as e:
    print(f"File error: {e}")

except Exception as e:
    print(f"Unexpected error: {e}")

For complete API documentation, see CruisePlan API.