fix(street): grade crossing ramps to <=8%; report step location in the pre-check
- kerb_height ramp run now derives from --max-ramp-grade (default 8%), giving 1.63 m instead of the fixed 1.5 m (8.7%). Crossing route measures 3.4 cm at 0.25 m sampling. - site_assembly pre-check: coverage is independent of --sample (it used to shrink the route), and it now prints the grade and the s/offset location of the worst step so a step can be located instead of guessed. - Documents the remaining south s=198 / north s=251 strip discontinuity as a finding on the 'audit collision gaps' item rather than claiming it fixed. - Street + site rebuilt, site re-imported (7/7), DemoMap rebuilt; packaged -qaselftest PASS.
This commit is contained in:
1 parent
eab89bae47
commit
52e9cc80a8
21 files changed
+95
-41
No files matched your search
@@ -165,10 +165,16 @@ def main():
|
||||
def lat_lon(s, offset):
|
||||
return oc.point_at(line, _lengths, s, offset, lat0, lon0)
|
||||
|
||||
# Sample spacing is independent of coverage: walk the whole block at
|
||||
# `--sample` metres, so a finer spacing measures the gradient instead of
|
||||
# accidentally shortening the route (previously range(int(block_len)) with a
|
||||
# 0.25 m spacing only covered a quarter of the block).
|
||||
along = int(block_len / args.sample)
|
||||
across = int(26.0 / args.sample)
|
||||
route_specs = {
|
||||
"south sidewalk": [(s, -12.5) for s in [i * args.sample for i in range(int(block_len))]],
|
||||
"north sidewalk": [(s, 13.0) for s in [i * args.sample for i in range(int(block_len))]],
|
||||
"crossing at 130 m": [(130.0, o) for o in [i * args.sample - 12.5 for i in range(26)]],
|
||||
"south sidewalk": [(i * args.sample, -12.5) for i in range(along)],
|
||||
"north sidewalk": [(i * args.sample, 13.0) for i in range(along)],
|
||||
"crossing at 130 m": [(130.0, i * args.sample - 12.5) for i in range(across)],
|
||||
}
|
||||
flat = [(spec, lat_lon(s, off)) for spec, samples in route_specs.items() for s, off in samples]
|
||||
local = project_to_local([ll for _spec, ll in flat], find_proj())
|
||||
@@ -185,12 +191,20 @@ def main():
|
||||
heights.append(None)
|
||||
else:
|
||||
heights.append(z)
|
||||
deltas = [abs(b - a) for a, b in zip(heights, heights[1:])
|
||||
deltas = [(i, abs(b - a)) for i, (a, b) in enumerate(zip(heights, heights[1:]))
|
||||
if a is not None and b is not None]
|
||||
max_step = max(deltas) if deltas else float("nan")
|
||||
worst_i, max_step = (max(deltas, key=lambda t: t[1]) if deltas else (0, float("nan")))
|
||||
known = [h for h in heights if h is not None]
|
||||
grade = (max_step / args.sample) * 100 if deltas else float("nan")
|
||||
# Position of the worst step, as arc length / cross offset, so the cause
|
||||
# can be located instead of guessed.
|
||||
if label == "crossing at 130 m":
|
||||
where = f"s=130 off={(worst_i * args.sample - 12.5):+.2f} m"
|
||||
else:
|
||||
where = f"s={worst_i * args.sample:.1f} m"
|
||||
print(f" {label:18} samples {len(heights):3} holes {holes} "
|
||||
f"Z {min(known):+.2f}..{max(known):+.2f} max step {max_step*100:.1f} cm")
|
||||
f"Z {min(known):+.2f}..{max(known):+.2f} max step {max_step*100:.1f} cm "
|
||||
f"({grade:.1f} % grade) at {where}")
|
||||
|
||||
out = os.path.abspath(args.out)
|
||||
os.makedirs(os.path.dirname(out), exist_ok=True)
|
||||
|
||||
Reference in new issue
Block a user