Calculation Methods
This document provides comprehensive documentation of all calculation methods used by CruisePlan, including distance calculations, duration algorithms, and coordinate transformations.
Distance Calculations
CruisePlan implements multiple distance calculation methods optimized for different operation types and routing scenarios.
Route-Based Distance Calculations
- Route-Based Calculations (Preferred):
Scientific transits and line operations use cumulative distance calculations along the defined route waypoints for maximum accuracy.
def route_distance(points):
total_distance_km = 0.0
for i in range(len(points) - 1):
total_distance_km += haversine_distance(points[i], points[i + 1])
# Return distance in kilometers
return total_distance_km
This allows complex paths not just straight-line distance, for improved timing calculations. However, NetCDF outputs currently store only start/end points for line operations, not intermediate waypoints (current limitation: to be fixed in a later release).
- Point-Based Calculations (Fallback):
Simple great circle distance between entry and exit points when detailed routing is not available.
# Point-based (direct distance) in kilometers
distance = haversine_distance(entry_point, exit_point)
Distance Calculation for Routing *Between* Operations:
Operation Type |
Entry/Exit Points |
Used For |
|---|---|---|
Point Operations (Stations) |
Same coordinates for both |
Distance calculations to/from station location |
Line Operations (Transits) |
First/last waypoints of route |
Distance calculations to transit start/end |
Area Operations |
First/last polygon corners |
Distance calculations to area start/end points |
This is for inter-operation routing. For within-operation routing of LineOperations, the full waypoint list is used. This includes both scientific transits and navigation transits.
Haversine Distance Formula
All great circle distance calculations use the haversine formula for spherical earth approximation:
import math
# From cruiseplan/calculators/distance.py
def haversine_distance(start, end):
"""Calculate Great Circle distance using Haversine formula."""
lat1, lon1 = to_coords(start)
lat2, lon2 = to_coords(end)
phi1, phi2 = math.radians(lat1), math.radians(lat2)
dphi = math.radians(lat2 - lat1)
dlambda = math.radians(lon2 - lon1)
a = (math.sin(dphi / 2) ** 2
+ math.cos(phi1) * math.cos(phi2) * math.sin(dlambda / 2) ** 2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R_EARTH_KM * c
Constants: Earth radius and conversion factors are defined in cruiseplan/utils/constants.py
- Accuracy Considerations:
Earth Approximation: Spherical model suitable for basic estimates of oceanographic distances without requiring more complex package dependencies
Precision: Accurate to ~0.5% for distances up to several thousand kilometers
Duration Calculations
CruisePlan implements operation-specific duration algorithms based on oceanographic best practices.
CTD Profile Duration Calculator
Automatic Duration Calculation:
CTD operations use depth-based duration calculations incorporating realistic descent/ascent rates and operational procedures:
# From cruiseplan/calculators/duration.py
def calculate_ctd_time(self, depth: float) -> float:
"""Calculate CTD profiling duration including descent, ascent, and turnaround."""
if depth <= 0:
return 0.0
# Convert rates (m/s) to m/min using helper function
descent_m_min = rate_per_second_to_rate_per_minute(self.config.ctd_descent_rate)
ascent_m_min = rate_per_second_to_rate_per_minute(self.config.ctd_ascent_rate)
# Calculate profile time
profile_time = (depth / descent_m_min) + (depth / ascent_m_min)
# Total operation duration in minutes
return profile_time + self.config.turnaround_time
Duration Components:
Component |
Typical Value |
Description |
|---|---|---|
Descent Rate |
1.0 m/s |
Standard CTD descent speed for data quality |
Ascent Rate |
1.0 m/s |
Controlled ascent for continuous sampling |
Turnaround Time |
30 minutes |
Station approach, deployment, recovery, departure |
Depth-Duration Examples:
Based on the calculation, the following are example CTD profile durations at various depths. Note, however, that in practice, the CTD speed is typically slower in the top 100 m and bottom 100m (to avoid hitting the bottom/let the altimeter kick in). So our timing estimates will be inaccurate for many shallow profiles. This can be adjusted by altering the descent/ascent rates in the cruise configuration or the turnaround time.
Note: Weather and sea state, or equipment variations may require further adjustments not automatically included in these calculations.
Depth |
Cast Time |
Total Duration |
|---|---|---|
100m |
3.3 min |
35.3 min |
1000m |
33.3 min |
65.3 min |
3000m |
100.0 min |
132.0 min |
5000m |
166.7 min |
198.7 min |
Transit Duration Calculator
Speed-Based Calculations:
Transit durations use distance and vessel speed with automatic unit conversions:
# From cruiseplan/calculators/duration.py
def calculate_transit_time(distance_km, speed_knots=None):
"""Calculate vessel transit duration based on distance and speed."""
# Convert kilometers to nautical miles
distance_nm = km_to_nm(distance_km)
# Calculate duration in hours
duration_hours = distance_nm / speed_knots
# Convert to minutes using helper function
return hours_to_minutes(duration_hours)
Map Visualization vs Distance Calculations
Important
Transit Route Representation: Map visualization differs depending on data source. Maps generated from cruise configuration show full routes (same waypoints as calculations), while maps from timeline data show simplified cruise tracks connecting only activity positions.
Data Source Differences:
- Maps from Cruise Config (cruiseplan map):
Full route waypoints: Same data as distance calculations
Visual: Straight line segments connecting all route waypoints
Calculation: Great circle distance between same waypoints
Correspondence: High fidelity between visualization and calculation
- Maps from Timeline (cruiseplan schedule –format png):
Activity positions only: Connects entry/exit points of operations
Visual: Simplified cruise track through activity locations
Calculation: Full route distance (more detailed than visualization)
Correspondence: Visualization simplified compared to calculations
- Rendering Considerations:
Straight line segments: Maps render direct connections between waypoints
Great circle math: Calculations use spherical earth geometry for precision
Map projection effects: Visual distortion varies with projection and geographic region