Skip to content

jpr5/tcd

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TCD - Tidal Constituent Database Reader Tests

A pure Ruby gem for reading TCD (Tidal Constituent Database) files used by XTide for tide predictions.

Features

  • Pure Ruby - No C extensions, FFI, or external dependencies
  • Complete TCD v2 support - Reads all station types and constituent data
  • Lazy loading - Stations can be iterated without loading all into memory
  • Constituent inference - Compute missing constituents from major ones (M2, S2, K1, O1)
  • Geospatial queries - Find nearest stations or stations within a radius

Installation

Add this line to your application's Gemfile:

gem 'tcd'

Or install it directly:

gem install tcd

Usage

Basic Usage

require 'tcd'

TCD.open("harmonics.tcd") do |db|
    puts "Stations: #{db.station_count}"
    puts "Constituents: #{db.constituent_count}"
    puts "Year Range: #{db.year_range}"

    # Search for stations
    db.find_stations("San Francisco").each do |station|
        puts "#{station.name}: #{station.latitude}, #{station.longitude}"
    end
end

Station Types

TCD files contain two types of stations:

  • Reference stations - Have full harmonic constituent data (amplitudes & epochs)
  • Subordinate stations - Have time/height offsets relative to a reference station
TCD.open("harmonics.tcd") do |db|
    # Get only reference stations
    db.reference_stations.each do |s|
        puts "#{s.name}: #{s.active_constituents} constituents"
    end

    # Get only subordinate stations
    db.subordinate_stations.each do |s|
        puts "#{s.name}: offset from station ##{s.reference_station}"
    end
end

Geospatial Queries

TCD.open("harmonics.tcd") do |db|
    # Find nearest station to coordinates
    nearest = db.nearest_station(37.8, -122.4)
    puts "Nearest: #{nearest.name}"

    # Find nearest reference station only
    nearest_ref = db.nearest_station(37.8, -122.4, type: :reference)

    # Find all stations within 1 degree (~111 km at equator)
    nearby = db.stations_near(37.8, -122.4, radius: 1.0)
    puts "Found #{nearby.size} stations within 1 degree"
end

Constituent Data

TCD.open("harmonics.tcd") do |db|
    # Access constituent information
    m2 = db.constituent("M2")
    puts "M2 speed: #{m2.speed} degrees/hour"

    # Get equilibrium argument for a specific year
    eq = m2.equilibrium_for_year(2025, db.header.start_year)

    # Get node factor for a specific year
    nf = m2.node_factor_for_year(2025, db.header.start_year)
end

Constituent Inference

For stations with limited observation data, you can infer missing constituents:

TCD.open("harmonics.tcd") do |db|
    station = db.station_by_name("Some Station")

    before = station.active_constituents
    if db.infer_constituents(station)
        after = station.active_constituents
        puts "Inferred #{after - before} additional constituents"
    end
end

Station Type Detection

TCD.open("harmonics.tcd") do |db|
    db.stations.each do |s|
        if s.tide?
            puts "#{s.name} is a TIDE station"
        elsif s.current?
            puts "#{s.name} is a CURRENT station"
        end
    end
end

Command Line Tool

The gem includes a tcd-info command for exploring TCD files:

# Show database summary
tcd-info harmonics.tcd

# List stations
tcd-info harmonics.tcd --stations 20

# Search for stations
tcd-info harmonics.tcd --search "Boston"

# List constituents
tcd-info harmonics.tcd --constituents

TCD File Format

TCD files are binary databases containing:

  • Header - ASCII key-value pairs defining encoding parameters
  • Lookup tables - Countries, timezones, datums, level units, etc.
  • Constituent data - Speeds, equilibrium arguments, and node factors
  • Station records - Bit-packed binary records for each station

This gem implements a complete reader for the TCD v2 format as documented in the libtcd library.

Obtaining TCD Files

Harmonics data files are available from the XTide website. The "harmonics-dwf" files are free and contain data for thousands of stations worldwide.

Development

# Run tests
rake test

# Run tests with a specific TCD file
TCD_TEST_FILE=/path/to/harmonics.tcd rake test

# Run example program
TCD_FILE=/path/to/harmonics.tcd rake example

# Open console
rake console

License

MIT License. See LICENSE for details.

Acknowledgments

  • XTide by David Flater
  • libtcd by Jan Depner and David Flater
  • Tidal analysis methods from "Manual of Harmonic Analysis and Prediction of Tides" by Paul Schureman

About

Ruby implementation for reading Tide Constituent Databases (libtcd)

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages