Repository navigation
Expand file tree
/
Copy pathmanifest.example.json
More file actions
265 lines (265 loc) · 10.6 KB
/
Copy pathmanifest.example.json
File metadata and controls
265 lines (265 loc) · 10.6 KB
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
{
"format": "kvterrain-atlas-r16/1",
"attribution": "\u00a9 Kartverket (CC BY 4.0)",
"source": "DTM",
"crs": "EPSG:25832",
"row_order": "north_to_south",
"byte_order": "little_endian",
"bits": 16,
"origin_utm": [
500000.0,
6785060.0
],
"leaf_spacing_m": 10.0,
"tile_cells": 64,
"tile_samples": 65,
"leaf_tiles": [
32,
32
],
"num_levels": 6,
"height_min_m": 240.03114318847656,
"height_max_m": 759.7891235351562,
"nodata_fill_m": 0.0,
"region_bbox_utm": [
500000.0,
6785060.0,
520480.0,
6805540.0
],
"atlas": {
"format": "dense_v1",
"height_file": "heights.atlas",
"tile_bytes": 8450,
"height_bytes": 11534250,
"surface_file": "surface.atlas",
"water_id_file": "water_id.atlas"
},
"water_surface": {
"atlas_file": "surface.atlas",
"atlas_format": "dense_v1",
"dtype": "u16le",
"packing": "same [height_min_m, height_max_m] as the height atlas, mapped to [0,65534]",
"nodata_code": 65535,
"units": "metres_above_sea_level",
"row_order": "north_to_south",
"runtime": "surface = (code==65535) ? NO_WATER : height_min_m + code/65534*(height_max_m-height_min_m); depth = max(0, surface - terrain_height). Unifies lakes and rivers; no rim scan, no rain-fill, valid across terrain edits.",
"lake_surface": "authoritative NVE hoyde, or a level read off the LiDAR water surface inside the polygon (metres above sea level)",
"river_surface": "the UNCARVED leaf-DTM ground height under the channel \u2014 the river surface sits ON the terrain, and the water column comes from the trench carved beneath it (see river_carve_depth_by_order_m); raised to the lake surface, never lowered to it, where a river meets a lake.",
"river_carve_depth_by_order_m": {
"1": 1.5,
"2": 2.25,
"3": 3.0,
"4": 4.0,
"5": 5.5,
"6": 7.0,
"7": 9.0,
"8": 11.0
},
"tiles_written": 1365,
"attribution": "\u00a9 NVE \u2014 Elvenett (ELVIS) & Innsj\u00f8database",
"license": "NLOD / CC BY 4.0 (confirm current terms at geonorge.no)",
"sources": {
"rivers": "https://kart.nve.no/enterprise/rest/services/Elvenett1/MapServer (layer 2 elvenett \u2014 the authoritative network, serialised as polylines)",
"rivers_order_overlay": "https://kart.nve.no/enterprise/rest/services/Elvenett1/MapServer (layer 1 hovedelv \u2014 rasterised for the stream-order upgrade only, not serialised)",
"lakes": "https://kart.nve.no/enterprise/rest/services/Innsjodatabase2/MapServer (layer 5 Innsjodatabase)"
},
"identity_fields": {
"segment_primary": "strekn_lnr",
"river": "elvid",
"catchment": "vassdragsnr",
"lake": "vatnlnr",
"note": "objectid is Esri-internal and NOT persisted \u2014 it is not stable across NVE service updates."
},
"width_model": {
"note": "centerline buffered to this FULL width (m) by stream order, then scaled; drives pixel coverage only.",
"scale": 1.0,
"width_by_order_m": {
"1": 2.0,
"2": 3.0,
"3": 5.0,
"4": 8.0,
"5": 14.0,
"6": 25.0,
"7": 45.0,
"8": 80.0
},
"default_order_main": 5,
"default_order_minor": 2
},
"lake_count": 1,
"lake_levels": {
"lakes_total": 1,
"levels_from_nve": 1,
"levels_estimated": 0,
"levels_capped_to_perimeter": 0,
"levels_cap_max_drop_m": 0.0,
"perimeter_cap_enabled": true,
"levels_unresolved": 0,
"estimation_enabled": true,
"margin_m": 0.0,
"band_pct": [
1.0,
25.0
],
"method": "a published NVE hoyde is used verbatim. For a lake without one: the mean of the 1-25th percentile band of the void-repaired DTM inside the polygon (LiDAR returns the water surface), ignoring island pixels, minus margin_m, then capped at the 25th percentile of the land ring just outside the polygon so the estimate cannot stand above the terrain around it."
},
"lake_bathymetry": {
"enabled": true,
"carve_depth_m": 20.0,
"shore_slope_m_per_m": 1.0,
"shore_ramp_m": 20.0,
"min_depth_m": 2.0,
"method": "linear_ramp_below_known_surface",
"ramp_anchor": "waterline",
"ramp_profile_m": "a STRAIGHT ramp: depth = carve_depth_m * clip((metres from the waterline) / shore_ramp_m, 0, 1), flat from there inward. shore_ramp_m = carve_depth_m / shore_slope_m_per_m, so at slope 1.0 a 20 m bed takes 20 m of shore. A body too small to reach carve_depth_m has its profile scaled up just far enough to reach min_depth_m at its deepest sample",
"shoreline_snap": {
"max_px": 2,
"tol_m": 0.35,
"samples_added": 1254,
"lakes_grown": 1
},
"islands": "lake polygon holes are rasterised as lake so the surface runs through them, but their DTM height is left alone and they act as shore for the ramp; depth = max(0, level - terrain) hides them",
"rationale": "LiDAR returns the lake SURFACE as terrain height, so without a carve the water plane and the terrain are coincident. Safe for the solver: ramped, never breaks the rim, and the lake level is authored and pinned."
},
"river_bathymetry": {
"enabled": true,
"depth_scale": 1.0,
"method": "trench_under_the_channel_scaled_by_modelled_width",
"bank_tolerance_m": 2.0,
"level": "the ground under the channel's own centreline, spread flat across the samples that centreline seeded \u2014 so the water surface is level ACROSS a channel and descends ALONG it",
"profile": "depth = depth_by_order(order) * smoothstep(distance from bank / modelled channel half-width), cut in full while the sample is within bank_tolerance_m of the water level and tapering to nothing at twice that; a one-sample channel takes full depth as a step",
"rationale": "the river water surface is the uncarved ground under the channel, so the trench is the entire water column. Carving down rather than raising the surface keeps a river in its landscape instead of on top of it; levelling across the channel and stopping the carve at the waterline keeps it off the cliffs beside it."
}
},
"water_id": {
"atlas_file": "water_id.atlas",
"atlas_format": "dense_v1",
"dtype": "u16le",
"row_order": "north_to_south",
"encoding": {
"dry": 0,
"river": 1,
"ocean": 2,
"reserved": "3..15",
"lake_id_base": 16,
"lake": "code >= 16; local lake id = code - 16"
},
"runtime": "isLake = v >= 16; isRiver = v == 1; isOcean = v == 2; lake_id = v - 16 keys into lakes.json for the authored level. Tile byte offsets are identical to the height atlas.",
"downsample": "categorical; precedence lake > river > ocean > dry, majority lake id; never averaged",
"tiles_written": 1365
},
"water_vector": {
"rivers": {
"file": "rivers.bin",
"format": "kvterrain-rivers-bin/1",
"magic": "KVRIVER1",
"byte_order": "little_endian",
"bytes": 72154,
"segments": 6,
"vertices": 4476,
"vertex_fields": [
"x_rel_origin_m",
"y_rel_origin_m",
"z_bed_m",
"level_surface_m"
],
"vertex_order": "upstream_to_downstream",
"note": "z is the sampled DTM BED \u2014 the floor of the carved channel \u2014 burn against this. level is the water SURFACE (the ground above that channel, or the lake's authored level inside a lake span) \u2014 pin to this. Loaded once, resident; not streamed."
},
"lakes": {
"file": "lakes.json",
"count": 1,
"with_authored_level": 1,
"with_estimated_level": 0
},
"junctions": {
"file": "junctions.json",
"count": 2,
"inflow": 1,
"outflow": 1
},
"validation": {
"segments": 6,
"vertices": 4476,
"vertex_stride_m": 10.0,
"junctions": 2,
"lakes": 1,
"clip_source_features": 6,
"clip_features_clipped": 0,
"clip_features_dropped": 0,
"clip_segments_split": 0,
"clip_vertices_dropped": 0,
"clip_vertices_dropped_pct": 0.0,
"clip_note": "vertices outside the export region are dropped and a feature that re-enters is split; sampling them would clamp to an edge pixel and fabricate bed, level and lake id.",
"lake_spans_raw": 3,
"lake_spans_merged": 0,
"lake_spans_dropped_short": 0,
"lake_spans_kept": 3,
"lake_span_min_vertices": 3,
"lake_span_close_gap": 2,
"descent_vertices_checked": 4470,
"descent_rising_vertices": 1896,
"descent_rising_pct": 42.41610738255034,
"descent_segments_with_rise": 5,
"descent_worst_rise_m": 106.76959228515625,
"descent_rising_pct_in_lake_span": 0.351493848857645,
"descent_rising_pct_open_channel": 48.551653422199436,
"descent_note": "reported only; not corrected. The runtime burn's running-minimum enforces descent.",
"flowdir_segments_checked": 6,
"flowdir_disagreements": 3,
"flowdir_disagreement_pct": 50.0,
"flowdir_lake_touching_segments": 3,
"flowdir_vatnlnr_segments": 3,
"flowdir_disagreement_pct_lake_touching": 33.333333333333336,
"flowdir_disagreement_pct_non_lake": 66.66666666666667,
"flowdir_note": "source vertex order is authoritative; Z is an independent QA signal only and never flips a segment.",
"connectivity_orphan_segments": 0,
"connectivity_sink_segments": 2,
"connectivity_source_segments": 3,
"connectivity_note": "orphans are segments with neither an upstream nor a downstream neighbour; a few at the region border are expected, many in the interior are not."
}
},
"generator": {
"name": "kvterrain",
"version": "0.5.0",
"generated_utc": "2026-08-14T15:13:48+00:00",
"crs": "EPSG:25832",
"transform": {
"origin_utm": [
500000.0,
6785060.0
],
"leaf_spacing_m": 10.0,
"samples": [
2049,
2049
],
"row_order": "north_to_south",
"sampling": "corner_centered_pixel_is_a_point"
},
"parameters": {
"source_kind": "DTM",
"nodata_fill_m": 0.0,
"height_min_m": 240.03114318847656,
"height_max_m": 759.7891235351562,
"tile_cells": 64,
"water": {
"river_width_scale": 1.0,
"river_depth_scale": 1.0,
"river_bank_tolerance_m": 2.0,
"river_vertex_stride_m": 10.0,
"lake_carve_depth_m": 20.0,
"lake_shore_slope": 1.0,
"lake_shore_ramp_m": 20.0,
"lake_min_depth_m": 2.0,
"lake_snap_px": 2,
"lake_holes_filled": true,
"ocean_level_m": 0.0,
"include_main_rivers": true,
"estimate_lake_levels": true,
"lake_perimeter_cap": true
}
}
}
}