To support the ICBEMP effort the Bureau of Land Management Oregon State Office was given the task of developing a high quality general location map for the project. To answer this fundamental requirement, the ICBEMP terrain map was created. Since then, the map has not only fulfilled its original mission but it appears to have taken on "a life of its own" well beyond the bounds of the ICBEMP project. A reduction of the orignal map has been produced in digital form and shown below:
The primary audience for the ICBEMP map was the ICBEMP project team composed of some of the northwest's leading ecological scientists, land use planners and land managers. This map provided an excellent locational frame of reference for the many thematic overlays which the ICBEMP project team used to formulate options and alternatives. With the rich content of detailed information on the ICBEMP map, team members could easily determine how different actions would impact existing activities on the landscape.
Beyond reference and analytical uses by the ICBEMP project team, the map was intended as a communication tool with the public at large. The ICBEMP needed to be able to convey effectively how the plan would benefit different areas of the Columbia Basin. The ICBEMP terrain map proved to be an effective tool for facilitating that dialog.
The analytical and GIS activities for the ICBEMP project took place at many Forest Service and BLM offices in Portland, Boise, Missoula, and Walla Walla, so extra efforts were taken for the project to effectively manage data and processes to avoid duplication and maintain continuity. This allowed the work to be accomplished simultaneously at many locations. The building of the ICBEMP terrain map database and AML programming were integrated with these ongoing GIS activities, so that the ICBEMP team in different locations had access to the map in digital form.
The ICBEMP location map served as a basemap upon which numerous overlays were developed and displayed in public meetings. This was the key to the creation of published maps for the project and to further integrate the ICBEMP terrain map into the ongoing GIS work of the project. As each of the different analysis teams complete their work, new thematic data were developed and refined into a publishable form for the Environmental Impact Statement (EIS) documents, public display and other uses. This allowed cartographic products to be produced and used throughout the entire process, rather than just in the publication process.
A good deal of thought went into planning the conceptual makeup of the map. Several weeks were spent analyzing other beautiful location maps. These maps included products published in the yearly Esri Map Book, National Geographic Maps, maps in a number of atlases, and maps created by the BLM and Forest Service. Lengthy discussions were held to discuss the positive and negative features of these maps and to determine what features were appropriate for the ICBEMP terrain map. The process of interpreting user needs against program capabilities and limitations, existing standards, project continuty concerns and professional practices is complex and often happens inside the mind of the mapmaker. These discussions led to the singular conceptual vision of the ICBEMP terrain map and list of features it should have. This list is discussed below:
In the world of computers and geographic information systems (GIS), creation tinted or "painted" relief is not as direct a process as it once was. In the past, relief maps were created by cartographers used artistic implements such as pen and pad, water colors, etching tools, or air brush and ink to directly apply terrain information to the page. Todays map makers must create "painted relief" by manipulating digital data with computer programs which in turn command mechanical devices to paint the screen or paper. Fortunately, ArcInfo provides an abundance of software tools which can be used for this purpose. There are ample digital elevation data available so that "painted relief" could be created for nearly anywhere on Earth.
P = A * I
where
P is the shaded color
value
A is the color
I is the landscape
illumination value
/* file name: elev.lut
/*
elevation range :reclass value
-10000 0000 : 1
0000 0250 :
2
0250 0500 : 3
0500 1000 : 4
1000 1500 : 5
1500
2000 : 6
2000 2500 : 7
2500 3000 : 8
3000 3500 :
9
3500 4000 : 10
4000 4500 : 11
4500 5000 : 12
5000 5500 : 13
5500 6000 : 14
6000 6500 : 15
6500
7000 : 16
7000 7500 : 17
7500 8000 : 18
8000 8500 :
19
8500 9000 : 20
9000 9500 : 21
9500 10000 : 22
10000 20000 : 23
To assign color to the newly classified data set another lookup table is used to relate the reclass value shown above to the RGB value for the desired color. These values are stored in a file called color.lut. That file is shown below:
/* file name: color.lut
/* reclass value red green blue
1
8 129 242
2 113 153
89
3 117 170 101
4 149
190 113
5 178 214 117
6
202 226 149
7 222 238 161
8
242 238 161
9 238 222 153
10
242 206 133
11 234 182 129
12 218 157 121
13 194 141
125
14 214 157 145
15 226
174 165
16 222 186 182
17
238 198 210
18 255 206 226
19
250 218 234
20 255 222 230
21
255 230 242
22 255 242 255
23 255 255 255
Colors are assigned to each reclass value at the time the dataset is
plotted or used in analysis.
The product of the HILLSHADE function is a new data set with values ranging from 0 to 255. These values utilize an 8-bit gray scale and needed to be converted to "percent illumination" for use bythe "Color behavior Formula" mentioned above. This conversion is performed by dividing values the HILLSHADE dataset by 255. This creates a new dataset where values range from 0 to 1. These values can be thought of in "percent illuminated" terms. Fully illuminated terrain has pixel values of one or 100 percent, half illuminated pixels have a value of .5 or 50 percent illuminated and totally dark areas have a value of zero or zero percent illuminated. Thinking in terms of percent illuminated, is a more natural way of thinking about illumination in relation to color value.
The above process has been captured in an AML program shown below:
/* relief.aml
All other data, except for the project boundary, was derived from the
Digital Chart of the World. However, it required extensive update and
editing to make the data reflect current geography. All transportation
lines were edited to reflect the current and true route and highway
type according to several popular sources, including the AAA atlas. All
rivers were recoded to reflect two codes. Code one indicated a major
drainage and received a heavier blue line than Code two which received
a thin blue line. Although important cities were included, their
status and location had to be verified and edited. The position of the
text labels also had to be edited to avoid overwrites and other
conflicts. Yet the use of these data sets save a great deal of time
over generating the data from scratch.
jnighber@or.blm.gov
elev.lut
/* by
/* jeffery s. nighbert
/* bureau of
land management
/* 1515sw 5th ave
/* portland oregon 97208
/* phone 503-952-6399
/* email: jnighber@or.blm.gov
/*
/*
aml creates "painted relief"
/*
/* assumptions:
/* you're
in grid and your window and mapextent are set
/*
/* needs two
lookup tables
/* elev.lut - classifies elevation every 500 feet -
class 1 is water
/* color.lut - green to brown to white color ramp
23 categories - 1 is
/*
/* to run:
/* &r relief
/*
/* arg definitions
/* elev_map -- an
elevation map with Z values in meters
/*
&echo &on
&args
elev_map
/* kill off some maps
kill red
kill green
kill
blue
kill slice
kill hill
kill illum
/*The assignment
of color to elevation values
/* reclassify elevation using
elev.lut
slice = reclass(%elev_map% * 3.28089,elev.lut)
/* create a hillshade map then divide by 255
hill =
hillshade(%elev_map%,345,65,#,3.28089)
illum = float(hill) /
255
/* use color2(X) commands at the same time use other
functions
/* int reduces the size of final grids
/*
con(isnull(),255 takes care of nulls in the map and assigns them
red = int(con(isnull(color2red(slice,color.lut,nowrap) ~
*
illum),255,(color2red(slice,color.lut,nowrap) ~
* illum)))
green = int(con(isnull(color2green(slice,color.lut,nowrap) ~
*
illum),255,(color2green(slice,color.lut,nowrap) ~
* illum)))
blue = int(con(isnull(color2blue(slice,color.lut,nowrap) ~
*
illum),255,(color2blue(slice,color.lut,nowrap) ~
* illum)))
/* use "gridcomposite rgb red green blue" to display the
results
gridcomposite rgb red green blue
&return
WHAT WERE THE DATA SOURCES FOR THE MAP?
The ICBEMP terrain map was derived entirely from two data sources. The
shaded relief backdrop is based on a digital elevation data created was
by merging 177 separate 3 arc second digital terrain files available
from United State Geological Survey. The elevation data was resampled
to 250 meter resolution before the "painted relief" processing
occurred.
ARE THE AML PROGRAMS USED TO CREATE THIS MAP AVAILABLE
TO THE PUBLIC?
All of the AML programs used to create the ICBEMP map are available to
the public. Some of the have been enclosed in the Appendices.
Questions or copies of other related AML programs may be obtained by
email to:
CONCLUSIONS
The notariety and success of the ICBEMP terrain map can be attributed
to the careful adherance to user requirements, traditional design, a
painted relief backdrop and extensive text entries. This map will
serve as a model for future mapmakers and an reminder that professional
mapmaking can be done with computers as long as the basic principles of
cartography are followed.
ACKNOWLEGEMENTS:
Mike Moscoe for help in editing this presentation.
APPEDIX 1
/* relief.aml
/* by
/*
jeffery s. nighbert
/* bureau of land management
/* 1515sw 5th
ave
/* portland oregon 97208
/* phone 503-952-6399
/*
/* aml creates "painted relief"
/*
/* assumptions:
/*
you're in grid and your window and mapextent are set
/*
/*
needs two lookup tables
/* elev.lut - classifies elevation every
500 feet - class 1 is water
/* color.lut - green to brown to white
color ramp 23 categories - 1 is
/* very blue
/*
/* to
run:
/* &r relief
/*
/* arg definitions
/*
elev_map -- an elevation map with Z values in meters
/*
&echo
&on
&args elev_map
kill red
kill green
kill blue
kill slice
kill hill
kill illum
slice = reclass(%elev_map%
* 3.28089,elev.lut)
/* you may wish to adjust the altitude and
ve on this one
hill = hillshade(%elev_map%,345,45,#,1.2)
illum
= float(hill) / 255
red =
int(con(isnull(color2red(slice,color.lut,nowrap) * ~
illum),255,(color2red(slice,color.lut,nowrap) ~
* illum)))
green = int(con(isnull(color2green(slice,color.lut,nowrap) * ~
illum),255,(color2green(slice,color.lut,nowrap) ~
* illum)))
blue = int(con(isnull(color2blue(slice,color.lut,nowrap) * ~
illum),255,(color2blue(slice,color.lut,nowrap) ~
* illum)))
/* use "gridcomposite rgb red green blue" to display the
results
&return
-10000 0000 : 1
0000 0250 : 2
0250 0500 : 3
0500 1000 : 4
1000 1500 : 5
1500 2000 : 6
2000 2500 :
7
2500 3000 : 8
3000 3500 : 9
3500 4000 : 10
4000
4500 : 11
4500 5000 : 12
5000 5500 : 13
5500 6000 :
14
6000 6500 : 15
6500 7000 : 16
7000 7500 : 17
7500
8000 : 18
8000 8500 : 19
8500 9000 : 20
9000 9500 :
21
9500 10000 : 22
10000 20000 : 23
color.lut
1 8 129 242
2 113 153 89
3 117 170 101
4 149
190 113
5 178 214 117
6 202 226 149
7 222 238 161
8 242
238 161
9 238 222 153
10 242 206 133
11 234 182 129
12
218 157 121
13 194 141 125
14 214 157 145
15 226 174
165
16 222 186 182
17 238 198 210
18 255 206 226
19 250
218 234
20 255 222 230
21 255 230 242
22 255 242 255
23
255 255 255
APPENDIX 2
/* by jeffery s. nighbert
/* united states dept of
interior
/* bureau of land management
/* 1515 sw 5th ave
/*
portland, oregon 97201
/* phone 503-952-6399
/* fax
503-952-6419
/* main aml program for interior columbia basin
terrain map
/* executed from the arc prompt with map output scale
as an arg
&args scale
&echo &on
&watch terrain.watch
&amlpath /nfs/pdtk/arc/aml
ap
display 1040
eemp_terrain
pageunits inches
pagesize 60 36
mapprojection off
weeddraw off
/* check mape based on actual
min/max of cover or grid
&s cover := ../raster/hill_250
&describe %cover%
&if [exists %cover% -grid ] &then
&do
&s xmin := %grd$xmin%
&s ymin := %grd$ymin%
&s xmax := %grd$xmax%
&s ymax := %grd$ymax%
&end
&else
&if [exists %cover% -cover ] &then
&do
&s xmin := %dsc$xmin%
&s ymin := %dsc$ymin%
&s xmax := %dsc$xmax%
&s ymax := %dsc$ymax%
&end
&else
&return &warning Cover or Grid does not
exist...
mape %xmin% %ymin% %xmax% %ymax%
mapunits meters
&s scale := %scale%
mapscale %scale%
maplimits [show convert map %xmin% %ymin% page ],~
[show convert
map %xmax% %ymax% page ]
/* painted relief
gridcomposite rgb ../raster/red_250 ../raster/green_250
../raster/blue_250
/* contours if you want them or planimetric
map
/* lineset blmoso1.lin
/* linesymbol 101
/* linecolor
goldenrod
/* reselect contours line hylnval = 1000 or hylnval =
3000 or hylnval =
/* 5000 or hylnval = 7000 or hylnval = 9000 or
hylnval = 11000 or hylnval
/* = 13000
/*
/* arcs
contours
/*
/*
/* water features
/*
shadeset
colornames.shd
lineset blmoso1.lin
/* the ocean - used if
planimetric map
/* reselect ocean polys popytype = 2
/*
polygonshade ocean 52
/*
/* lakes
shadeset
colornames.shd
shadecolor rgb 8 129 242
shadeput 45
/*
/* perennial lakes or open water
reselect lakes poly dnpytype eq
1
polygonshade lakes 45
clearselect
/*
/* dry lakes
reselect lakes poly dnpytype eq 2
polygonshade lakes 47
clearselect
/*
/* legend for lakes and water
shadeset
colornames.shd
textset font.txt
/*
/* legend dry lake
/*
shadesymbol 47
patch 8 1.0 8.3 1.1
lineset
blmoso1.lin
linesymbol 1
box 8 1.0 8.3 1.1
move 8.4 1.0
textsymbol 24
textsize .1
textquality kern
text 'Dry Lake'
ll
/*
/* legend oepn water
/*
shadecolor rgb 8 129
242
shadeput 45
patch 8 .8 8.3 .9
box 8 .8 8.3 .9
move
8.4 .8
textsymbol 24
textsize .1
textquality kern
text
'Open Water' ll
/*
/* Urban Area
/*
reselect
eemp_pppoly poly area gt 7500000
polygonshade eemp_pppoly 84
linecolor firebrick
textsymbol 24
linesymbol 101
linecolor
firebrick
polys eemp_pppoly
shadesymbol 84
patch 11.5 .8
11.8 .9
box 11.5 .8 11.8 .9
move 11.9 .8
textsize .1
text 'Urban Area' ll
/*
/* streams
/*
lineset
blmoso1.lin
textset font.txt
textsymbol 24
textsize .1
textquality kern
linesymbol 5
linecolor rgb 0 102 255
clearselect
reselect eemp_str line dnlntype lt 3
reselect
eemp_str line linetype = 1
linesize .015
arcs eemp_str
clearselect
line 8 1.2 8.3 1.2
move 8.4 1.2
text 'Major
River' ll
clearselect
/*
/* dry lakes
/*
reselect
eemp_str line dnlntype lt 3
reselect eemp_str line linetype = 2 or
linetype = 0
linesymbol 5
linecolor rgb 0 102 255
arcs
eemp_str
clearselect
line 8 1.4 8.3 1.4
move 8.4 1.4
text 'River' ll
/*
/* reselect oceans
/*
/*
/*
polys ocean
/*
/*
/* clearselect
/*
/*
/*
water feature labels
/*
textset font.txt
annotext eemp_str
all
/*
/* Interior Columbia Basin Project Area
/*
lineset carto.lin
linesymbol 104
polys crba
clearselect
line 9.5 .825 9.8 .825
textset font.txt
textsymbol 24
textsize .1
textquality kern
move 9.9 .8
text 'Assessment Boundary' ll
/*
/* administrative
features
/*
lineset carto.lin
textset font.txt
arclines cnty lsym
annotext cnty c_name
/*
/* state
names
/*
annotext eemp_ponet state
/*
/* legend for
lines
/*
linesymbol 133
line 9.5 1.4 9.8 1.4
move 9.9
1.4
text 'County Line' ll
linesymbol 122
line 9.5 1.2 9.8
1.2
move 9.9 1.2
text 'State Line' ll
linesymbol 143
line 9.5 1 9.6 1
line 9.65 1 9.7 1
line 9.75 1 9.8 1
move
9.9 1
text 'International Boundary' ll
/*
/*
transportation
/*
weeddraw off
lineset blmoso1.lin
textsymbol 24
textsize .1
textquality kern
/*
/* 5
other road - solid red tiny
/*
reselect eemp_rdline arcs
linetype = 5
linesym 2
linetype wide
linesize .006
/*
/* linehollow .02
/*
linepen .005 butt miter
arcs
eemp_rdline
line 6 1.4 6.3 1.4
move 6.4 1.4
text 'Major
Road' ll
clearsel
/*
/* 4 - Principal Through Highways -
clear red
/*
reselect eemp_rdline arcs linetype = 4
linesym 1
linetype wide
linesize .02
linehollow .02
linepen .005 butt miter
linecolor red
arcs eemp_rdline
line
6 1.2 6.3 1.2
move 6.4 1.2
text 'Principle Through Highway'
ll
clearsel
/*
/* 3 - Other Divided Highways - solid
black
/*
reselect eemp_rdline arcs linetype = 3
linesymbol
102
linetype wide
arcs eemp_rdline
line 6 1.0 6.3 1.0
move 6.4 1.0
text 'Divided Highway' ll
clearsel
/*
/*
2 - Other Divided Highways - solid red
/*
reselect eemp_rdline
arcs linetype = 2
linesymbol 102
linetype wide
linecolor
red
linesize .03
arcs eemp_rdline
clearsel
/*
/* 1
- Controlled Access Highways - fat red
/*
reselect eemp_rdline
arcs linetype = 1
linesymbol 302
linesize .03
line 6 .825
6.3 .825
arcs eemp_rdline
linesym 1
linetype wide
linesize .035
linehollow .035
linepen .003 butt miter
arcs
eemp_rdline
line 6 .825 6.3 .825
move 6.4 .8
text
'Controlled Access Highway' ll
lineset blmoso1.lin
linesymbol
1
arcs eemp_rdline
line 6 .825 6.3 .825
/*
/* highway
symbols
/*
markerset blmoso1.mrk
markersym 1
markersize .1
reselect roadsym points symtype = '1'
/*
/*
points roadsym
/*
textset font.txt
textsym 1
textsize
.08
textcolor white
/*
/* pointtext roadsym hwy # cc
/*
&r markerangle
clearsel
markerset blmoso1.mrk
markersym 2
markersize .1
reselect roadsym points symtype = '2'
and hwy lt 100
/*
/* points roadsym
/*
textset
font.txt
textsym 1
textsize .08
textcolor black
/*
/* pointtext roadsym hwy # cc
/*
&r markerangle
clearsel
reselect roadsym points symtype = '2' and hwy gt 100
/*
/* points roadsym
/*
textset font.txt
textsym
1
textsize .08 .05
textcolor black
/*
/* pointtext
roadsym hwy # cc
/*
&r markerangle
clearsel
markerset
blmoso1.mrk
markersym 3
markersize .08
reselect roadsym
points symtype = '3' and hwy lt 100
/*
/* points roadsym
/*
textset font.txt
textsym 1
textsize .08
textcolor
black
/*
/* pointtext roadsym hwy # cc
/*
&r
markerangle
clearsel
reselect roadsym points symtype = '3' and
hwy gt 100
/*
/* points roadsym
/*
textset
font.txt
textsym 1
textsize .08 .05
textcolor black
/*
/* pointtext roadsym hwy # cc
/*
&r markerangle
clearselect
/*
/* populated places points and text
/*
textset font.txt
textangle 0
units page
textsymbol 24
textoffset 0 0
markerset water.mrk
markersymbol 109
linesymbol 1
markersize .05
linesymbol 1
pensize .001
clearselect
points cities
annotext cities cities
lineset
carto.lin
linesymbol 101
textsize .1
/*
/* collar
info
/*
&s thinx := [calc 1.4 + [extract 1 ~
[show
convert map %xmax% %ymax% page ]
&s thiny := [calc 1.4 + [extract
2 ~
[show convert map %xmax% %ymax% page ]
&s thickx := [calc
1.5 + [extract 1 ~
[show convert map %xmax% %ymax% page ]
&s
thicky := [calc 1.5 + [extract 2 ~
[show convert map %xmax% %ymax%
page ]
box .6 .6 %thinx% %thiny%
linesymbol 104
box .5 .5
%thickx% %thicky%
linesymbol 101
&s xmid := [calc [ calc
%thickx% / 2 ] + .25 ]
&s ymid := [calc [ calc %thicky% / 2 ] +
.25 ]
&s titley := [calc %thicky% - .75 ]
/*
/* inset
map
/*
&s xinsetmin := [calc %thickx% - 2.1 ]
&s yinsetmin
:= .8
&s xinsetmax := [calc %thickx% - .5 ]
&s yinsetmax :=
1.8
plot /usr4/eemp/inset/crba_inset box %xinsetmin% .7 %xinsetmax%
2
/*
/* projection information
/*
move %xmid% .82
textsymbol 24
textsize .12
text 'Albers Equal Area Projection
centered on 117 Degrees West' lc
move %xmid% .7
text 'Standard
Parallels: 43 and 48 Degrees North, Origin: 41 Degrees
North, NAD
1927' lc
/*
/* originator
/*
textsize .08
move .5
.4
text 'February, 1995 - BLM - OR955.2 - JSNIGHBERT' ll
move
%xmid% .3
textsize .12
textcolor red
text 'D R A F T'
lc
move %xmid% %titley%
textset font.txt
textsymbol 23
textsize .75
textspacing 2
textangle 0
text 'Interior
Columbia Basin Ecosystem Management Project' cc
textspacing 1
textsymbol 24
textquality kern
/*
/* barscale aml program
by dave mandel
/*
&r mk2barscale2 %xmid% 1.25 %scale% 5
miles/km
plot eemp_logo1.gra box .7 .7 2 2
/*
/* agency
citation
/*
textset font.txt
textsymbol 23
textsize
.14
textquality kern
move 2.0 1.65
text 'Interior Columbia
Basin' ll
move 2.0 1.5
text 'Ecosystem Management Project'
ll
textsymbol 24
textsize .12
move 2.0 1.35
text '112
East Poplar Street' ll
move 2.0 1.23
text 'Walla Walla, WA
99362' ll
move 2.0 1.10
text 'PH: (509)522-4030 FAX:
(509)522-4025' ll
move 2.0 .95
/*
/* disclaimer
textfile
/*
textsymbol 23
textsize .08
textfile
disclaimer
/*
/* statement of scale
/*
move %xmid%
1.8
textsymbol 24
textsize .12
text 1:%scale% uc
linesymbol 1
textsize .1
/*
/* latlong grid program by
dave mandel
/*
&r mkgeogrid1 1 mapextent mkgeogrid1.prj 1 0 1
0 -1 +1 1 0 1 0 -3 +3
&echo &on
/*
/* north arrow program
by jsnighbert
/*
units page
shadeset colornames.shd
markerset north.mrk
markersymbol 12
markersize .5
markercolor black
p&r northangle -125 41
mapprojection off
units page
/*
/* neatline
/*
box [ show convert map
%xmin% %ymin% page],~
[ show convert map %xmax% %ymax% page
]
box .01 .01 .015 .015
/* done with plotting - on to
postscript and alchemy
quit
rm
/usr6/tmp/eemp_terrain.eps
rm /usr6/tmp/eemp_terrain.rtl
postscript eemp_terrain.gra /usr6/tmp/eemp_terrain.eps 1
normal.prm
alchemy /usr6/tmp/eemp_terrain.eps --r -Zm2 -Ze1
-Zr90 -ds3
/usr6/tmp/eemp_terrain.rtl
lp -d hpplot
/usr6/tmp/eemp_terrain.rtl
&watch &off
&RETURN
APPENDIX 3
/* textangle.aml
/* by
/* jeffery s. nighbert
/* bureau of
land management
/* 1515 sw 5th ave
/* portland, oregon
97208
/* phone 503-952-6399
/*
/* this aml will rotate text
to the angle of latitude
/*
/* assumes running from
arcplot
/*
/* needs two projection parameter files
/*
current_projection to geographic (sample file: eemp_geo.prj)
/*
geographic to current_projection (sample file: geo_eemp.prj)
/*
/* to run:
/* textangle