#!/usr/bin/perl -w
# $Id:$

$out = "japan_us_map.ps";
$pngout = "japan_us_map.png";

# Scale
$scale  = "1:14000000";
# Coastline resolution
$res    = "i";

# Map extents
$south  = 25;   # southern latitude
$north  = 50;   # northern latitude
$cent   = 0.5*($south + $north);
# Standard parallels for LCC projection
$lat1   = 25;
$lat2   = 45;
# Longitude range
$lon_range = 20;

# Central longitude for Japan
$j_lon  = 136.5;
$j_east = $j_lon + $lon_range/2;
$j_west = $j_lon - $lon_range/2;

# Central longitude for US
$us_lon  = -80;
$us_east = $us_lon + $lon_range/2;
$us_west = $us_lon - $lon_range/2;

$us_proj= "l$us_lon/$cent/$lat1/$lat2/$scale";
$j_proj = "l$j_lon/$cent/$lat1/$lat2/$scale";

$us_region = "$us_west/$us_east/$south/$north";
$j_region  = "$j_west/$j_east/$south/$north";

warn "us_region = $us_region\n";
warn "j_region = $j_region\n";

&init();
&do_us();
&do_state_labels();
&do_us_cities();
&do_japan();
&do_japan_cities();
&do_island_labels();
&do_scalebar();
&do_graticule();
&add_map_annotations();
&finish_up();
&convert_to_png();

sub init {
  system( "gmtset PLOT_DEGREE_FORMAT -ddd" ) and die "init: gmtset had a problem: $!";
  system( "gmtset BASEMAP_TYPE plain" ) and die "init: gmtset had a problem: $!";
  system( "gmtset GRID_PEN 0.5p/130/130/130ta" ) and die "init: gmtset had a problem: $!";
  system( "gmtset FRAME_PEN 0.5p/255/255/255" ) and die "init: gmtset had a problem: $!";
  system( "gmtset PAPER_MEDIA letter" ) and die "init: gmtset had a problem: $!";
  # dummy start
  system( "psxy /dev/null -J$us_proj -R$us_region -Sp -P -Y4c -K -V > $out" ) and die;
}

sub do_us {
  system( "pscoast -J$us_proj -R$us_region -D$res -N1 -N2 -A2000 -G250 -W0.5p/0/0/0 -K -O -V >> $out" )
    and die "do_us:  pscoast had a problem: $!";
}

sub do_state_labels {
  my $textsize = 9;
  my $labelfile = "/home/braup/lib/GMT/state_label_locations.txt";
  open F, $labelfile or die "Couldn't open $labelfile for reading: $!";
  open PSTEXT, "| pstext -J$us_proj -R$us_region -G30 -O -K -V >> $out"
    or die "Couldn't open pipe to pstext: $!";
  while (<F>) {
    my ($lon, $lat, $label) = split;
    unless ($label eq "RI" ) {
      print PSTEXT "$lon $lat $textsize 0 0 CM $label\n";
    }
  }
  close PSTEXT;
  close F;
  # Special cases for RI and CT
  open PSTEXT, "| pstext -J$us_proj -R$us_region -M -D0.3c/-0.35c -G30 -O -K -V >> $out"
      or die "Couldn't open pipe to pstext: $!";
  print PSTEXT "> -71.4304202088889 41.5492257748148 $textsize 0 0 LC 2 3c r\nRI\n";
  close PSTEXT;
}

sub do_us_cities {
}

sub do_japan {
# system( "pscoast -J$j_proj -R$j_region -D$res -A100 -W0.5p/50 -G120 -O -K -V >> $out" )
#   and die "do_japan:  pscoast had a problem: $!";
  my $command = "gzip -dc /home/braup/lib/GMT/State_Country_Boundaries/Asia/japan.dat.gz";
  $command .= " | psxy -J$j_proj -R$j_region -M -W0.5p/50 -G120 -O -K -V >> $out";
  system( "$command" ) and die "do_japan:  pscoast had a problem: $!";
}

sub do_japan_cities {
  my @cities = (
            "140.0 35.74 Tokyo",
               );
  # Make dots
  open PSXY, "| psxy -J$j_proj -R$j_region -Sc0.1c -G255 -O -K -V >> $out"
    or die "Couldn't open pipe to psxy: $!";
  foreach $city (@cities) {
    print PSXY "$city\n";
  }
  close PSXY;

  # Make Labels
  open PSTEXT, "| pstext -J$j_proj -R$j_region -D-0.1c/0.0c -G255 -O -K -V >> $out"
    or die "Couldn't open pipe to pstext: $!";
  foreach $city (@cities) {
    my ($lon,$lat,$label) = split(' ', $city);
    print PSTEXT "$lon $lat 10 0 0 RB $label\n";
  }
  close PSTEXT;
}

sub do_island_labels {
  my $size = 10;
  my @labels = (
    "139.0 36.6 $size 0 0 CM HONSHU",
    "143.1 43.5 $size 0 0 CM HOKKAIDO",
    "133.4 33.7 $size 25 0 CM SHIKOKU",
    "131.0 32.5 $size 75 0 CM KYUSHU",
    "129.5 27.2 $size 50 0 CM RYUKYU ISLANDS"
    );
  open PSTEXT, "| pstext -J$j_proj -R$j_region -G0 -O -K -V >> $out"
    or die "Couldn't open pipe to pstext: $!";
  foreach $label (@labels) {
    print PSTEXT "$label\n";
  }
  close PSTEXT;
}

sub do_scalebar {
  system( "psbasemap -J$j_proj -R$j_region -Lx12c/6.8c/40/500k -O -K -V >> $out" ) and die "do_scalebar: problem: $!";
  system( "psbasemap -J$j_proj -R$j_region -Lx12c/5.6c/40/300m -O -K -V >> $out" ) and die "do_scalebar: problem: $!";
}

sub do_graticule {
  system( "psbasemap -J$j_proj -R$j_region -B/a5f5g5WE -O -K -V >> $out" ) and die "do_graticule: problem: $!";
}

sub add_map_annotations {
  my @notes = (
     "125.5 24.1 8 0 0 LM Lambert Conformal Conic Projection.  Produced using GMT (http://gmt.soest.hawaii.edu/)"
              );
  open PSTEXT, "| pstext -J$j_proj -R$j_region -N -G0 -O -K -V >> $out" or die "Couldn't open pipe to pstext: $!";
  foreach my $note (@notes) {
    print PSTEXT "$note\n";
  }
  close PSTEXT;
}

sub finish_up {
  # dummy end
  system( "psxy /dev/null -J$us_proj -R$us_region -Sp -O -V >> $out" ) and die;
}

sub convert_to_png {
  warn "Converting to PNG ... ";
  system( "convert -trim -density 100 $out $pngout" ) and die "Couldn't convert to PNG: $!";
  warn "Done\n";
}
