-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpr_02_layers.qmd
292 lines (225 loc) · 16 KB
/
pr_02_layers.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
---
editor: source
editor_options:
chunk_output_type: console
---
```{r}
library(dplyr)
library(tibble)
library(ggplot2)
library(gt)
library(gtExtras)
```
# Defining soil horizons {#sec-hor}
A soil horizon is a distinct layer observable within a soil profile. [Horizons are distinguished by differences in texture, stoniness, structure, colour, consistence or other soil properties as described in]{.milne} the following sections. [Delineated horizons should ideally represent depth intervals over which important soil attributes change minimally. Conversely, the horizon boundaries should represent depth intervals over which there is a relatively high rate of change of important soil properties.]{.milne}
[Not all important soil properties change from one horizon to the next or at the same rate with depth. In some instances confident interpretation of the suitability of a soil for a particular end use may depend on the rate of change of a single property at a horizon boundary. For this reason the basis for separating the horizon may need to be explicitly stated, not just the traditional generalised estimate of the amount of overall change.]{.milne}
::: {#nte-chor .callout-note appearance="minimal" collapse="true" title="Complex horizons"}
Some horizons have an internally complex structure that nonetheless clearly represents a distinct zone within the soil profile. Examples of such may include:
- Partially weathered layers comprising a mix of soil, saprolite and rock materials
- Layers comprising a complex depositional environment, e.g.
- A sequence of very thin deposits, sometimes in a repeating pattern of texture contrasts (lamellae or lamina)
- Volcanic ash products of contrasting texture, weathered in place (soft blocks or bombs in a finer ash matrix)
- Layers that have been partially mixed together by tectonic, biotic, climatic, or anthropic forces.
These layers may require some additional parameters or notes to adequately describe but do not need to be split excessively.
:::
## Defining the soil surface {#sec-pr-ssurf}
The soil surface has a slightly more restrictive definition than the land surface. The soil surface begins below the layer of fresh leaf litter or small living plants, and at the top of organic soil materials such as decomposing litter or peat. The mineral soil surface is further restricted, being the top of the first horizon dominated by mineral soil material. Horizon depths are defined only with reference to the soil surface - scrape back fresh litter and/or small plants and measure from there.
[draw this]{.diags}
## Recording depths {#sec-pr-depths}
Horizon depths are recorded starting from the soil surface at 0 cm and working downwards.
When examining single small cores or auger points (see @tbl-pr-gear, type [A]{.ceg}, [C1]{.ceg} and perhaps [C2]{.ceg}), record the observable upper and lower depth of each horizon from the soil surface in whole centimetres (e.g. [28-38 cm]{.ceg}).
Where a wider exposure (see @tbl-pr-gear, type [E]{.ceg}, [P1]{.ceg}, [P2]{.ceg}) or multiple undisturbed cores are available and greater detail is desired, one may choose to record upper and lower depths as a median and range, again in whole centimetres (e.g. [28 cm (27-29), 38 cm (37-40)]{.ceg}). At least 5 measurements should contribute to such an assessment.
Measure boundaries to and from the midpoint of each horizon transition zone (see @sec-pr-bdydist).
::: {#imp-stp .callout-important collapse="true" appearance="simple" title="Defining horizons on steep slopes"}
On steeper slopes, measuring horizons from vertical exposures can exaggerate horizon thicknesses, as the soil horizons mantle the landscape perpendicular to the sloping surface [@prietzel2019]. This starts to matter at slopes \> 25°, and progressively becomes more important - especially when calculating volumetric stocks of soil components. @fig-hr-slpex shows how a vertical 30-cm depth represents a progressively shallower 'true depth' as slope increases.
To adjust vertically measured horizon depths to correct for slope, apply the formula $depth * cos(slope)$. Supply depth in cm and slope in radians. Slopes measured in degrees can be converted to radians using the formula $(slope * pi) / 180$.
```{r}
#| label: fig-hr-slpex
#| fig-cap: "Depth exaggeration by slope."
deg2rad <- function(deg) {(deg * pi) / (180)}
slp_dat <- data.frame('Slope' = seq(0, 50, 1),
'Thickness' = 30 * cos(deg2rad(seq(0, 50, 1)))) |>
mutate('Ratio' = Thickness/30)
ggplot(slp_dat) +
geom_line(aes(y = Thickness, x = Slope),
linewidth = 1, colour = 'grey40') +
labs(x= 'Slope (°)', y = 'Horizon thickness (cm)') +
theme_minimal()
```
:::
## Thickness {#sec-pr-thick}
Where depths are correctly measured, thickness should be calculated after fieldwork.
## Boundary shape {#sec-pr-bdyshp}
Horizon boundary shape can only be observed on wider exposures (see @tbl-pr-gear, type [E]{.ceg}, [P1]{.ceg}, [P2]{.ceg}). Record against the following schema:
```{r}
#| label: tbl-hr-bshp
#| tbl-cap: "Horizon boundary shape"
dat_hr_bshp <-
tribble(~Code, ~Name, ~Description,
'S', 'Smooth', 'the boundary surface is a plane with few or no irregularities and usually occurs at the same depth across the profile face',
'W', 'Wavy', 'the boundary surface has broad, shallow, relatively regular pockets and none deeper than they are wide',
'I', 'Irregular', 'the boundary surface has pockets which are deeper than they are wide but not recurved',
'C', 'Convolute', 'the boundary surface has pockets which are deeper than they are wide and, in parts, recurved',
'D', 'Discontinuous', 'the boundary is discontinuous, usually due to external disturbance')
tbl_hr_bshp <- gt(dat_hr_bshp) |>
tab_options(
column_labels.font.weight = 'bold',
heading.title.font.weight = 'bold',
table.align = 'center',
table.width = '85%'
) |>
tab_style(style = list(cell_text(color = 'red',
weight = 'bold',
align = 'center')),
locations = cells_body(columns = 1)) |>
cols_width(Code ~pct(10), Name ~pct(20))
tbl_hr_bshp
```
## Boundary distinctness {#sec-pr-bdydist}
Horizon boundaries comprise state changes over short distances. These should be reported as a direct measurement in the same way as horizon upper and lower depths, by reporting the range either side of the boundary. Report in 0.1 centimetre increments (e.g. [0.5 cm]{.ceg}).
For rapid assessment, horizon boundaries can be classified using the following schema:
```{r}
#| label: tbl-hr-bdst
#| tbl-cap: "Horizon boundary distinctness"
dat_hr_bdst <-
tribble(~Code, ~Name, ~Description,
'S', 'Sharp', '< 0.5 cm',
'A', 'Abrupt', '0.5 - 2.0 cm',
'C', 'Clear', '2.0 - 5.0 cm',
'G', 'Gradual', '5.0 - 10.0 cm',
'D', 'Diffuse', '10 - 30.0 cm')
tbl_hr_bdst <- gt(dat_hr_bdst) |>
tab_options(
column_labels.font.weight = 'bold',
heading.title.font.weight = 'bold',
table.align = 'center',
table.width = '85%'
) |>
tab_style(style = list(cell_text(color = 'red',
weight = 'bold',
align = 'center')),
locations = cells_body(columns = 1)) |>
cols_width(Code ~pct(10), Name ~pct(20))
tbl_hr_bdst
```
Where a diffuse transition is thicker than 30 cm, it should be defined as a new horizon. Use transitional horizon names as needed (see @sec-hor-tran).
[put a diagram unifying the previous three concepts here]{.diags}
## Soil moisture status {#sec-pr-sws}
Report soil moisture status for each horizon at the time of observation. This parameter supports assessments of drainage and permeability, and contextualises consistence tests.
```{r}
#| label: tbl-hr-soilmst
#| tbl-cap: "Soil water status (adapted from @griffiths1985)."
dat_hr_bdst <-
tribble(~Code, ~Name, ~Sands, ~Light, ~Medium, ~Clays,
'D', 'Dry', 'loose, single grain', 'loose', 'easily broken down to powder', 'hard, baked, cracked',
'T', 'Moderately moist', 'will not form a ball', 'forms weak ball, breaks easily', 'forms a ball, very pliable', 'forms a ball, somewhat pliable',
'M', 'Moist', 'forms very weak ball', 'forms weak ball, breaks easily', 'forms a ball, very pliable', 'easily forms a ball',
'W', 'Wet', 'fluid, non-plastic, non-sticky', 'slightly fluid, slightly plastic', 'deformable, plastic', 'semi-deformable, very plastic',
'S', 'Saturated', 'water films visible, or below water table', '', '', '')
tbl_hr_bdst <- gt(dat_hr_bdst) |>
tab_options(
column_labels.font.weight = 'bold',
heading.title.font.weight = 'bold',
table.align = 'center',
table.width = '85%'
) |>
tab_style(style = list(cell_text(color = 'red',
weight = 'bold',
align = 'center')),
locations = cells_body(columns = 1)) |>
tab_style(style = list(cell_text(align='center', style='italic')),
locations = cells_body(columns = 3:6, rows = 5)) |>
tab_spanner(label = 'Behaviour of fine earth',
columns = Sands:Clays) |>
cols_label(Sands = '> 80% Sand',
Light = html("< 80% Sand<br />< 18% Clay"),
Medium = html('> 18% Clay<br />< 35% Clay'),
Clays = '>35% Clay') |>
cols_merge(columns = 3:6, hide_columns = FALSE, rows = 5 ) |>
cols_width(Code ~pct(10), Name ~pct(15))
tbl_hr_bdst
```
## Depth to free water
Depth to free water can be determined from the upper depth of the first [S]{.ceg} saturated horizon, or specifically recorded in whole centimetres. Depending on the soil's transmissivity, the presence of the water table may be revealed by the pit or core filling with water.
- If the water table is not encountered, record [NA]{.ceg}
- If the water table is encountered, use @tbl-hr-frw to code its position in the profile, then record the depth above or below in whole centimetres. Do not record negative numbers to signify a water table above the surface.
- If the water table is exactly at the soil surface, record ['B 0']{.ceg}.
e.g. ['B 80']{.ceg} for a profile saturated below 80 cm deep; ['A 1']{.ceg} for a barely-walkable peat.
```{r}
#| label: tbl-hr-frw
#| tbl-cap: "Free water location"
dat_hr_frw <-
tribble(~Code, ~Name, ~Description,
'NA', 'Not applicable', 'Water table not encountered',
'B', 'Below', 'Water table observed below the soil surface',
'A', 'Above', 'Water table observed at or above the soil surface')
tbl_hr_frw <- gt(dat_hr_frw) |>
tab_options(
column_labels.font.weight = 'bold',
heading.title.font.weight = 'bold',
table.align = 'center',
table.width = '85%'
) |>
tab_style(style = list(cell_text(color = 'red',
weight = 'bold',
align = 'center')),
locations = cells_body(columns = 1)) |>
cols_width(Code ~pct(10), Name ~pct(20))
tbl_hr_frw
```
## Parent material origin {#sec-orig}
Parent material origin, or mode of emplacement, describes how soil parent materials have arrived at the point of observation. Multiple modes may have operated in different parts of the soil profile.
Record one parent material origin code per soil horizon, using the codes in @tbl-ss-pmo. At the horizon level, the [An]{.ceg} Anthropic class can be subdivided by origin using the codes in @tbl-hr-antype (e.g. [Ann]{.ceg} for a fill pad in a residential housing development).
```{r}
#| label: tbl-hr-antype
#| tbl-cap: "Subtypes of Anthropic soil materials"
dat_hr_antype <-
tribble(~Code, ~Name, ~Description,
'm', 'Māori', 'Soil modifications dating from Māori arrival in New Zealand, particularly pre-modern soil management practices',
'p', 'Pakeha', 'Soil modifications dating from Pakeha (non-Māori) arrival in New Zealand up to modern times (e.g. European agricultural practices)',
'n', 'Modern', 'Anthropic modifications resulting from modern techniques or addition of modern materials to the soil (e.g. plastics)'
)
tbl_hr_antype <- gt(dat_hr_antype) |>
tab_options(
column_labels.font.weight = 'bold',
heading.title.font.weight = 'bold',
table.align = 'center',
table.width = '85%'
) |>
tab_style(style = list(cell_text(color = 'red',
weight = 'bold',
align = 'center')),
locations = cells_body(columns = 1)) |>
cols_width(Code ~pct(10), Name ~pct(20))
tbl_hr_antype
```
Parent material origin is also summarised across the top 100 cm of the soil profile as part of defining the NZSC Soil Family (@sec-fam-pmo).
## Degree of weathering {#sec-sedweath}
The effects of weathering and pedogenesis vary down-profile (usually, but not always, decreasing with depth). Horizons that have experienced limited weathering may require specific descriptors (e.g. texture (@sec-tex-rec) cannot be determined on slightly weathered rocks, but bedding (@sec-reg-bed) may need to be described), so the need for these should be assessed early in the description process. Record degree of weathering once per horizon.
```{r}
#| label: tbl-hr-wdeg
#| tbl-cap: "Degree of weathering"
dat_hr_wdeg <-
tribble(~Code, ~Name, ~Description_c, ~Description_u,
1, 'Unweathered', 'Material shows no discolouration, loss of strength, or any other effects due to weathering', 'Particles are uncoated and their physical arrangement has not been disturbed (e.g. visible cross-bedding, absence of burrows). Secondary minerals and precipitates are absent',
2, 'Slightly weathered', 'Material may be slightly discoloured. Discontinuities have discoloured surfaces. The rock material is not significantly weaker than fresh rock material', 'Particle physical arrangement is undisturbed, but some evidence of secondary mineral formation may be evident (e.g. pyrite formation in anoxic marine sediments)',
3, 'Moderately weathered', 'Rock material is discoloured and discontinuity surfaces will have a greater discolouration which also penetrates slightly into the rock material. The rock material is significantly weaker than the fresh rock and part of the rock mass may have been changed to soil material.', 'Sediments may be largely discoloured by secondary mineral precipitation or illuviation; some clay minerals may have weathered from the material, some physical disturbance by meso- or macrofauna may be apparent',
4, 'Highly weathered', 'Rock material is discoloured and more than half the rock mass is changed to soil material. Weathering adjacent to discontinuities penetrates deeply into the rock material but lithorelicts or core stones of fresh or slightly weathered rock may still be present.', 'Sediments show substantial alteration by weathering processes as evidenced by e.g. clay mineral production, presence of secondary materials and perhaps some structural development. Evidence of bedding may be absent or difficult to identify',
5, 'Very highly weathered', 'All the rock mass is decomposed and externally changed to soil material, but the original rock fabric is mainly preserved.', 'Sediments have largely changed to soil material, but the expression of features like structure may be weak relative to adjacent layers',
6, 'Completely weathered', 'Rock is completely changed to soil material with the original fabric completely destroyed but the resulting soil is not significantly transported.', 'Sediments have completely changed to soil material')
tbl_hr_wdeg <- gt(dat_hr_wdeg) |>
tab_options(
column_labels.font.weight = 'bold',
heading.title.font.weight = 'bold',
table.align = 'center',
table.width = '85%'
) |>
tab_style(style = list(cell_text(color = 'red',
weight = 'bold',
align = 'center')),
locations = cells_body(columns = 1)) |>
cols_label(Description_c = "Rock and rock fragments",
Description_u = "Unconsolidated sediments") |>
cols_width(Code ~pct(10), Name ~pct(20))
tbl_hr_wdeg
```