\cancel mode verify	
! ... now overlaying coastal outline ...

! Description: Plot outlines of continents, countries, and/or states

!		        arg 1	      arg 2	   arg 3        arg 4
! Usage:   GO mp_land [continent_pen] ["basemap"] [country_pen] [state_pen]

! pens 	may be "0"(background), "1"(foreground), "thick"(same as pen 7),
!	"black", "red", "green", "blue", or 2-18.
! arg 2 may be "basemap", "overlay", "fast" (fast, 20e:20e overlay) or omitted

!	Note 1: A pen color of "black" will actually pen number 1
!		-- normally white if the window background is black
!	Note 2: An "N" for the continent pen means no continents
!		-- use this for the special case of geo-political
!		   overlay without continents.

! Example:
!   GO mp_land red        	  - overlay continents using red pen (2)
!   GO mp_land  10           - overlay continents using pen number 10
!   GO mp_land 1 basemap     - basemap of continents outline in foreground color
!   GO mp_land 1 fast        - overlay continents in region 20e to 380, only
!   GO mp_land 1 " " red     - overlay continents with countries in red
!   GO mp_land thick basemap black black - continents, countries, and states
!   GO mp_land N " " 1 1     - overlay: no continents; yes political boundaries

! Notes:
!  1) If a pen value is given for the country_pen or state_pen then the
!	corresponding geopolitical boundaries will be drawn - else
!	they will be omitted
!  2) use  GO line_samples    to view the first 6 pen numbers
!       Higher pen numbers cycle with thicker lines (max 18)
!  3) For more control over basemaps use "GO basemap"
! 
! ACM 4/15 Fix ticket 2256: modulo replications for continents if argument 1 is not given

! test argument before performing any actions
query/ignore $1%1|black|red|green|blue|thick|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|N|<GO mp_land [pen or "N"] ["basemap"] [pen] [pen] with pen = 0(back), 1(fore), thick, 2-18 or a color%
query/ignore $2%default|basemap|overlay|fast|<argument 2 can be "basemap", "overlay", or "fast"%
query/ignore $3%1|black|red|green|blue|thick|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|N|<GO mp_land [pen or "N"] ["basemap"] [pen] [pen] with pen = 0(back), 1(fore), thick, 2-18 or a color%
query/ignore $4%1|black|red|green|blue|thick|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|N|<GO mp_land [pen or "N"] ["basemap"] [pen] [pen] with pen = 0(back), 1(fore), thick, 2-18 or a color%

! introduce the outline data set
set data/save
set grid/save

let/quiet mp_x = x
let/quiet mp_xmin = `mp_x[i=@min]`
let/quiet mp_xmax = `mp_x[i=@max]`
let/quiet mp_y = y
let/quiet mp_ymin = `mp_y[j=@min]`
let/quiet mp_ymax = `mp_y[j=@max]`
let/quiet mp_std_parallel_north = mp_ymax
let/quiet mp_std_parallel_south = mp_ymin

!
! This test will keep the central meridians defined by "from space" views
!
let/quiet mp_test = `mp_central_meridian` - `(mp_x[i=@max] + mp_x[i=@min])/2`
if `mp_test eq 0` then
   let/quiet mp_central_meridian = `(mp_x[i=@max] + mp_x[i=@min])/2`
endif
let/quiet mp_test = `mp_standard_parallel` - `(mp_y[j=@max] + mp_y[j=@min])/2`
if `mp_test eq 0` then
   let/quiet mp_standard_parallel = `(mp_y[j=@max] + mp_y[j=@min])/2`
endif
cancel variable mp_test


use geo_borders

! Initialize
let landi_subx = 0
let landi_addx = 0
let landi_datxmin = continent_lon[x=@min]
let landi_datxmax = continent_lon[x=@max]

let landi_basemap = $2"0|basemap>1|*>0"
IF `landi_basemap EQ 0` THEN

   IF `mp_xmin LT landi_datxmin` then let landi_subx = `landi_subx - 360`
   IF `mp_xmax GT landi_datxmax` then let landi_addx = `landi_addx + 360`

ENDIF
 

! always do the continents
set grid CONTINENT_LON
let/quiet mp_lambda = if (CONTINENT_LON ge mp_xmin and CONTINENT_LON le mp_xmax and CONTINENT_LAT ge mp_ymin and CONTINENT_LAT le mp_ymax) then (CONTINENT_LON * deg2rad)
let/quiet mp_phi = if (CONTINENT_LON ge mp_xmin and CONTINENT_LON le mp_xmax and CONTINENT_LAT ge mp_ymin and CONTINENT_LAT le mp_ymax) then (CONTINENT_LAT * deg2rad)
let/quiet masked_x_page = mp_mask * x_page
let/quiet masked_y_page = mp_mask * y_page
$1"plot|N>QUERY/IGNORE stuff |*>plot"/set/vs/nolab/noax/line=1/$2"i=1:22585/overlay|basemap>i=4886:13712|fast>i=4886:13712/overly|*>i=1:22585/overlay" masked_x_page, masked_y_page

! select line style and plot
ppl pen 1 $1"1|black>1|red>2|green>3|blue>4|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|N>1|"

! set up axis formatting in case it is a basemap  !!! incorrect for map projection plots!
! ppl xfor (I7,''LONE'')
! ppl yfor (I7,''LAT'')

! draw it - as an overlay or as a basemap
$1"ppl plot|N>QUERY/IGNORE stuff |*>ppl plot"$2"/overlay|basemap> |*>/overlay"


! Draw any lines outside 0 to 360

IF `landi_addx NE 0` THEN 
  set grid continent_lon
  let/quiet mp_lambda = if ((continent_lon+landi_addx) ge mp_xmin and (continent_lon+landi_addx) le mp_xmax and \
   continent_lat ge mp_ymin and continent_lat le mp_ymax) then ((continent_lon+landi_addx) * deg2rad)
  let/quiet mp_phi = if ((continent_lon+landi_addx) ge mp_xmin and (continent_lon+landi_addx) le mp_xmax and \
   continent_lat ge mp_ymin and continent_lat le mp_ymax) then (continent_lat * deg2rad)
  let/quiet masked_x_page = mp_mask * x_page
  let/quiet masked_y_page = mp_mask * y_page
  $1"plot|N>QUERY/IGNORE stuff |*>plot"/set/vs/nolab/noax/line=1/$2"i=1:200826/overlay|basemap>i=1:200826/overly|*>i=1:200826/overlay" masked_x_page, masked_y_page
  ppl pen 1 $1"1|black>1|red>2|green>3|blue>4|lightblue>5|purple>6|white>19|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|N>1|"
  $1"ppl plot|N>QUERY/IGNORE stuff |*>ppl plot"$2"/overlay|basemap> |*>/overlay"
ENDIF
IF `landi_subx NE 0` THEN 
  set grid continent_lon
  let/quiet mp_lambda = if ((continent_lon+landi_subx) ge mp_xmin and (continent_lon+landi_subx) le mp_xmax and \
   continent_lat ge mp_ymin and continent_lat le mp_ymax) then ((continent_lon+landi_subx) * deg2rad)
  let/quiet mp_phi = if ((continent_lon+landi_subx) ge mp_xmin and (continent_lon+landi_subx) le mp_xmax and \
   continent_lat ge mp_ymin and continent_lat le mp_ymax) then (continent_lat * deg2rad)
  let/quiet masked_x_page = mp_mask * x_page
  let/quiet masked_y_page = mp_mask * y_page
  $1"plot|N>QUERY/IGNORE stuff |*>plot"/set/vs/nolab/noax/line=1/$2"i=1:200826/overlay|basemap>i=1:200826/overly|*>i=1:200826/overlay" masked_x_page, masked_y_page
  ppl pen 1 $1"1|black>1|red>2|green>3|blue>4|lightblue>5|purple>6|white>19|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|N>1|"
  $1"ppl plot|N>QUERY/IGNORE stuff |*>ppl plot"$2"/overlay|basemap> |*>/overlay"
ENDIF

! **** now the optional country borders
set grid COUNTRY_LON
let/quiet mp_lambda = if (COUNTRY_LON ge mp_xmin and COUNTRY_LON le mp_xmax and COUNTRY_LAT ge mp_ymin and COUNTRY_LAT le mp_ymax) then (COUNTRY_LON * deg2rad)
let/quiet mp_phi = if (COUNTRY_LON ge mp_xmin and COUNTRY_LON le mp_xmax and COUNTRY_LAT ge mp_ymin and COUNTRY_LAT le mp_ymax) then (COUNTRY_LAT * deg2rad)
let/quiet masked_x_page = mp_mask * x_page
let/quiet masked_y_page = mp_mask * y_page
$3"query/ignore|*>plot/set/vs/nolab/line=1/x=1:91083/overlay" masked_x_page, masked_y_page

! select line style and plot
ppl pen 1 $3"1|black>1|red>2|green>3|blue>4|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|"

! draw it - as an overlay or as a basemap
$3"query/ignore|*>ppl plot/overlay"

! Draw any lines outside 0 to 360
IF ($3"0|*>1") THEN

IF `landi_addx NE 0` THEN 
  set grid COUNTRY_LON
  let/quiet mp_lambda = if ((country_lon+landi_addx) ge mp_xmin and (country_lon+landi_addx) le mp_xmax and \
   country_lat ge mp_ymin and country_lat le mp_ymax) then ((country_lon+landi_addx) * deg2rad)
  let/quiet mp_phi = if ((country_lon+landi_addx) ge mp_xmin and (country_lon+landi_addx) le mp_xmax and \
   country_lat ge mp_ymin and country_lat le mp_ymax) then (country_lat * deg2rad)
  let/quiet masked_x_page = mp_mask * x_page
  let/quiet masked_y_page = mp_mask * y_page
  $3"plot|N>QUERY/IGNORE stuff |*>plot"/set/vs/nolab/noax/line=1/$2"i=1:200826/overlay|basemap>i=1:200826/overly|*>i=1:200826/overlay" masked_x_page, masked_y_page
  ppl pen 1 $3"1|black>1|red>2|green>3|blue>4|lightblue>5|purple>6|white>19|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|N>1|"
  $3"ppl plot|N>QUERY/IGNORE stuff |*>ppl plot"$2"/overlay|basemap> |*>/overlay"
ENDIF
IF `landi_subx NE 0` THEN 
  set grid COUNTRY_LON
  let/quiet mp_lambda = if ((country_lon+landi_subx) ge mp_xmin and (country_lon+landi_subx) le mp_xmax and \
   country_lat ge mp_ymin and country_lat le mp_ymax) then ((country_lon+landi_subx) * deg2rad)
  let/quiet mp_phi = if ((country_lon+landi_subx) ge mp_xmin and (country_lon+landi_subx) le mp_xmax and \
   country_lat ge mp_ymin and country_lat le mp_ymax) then (country_lat * deg2rad)
  let/quiet masked_x_page = mp_mask * x_page
  let/quiet masked_y_page = mp_mask * y_page
  $3"plot|N>QUERY/IGNORE stuff |*>plot"/set/vs/nolab/noax/line=1/$2"i=1:200826/overlay|basemap>i=1:200826/overly|*>i=1:200826/overlay" masked_x_page, masked_y_page
  ppl pen 1 $3"1|black>1|red>2|green>3|blue>4|lightblue>5|purple>6|white>19|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|N>1|"
  $3"ppl plot|N>QUERY/IGNORE stuff |*>ppl plot"$2"/overlay|basemap> |*>/overlay"
ENDIF

ENDIF  ! lines outside 0 to 360

! **** now the optional state borders
set grid STATE_LON
let/quiet mp_lambda = if (STATE_LON ge mp_xmin and STATE_LON le mp_xmax and STATE_LAT ge mp_ymin and STATE_LAT le mp_ymax) then (STATE_LON * deg2rad)
let/quiet mp_phi = if (STATE_LON ge mp_xmin and STATE_LON le mp_xmax and STATE_LAT ge mp_ymin and STATE_LAT le mp_ymax) then (STATE_LAT * deg2rad)
let/quiet masked_x_page = mp_mask * x_page
let/quiet masked_y_page = mp_mask * y_page
$4"query/ignore|*>plot/set/vs/nolab/line=1/x=1:7034/overlay" masked_x_page, masked_y_page

! select line style and plot
ppl pen 1 $4"1|black>1|red>2|green>3|blue>4|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|"

! draw it - as an overlay or as a basemap
$4"query/ignore|*>ppl plot/overlay"


! Draw any lines outside 0 to 360
IF ($4"0|*>1") THEN

IF `landi_addx NE 0` THEN 
  set grid state_LON
  let/quiet mp_lambda = if ((state_lon+landi_addx) ge mp_xmin and (state_lon+landi_addx) le mp_xmax and \
   state_lat ge mp_ymin and state_lat le mp_ymax) then ((state_lon+landi_addx) * deg2rad)
  let/quiet mp_phi = if ((state_lon+landi_addx) ge mp_xmin and (state_lon+landi_addx) le mp_xmax and \
   state_lat ge mp_ymin and state_lat le mp_ymax) then (state_lat * deg2rad)
  let/quiet masked_x_page = mp_mask * x_page
  let/quiet masked_y_page = mp_mask * y_page
  $4"plot|N>QUERY/IGNORE stuff |*>plot"/set/vs/nolab/noax/line=1/$2"i=1:200826/overlay|basemap>i=1:200826/overly|*>i=1:200826/overlay" masked_x_page, masked_y_page
  ppl pen 1 $4"1|black>1|red>2|green>3|blue>4|lightblue>5|purple>6|white>19|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|N>1|"
  $4"ppl plot|N>QUERY/IGNORE stuff |*>ppl plot"$2"/overlay|basemap> |*>/overlay"
ENDIF
IF `landi_subx NE 0` THEN 
  set grid state_LON
  let/quiet mp_lambda = if ((state_lon+landi_subx) ge mp_xmin and (state_lon+landi_subx) le mp_xmax and \
   state_lat ge mp_ymin and state_lat le mp_ymax) then ((state_lon+landi_subx) * deg2rad)
  let/quiet mp_phi = if ((state_lon+landi_subx) ge mp_xmin and (state_lon+landi_subx) le mp_xmax and \
   state_lat ge mp_ymin and state_lat le mp_ymax) then (state_lat * deg2rad)
  let/quiet masked_x_page = mp_mask * x_page
  let/quiet masked_y_page = mp_mask * y_page
  $4"plot|N>QUERY/IGNORE stuff |*>plot"/set/vs/nolab/noax/line=1/$2"i=1:200826/overlay|basemap>i=1:200826/overly|*>i=1:200826/overlay" masked_x_page, masked_y_page
  ppl pen 1 $4"1|black>1|red>2|green>3|blue>4|lightblue>5|purple>6|white>19|thick>7|0>0|1>1|2>2|3>3|4>4|5>5|6>6|7>7|8>8|9>9|10>10|11>11|12>12|13>13|14>14|15>15|16>16|17>17|18>18|N>1|"
  $4"ppl plot|N>QUERY/IGNORE stuff |*>ppl plot"$2"/overlay|basemap> |*>/overlay"
ENDIF

ENDIF  ! lines outside 0 to 360

cancel data geo_borders

set grid/restore
set data/restore
let/quiet mp_x = x
let/quiet mp_y = y
let/quiet mp_test = `mp_central_meridian` - `(mp_x[i=@max] + mp_x[i=@min])/2`
if `mp_test eq 0` then
   let/quiet mp_central_meridian = (mp_x[i=@max] + mp_x[i=@min])/2
endif
let/quiet mp_test = `mp_standard_parallel` - `(mp_y[j=@max] + mp_y[j=@min])/2`
if `mp_test eq 0` then
   let/quiet mp_standard_parallel = (mp_y[j=@max] + mp_y[j=@min])/2
endif
cancel variable mp_test
let/quiet mp_std_parallel_north = mp_y[j=@max]
let/quiet mp_std_parallel_south = mp_y[j=@min]
let/quiet mp_lambda = mp_x * deg2rad
let/quiet mp_phi = mp_y * deg2rad

set mode/last verify
