You might notice that there’s now a Ham Radio QSO Map lurking on the front page. Thanks to the WordPress OpenStreetMap plugin (which I’ve slightly abused before). Here’s a small piece of Perl which will take your ADIF log and convert it to a WP-OSM marker file.
Note that this program assumes you’ve downloaded your log from QRZ.com, as it requires the locator field for both inbound and outbound stations.
#!/usr/bin/perl -w
# adif2osm - convert ADIF log to OSM map file
# scruss.com / VA3PID - 2011/06/19
use strict;
use constant MARKERDIR =>
'https://glaikit.org/wp-content/plugins/osm/icons/';
use constant QRZURL => 'http://qrz.com/db/';
sub maidenhead2latlong;
my ( $temp, @results ) = '';
### Fast forward past header
while (<>) {
last if m/<eoh>\s+$/i;
}
### While there are records remaining...
while (<>) {
$temp .= $_;
### Process if end of record tag reached
if (m/<eor>\s+$/i) {
my %hash;
$temp =~ s/\n//g;
$temp =~ s/<eoh>.*//i;
$temp =~ s/<eor>.*//i;
my @arr = split( '<', $temp );
foreach (@arr) {
next if (/^$/);
my ( $key, $val ) = split( '>', $_ );
$key =~ s/:.*$//;
$hash{ lc($key) } = $val unless ( $key eq '' );
}
push @results, \%hash;
$temp = '';
}
}
# generate OSM plugin file
my @data = ();
my ( $mygrid, $station_callsign ) = '';
# output header
print
join( "\t", qw/lat lon title description icon iconSize iconOffset/ ),
"\n";
foreach (@results) {
next unless ( exists( $_->{gridsquare} ) && exists( $_->{call} ) );
$mygrid = $_->{my_gridsquare}
if ( exists( $_->{my_gridsquare} ) );
$station_callsign = $_->{station_callsign}
if ( exists( $_->{station_callsign} ) );
push @data, $_->{freq} . ' MHz' if ( exists( $_->{freq} ) );
$data[$#data] .= ' (' . $_->{band} . ')' if ( exists( $_->{band} ) );
push @data, $_->{mode} if ( exists( $_->{mode} ) );
push @data, $_->{qso_date} . ' ' . $_->{time_on} . 'Z'
if ( exists( $_->{qso_date} ) && exists( $_->{time_on} ) );
my ( $lat, $long ) = maidenhead2latlong( $_->{gridsquare} );
print join( "\t",
$lat,
$long,
'<a href="' . QRZURL . $_->{call} . '">' . $_->{call} . '</a>',
join( ' - ', @data ),
MARKERDIR . 'wpttemp-green.png',
'0,-24' ),
"\n";
@data = ();
}
# show home station last, so it's on top
my ( $lat, $long ) = maidenhead2latlong($mygrid);
print join( "\t",
$lat,
$long,
'<a href="'
. QRZURL
. $station_callsign . '">'
. $station_callsign . '</a>',
'Home Station',
MARKERDIR . 'wpttemp-red.png',
'0,-24' ),
"\n";
exit;
sub maidenhead2latlong {
# convert a Maidenhead Grid location (eg FN03ir)
# to decimal degrees
# this code could be cleaner/shorter/clearer
my @locator =
split( //, uc(shift) ); # convert arg to upper case array
my $lat = 0;
my $long = 0;
my $latdiv = 0;
my $longdiv = 0;
my @divisors = ( 72000, 36000, 7200, 3600, 300, 150 )
; # long,lat field size in seconds
my $max = ( $#locator > $#divisors ) ? $#divisors : $#locator;
for ( my $i = 0 ; $i <= $max ; $i++ ) {
if ( int( $i / 2 ) % 2 ) { # numeric
if ( $i % 2 ) { # lat
$latdiv = $divisors[$i]; # save for later
$lat += $locator[$i] * $latdiv;
}
else { # long
$longdiv = $divisors[$i];
$long += $locator[$i] * $longdiv;
}
}
else { # alpha
my $val = ord( $locator[$i] ) - ord('A');
if ( $i % 2 ) { # lat
$latdiv = $divisors[$i]; # save for later
$lat += $val * $latdiv;
}
else { # long
$longdiv = $divisors[$i];
$long += $val * $longdiv;
}
}
}
$lat += ( $latdiv / 2 ); # location of centre of square
$long += ( $longdiv / 2 );
return ( ( $lat / 3600 ) - 90, ( $long / 3600 ) - 180 );
}
You’ll need to update MARKERDIR to reflect your own WP-OSM installation. Mine might move, so if you don’t change it, and you don’t get markers, please don’t blame me.
The basic code to include a map is like this:
You’ll need to change the marker_file URL, too.
Note that, while this script generates links into the QRZ callsign database, it doesn’t hit that site unless you click a link.