Astrolabe and Zelee (1837-40)¶
Dumont d’Urville commanded a French expedition to the Southern Ocean in the Ships Astrolabe and Zelee.
Their observations were published in Voyage au pole sud et dans l’Océanie sur les corvettes l’Astrolabe et la Zélée
Transcribed observations¶
Conversion script¶
#!/usr/bin/perl
# Process digitised logbook data from the Astrolabe and Zelee into
# IMMA records.
use strict;
use warnings;
use MarineOb::IMMA;
use Getopt::Long;
use FindBin;
use MarineOb::lmrlib qw(rxltut ixdtnd rxnddt fxmmmb fwbpgv fwbptc);
my $Ship_name = 'Astrolabe';
my ( $Year, $Month, $Day );
my $Last_lat;
my $Last_lon;
my $Lat_flag = 'N';
my $Lon_flag = 'E';
for ( my $i = 0 ; $i < 6 ; $i++ ) { <>; } # Skip headers
while (<>) {
my $Ob = new MarineOb::IMMA;
$Ob->clear(); # Why is this necessary?
push @{ $Ob->{attachments} }, 0;
my @Fields = split /\t/, $_;
if ( defined( $Fields[0] ) && $Fields[0] =~ /\d/ ) {
$Year = $Fields[0];
}
if ( defined( $Fields[1] ) && $Fields[1] =~ /\d/ ) {
$Month = $Fields[1];
}
if ( defined( $Fields[2] ) && $Fields[2] =~ /\d/ ) {
$Day = $Fields[2];
# printf "%04d/%02d/%02d\n",$Year,$Month,$Day
}
$Ob->{YR} = $Year;
$Ob->{MO} = $Month;
$Ob->{DY} = $Day;
if ( defined( $Fields[3] ) && $Fields[3] =~ /\d/ ) {
$Ob->{HR} = int( $Fields[3] / 100 ) + ( $Fields[3] % 100 ) / 60;
}
# Obs at 24 hours break the UTC correction
if($Ob->{HR}==24) { $Ob->{HR}=23.99; }
if ( defined( $Fields[12] ) && $Fields[12] =~ /[a-z]/ ) { # Port name
( $Ob->{LAT}, $Ob->{LON} ) = position_from_port( $Fields[12] );
$Ob->{LI} = 6; # Position from metadata
}
else {
if ( defined( $Fields[4] )
&& $Fields[4] =~ /(\d+)\s+(\d+)\s*([NS]*)/ )
{
$Ob->{LAT} = $1 + $2 / 60;
if ( defined($3) && ( $3 eq 'N' || $3 eq 'S' ) ) { $Lat_flag = $3; }
if ( $Lat_flag eq 'S' ) { $Ob->{LAT} *= -1; }
}
if ( defined( $Fields[5] )
&& $Fields[5] =~ /(\d+)\s+(\d+)\s*([EW]*)/ )
{
$Ob->{LON} = $1 + $2 / 60;
if ( defined($3) && ( $3 eq 'E' || $3 eq 'W' ) ) { $Lon_flag = $3; }
if ( $Lon_flag eq 'W' ) { $Ob->{LON} *= -1; }
$Ob->{LON} += 2.33; # Paris longitudes
if($Ob->{LON}>180) { $Ob->{LON} -= 360; }
}
if ( defined( $Ob->{LAT} ) || defined( $Ob->{LON} ) ) {
$Ob->{LI} = 4; # Deg+Min position precision
}
}
if ( defined( $Ob->{LON} ) ) { $Last_lon = $Ob->{LON}; }
if ( defined( $Ob->{LAT} ) ) { $Last_lat = $Ob->{LAT}; }
# Convert ob date and time to UTC
if ( defined($Last_lon)
&& defined( $Ob->{HR} )
&& defined( $Ob->{DY} )
&& defined( $Ob->{MO} )
&& defined( $Ob->{YR} ) )
{
my $elon = $Last_lon;
if ( $elon < 0 ) { $elon += 360; }
my ( $uhr, $udy ) = rxltut(
$Ob->{HR} * 100,
ixdtnd( $Ob->{DY}, $Ob->{MO}, $Ob->{YR} ),
$elon * 100
);
$Ob->{HR} = $uhr / 100;
( $Ob->{DY}, $Ob->{MO}, $Ob->{YR} ) = rxnddt($udy);
}
else { $Ob->{HR} = undef; }
# Temperatures already in C
if ( defined( $Fields[8] ) && $Fields[8] =~ /\d/ ) {
$Ob->{AT} = $Fields[8];
}
if ( defined( $Fields[9] ) && $Fields[9] =~ /\d/ ) {
$Ob->{SST} = $Fields[9];
}
# Pressure converted from mm - already temperature corrected.
if ( defined( $Fields[6] ) && $Fields[6] =~ /\d/ ) {
$Ob->{SLP} = fxmmmb($Fields[6]);
}
# Gravity correction
if(defined($Ob->{SLP}) && defined($Last_lat)) {
$Ob->{SLP} += fwbpgv( $Ob->{SLP}, $Last_lat, 2);
}
# Fill in extra metadata
$Ob->{IM} = 0; # Check with Scott
$Ob->{ATTC} = 0; # No attachments
$Ob->{TI} = 0; # Nearest hour time precision
$Ob->{DS} = undef; # Unknown course
$Ob->{VS} = undef; # Unknown speed
$Ob->{NID} = undef; # Check with Scott
$Ob->{II} = 10; # Check with Scott
$Ob->{ID} = $Ship_name;
$Ob->{C1} = '04'; # French
if ( defined( $Ob->{AT} )
|| defined( $Ob->{WBT} )
|| defined( $Ob->{DPT} )
|| defined( $Ob->{SST} ) )
{
$Ob->{IT} = 0; # Temps in degC and 10ths
}
$Ob->write( \*STDOUT );
}
# Get a position from a port name
sub position_from_port {
my $Name = lc(shift);
if ( $Name =~ /akaroa/ ) {
return ( -43.80, 172.97 );
}
#die "Unknown port $Name";
return ( undef, undef );
}