{"id":"v001","input":{"height":"100 m","highest_terrain":"40 m","front_overlap":75,"side_overlap":65},"expect":{"result.effective_height.value":60.0,"result.front_overlap_worst":58.33333333333333,"result.side_overlap_worst":41.666666666666664,"meta.warnings.1.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}},"supersededBy":"v015","reason":"Promotion to stable dropped EXPERIMENTAL_TOOL, which moved OVERLAP_BELOW_TARGET from index 1 to 0; the replacement names the warning by code."}
{"id":"v002","input":{"height":"100 m","highest_terrain":"0 m","front_overlap":75,"side_overlap":65},"expect":{"result.effective_height.value":100.0,"result.front_overlap_worst":75.0,"result.side_overlap_worst":65.0,"ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v003","input":{"height":"120 m","highest_terrain":"30 m","front_overlap":80,"side_overlap":70,"target_overlap":70},"expect":{"result.effective_height.value":90.0,"result.front_overlap_worst":73.33333333333334,"result.side_overlap_worst":60.0,"meta.warnings.1.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}},"supersededBy":"v016","reason":"Promotion to stable dropped EXPERIMENTAL_TOOL, which moved OVERLAP_BELOW_TARGET from index 1 to 0; the replacement names the warning by code."}
{"id":"v004","input":{"height":"60 m","highest_terrain":"10 m","front_overlap":85,"side_overlap":70},"expect":{"result.effective_height.value":50.0,"result.front_overlap_worst":82.0,"result.side_overlap_worst":64.0,"meta.warnings.1.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}},"supersededBy":"v017","reason":"Promotion to stable dropped EXPERIMENTAL_TOOL, which moved OVERLAP_BELOW_TARGET from index 1 to 0; the replacement names the warning by code."}
{"id":"v005","input":{"height":"150 m","highest_terrain":"90 m","front_overlap":75,"side_overlap":60,"target_overlap":60},"expect":{"result.effective_height.value":60.0,"result.front_overlap_worst":37.499999999999986,"result.side_overlap_worst":-2.220446049250313e-14,"meta.warnings.1.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}},"supersededBy":"v018","reason":"Promotion to stable dropped EXPERIMENTAL_TOOL, which moved OVERLAP_BELOW_TARGET from index 1 to 0; the replacement names the warning by code."}
{"id":"v006","input":{"height":"100 m","highest_terrain":"-20 m","front_overlap":75,"side_overlap":65},"expect":{"result.effective_height.value":120.0,"result.front_overlap_worst":79.16666666666666,"result.side_overlap_worst":70.83333333333333,"ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v007","input":{"height":"80 m","highest_terrain":"50 m","front_overlap":90,"side_overlap":80,"target_overlap":75},"expect":{"result.effective_height.value":30.0,"result.front_overlap_worst":73.33333333333334,"result.side_overlap_worst":46.66666666666668,"result.min_height.value":249.99999999999943,"meta.warnings.1.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.min_height.value":{"rel":1e-09,"abs":1e-09}},"supersededBy":"v019","reason":"Promotion to stable dropped EXPERIMENTAL_TOOL, which moved OVERLAP_BELOW_TARGET from index 1 to 0; the replacement names the warning by code."}
{"id":"v008","input":{"height":"200 m","highest_terrain":"25 m","front_overlap":70,"target_overlap":65},"expect":{"result.effective_height.value":175.0,"result.front_overlap_worst":65.71428571428571,"result.min_height.value":175.00000000000014,"ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.min_height.value":{"rel":1e-09,"abs":1e-09}}}
{"id":"v009","input":{"height":"45 m","highest_terrain":"5 m","front_overlap":80,"side_overlap":60,"target_overlap":50},"expect":{"result.effective_height.value":40.0,"result.front_overlap_worst":77.5,"result.side_overlap_worst":54.99999999999999,"result.min_height.value":25.0,"ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.min_height.value":{"rel":1e-09,"abs":1e-09}}}
{"id":"v010","input":{"height":"100 m","highest_terrain":"40 m","front_overlap":75,"side_overlap":65,"target_overlap":70},"expect":{"result.effective_height.value":60.0,"result.front_overlap_worst":58.33333333333333,"result.side_overlap_worst":41.666666666666664,"meta.warnings.1.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}},"supersededBy":"v020","reason":"Promotion to stable dropped EXPERIMENTAL_TOOL, which moved OVERLAP_BELOW_TARGET from index 1 to 0; the replacement names the warning by code."}
{"id":"v011","input":{"height":"130 m","highest_terrain":"60 m","front_overlap":85,"side_overlap":75,"target_overlap":80},"expect":{"result.effective_height.value":70.0,"result.front_overlap_worst":72.14285714285712,"result.side_overlap_worst":53.57142857142857,"meta.warnings.1.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}},"supersededBy":"v021","reason":"Promotion to stable dropped EXPERIMENTAL_TOOL, which moved OVERLAP_BELOW_TARGET from index 1 to 0; the replacement names the warning by code."}
{"id":"v012","input":{"height":"90 m","highest_terrain":"30 m","front_overlap":60,"side_overlap":50},"expect":{"result.effective_height.value":60.0,"result.front_overlap_worst":39.99999999999999,"result.side_overlap_worst":24.99999999999999,"meta.warnings.1.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Flight-planning geometry (Wolf, Dewitt & Wilkinson 2014, ch. 18): footprint and fixed photo spacing, evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}},"supersededBy":"v022","reason":"Promotion to stable dropped EXPERIMENTAL_TOOL, which moved OVERLAP_BELOW_TARGET from index 1 to 0; the replacement names the warning by code."}
{"id":"v013","input":{"height":"100 m","highest_terrain":"40 m","front_overlap":75,"side_overlap":65,"sensor_width":"13.2 mm","focal_length":"8.8 mm","image_width":5472},"expect":{"result.gsd_worst.value":1.6447368421052628,"result.gsd_takeoff.value":2.741228070175438,"result.front_overlap_worst":58.33333333333333,"ok":true},"source":"add-drone-suite scenarios","sourceVersion":"2026","tolerance":{"result.gsd_worst.value":{"rel":1e-09,"abs":1e-09},"result.gsd_takeoff.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v014","input":{"height":"100 m","highest_terrain":"100 m","front_overlap":75},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"add-drone-suite scenarios","sourceVersion":"2026","tolerance":{}}
{"id":"v015","input":{"height":"100 m","highest_terrain":"40 m","front_overlap":75,"side_overlap":65},"expect":{"result.effective_height.value":60.0,"result.front_overlap_worst":58.33333333333333,"result.side_overlap_worst":41.666666666666664,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v016","input":{"height":"120 m","highest_terrain":"30 m","front_overlap":80,"side_overlap":70,"target_overlap":70},"expect":{"result.effective_height.value":90.0,"result.front_overlap_worst":73.33333333333334,"result.side_overlap_worst":59.999999999999986,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v017","input":{"height":"60 m","highest_terrain":"10 m","front_overlap":85,"side_overlap":70},"expect":{"result.effective_height.value":50.0,"result.front_overlap_worst":82.0,"result.side_overlap_worst":63.99999999999999,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v018","input":{"height":"150 m","highest_terrain":"90 m","front_overlap":75,"side_overlap":60,"target_overlap":60},"expect":{"result.effective_height.value":60.0,"result.front_overlap_worst":37.5,"result.side_overlap_worst":0.0,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v019","input":{"height":"80 m","highest_terrain":"50 m","front_overlap":90,"side_overlap":80,"target_overlap":75},"expect":{"result.effective_height.value":30.0,"result.front_overlap_worst":73.33333333333334,"result.side_overlap_worst":46.66666666666668,"result.min_height.value":249.99999999999977,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.min_height.value":{"rel":1e-09,"abs":1e-09}}}
{"id":"v020","input":{"height":"100 m","highest_terrain":"40 m","front_overlap":75,"side_overlap":65,"target_overlap":70},"expect":{"result.effective_height.value":60.0,"result.front_overlap_worst":58.33333333333333,"result.side_overlap_worst":41.666666666666664,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v021","input":{"height":"130 m","highest_terrain":"60 m","front_overlap":85,"side_overlap":75,"target_overlap":80},"expect":{"result.effective_height.value":70.0,"result.front_overlap_worst":72.14285714285712,"result.side_overlap_worst":53.57142857142857,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v022","input":{"height":"90 m","highest_terrain":"30 m","front_overlap":60,"side_overlap":50},"expect":{"result.effective_height.value":60.0,"result.front_overlap_worst":40.0,"result.side_overlap_worst":25.0,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v023","input":{"height":"20000 ft","highest_terrain":"4444 ft","front_overlap":65,"target_overlap":55},"expect":{"result.front_overlap_worst":55.0,"result.min_height.value":6096.0,"ok":true},"source":"Pryor 1959, Relationship of Topographic Relief, Flight Height, and Minimum and Maximum Overlap, HRB Bulletin 228, p. 31","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.front_overlap_worst":{"abs":0.01},"result.min_height.value":{"abs":1.0}}}
{"id":"v024","input":{"height":"1300 ft","highest_terrain":"289 ft","front_overlap":65,"target_overlap":55},"expect":{"result.front_overlap_worst":55.0,"result.min_height.value":396.24,"ok":true},"source":"Pryor 1959, Relationship of Topographic Relief, Flight Height, and Minimum and Maximum Overlap, HRB Bulletin 228, p. 32","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.front_overlap_worst":{"abs":0.01},"result.min_height.value":{"abs":0.5}}}
{"id":"v025","input":{"height":"400 ft","highest_terrain":"100 ft","front_overlap":80,"side_overlap":70,"target_overlap":65},"expect":{"result.effective_height.value":91.44,"result.front_overlap_worst":73.33333333333334,"result.side_overlap_worst":59.999999999999986,"result.min_height.value":213.36000000000027,"ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.effective_height.value":{"rel":1e-09,"abs":1e-09},"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.min_height.value":{"rel":1e-09,"abs":1e-09}}}
{"id":"v026","input":{"height":"100 m","highest_terrain":"20 m","front_overlap":75,"target_overlap":80},"expect":{"result.front_overlap_worst":68.75,"meta.warnings.*.code":"OVERLAP_BELOW_TARGET","ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09}}}
{"id":"v027","input":{"height":"100 m","highest_terrain":"-30 m","front_overlap":75,"side_overlap":65,"sensor_width":"13.2 mm","focal_length":"8.8 mm","image_width":5472},"expect":{"result.front_overlap_worst":80.76923076923077,"result.side_overlap_worst":73.07692307692308,"result.gsd_worst.value":3.56359649122807,"result.gsd_takeoff.value":2.7412280701754383,"ok":true},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{"result.front_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.side_overlap_worst":{"rel":1e-09,"abs":1e-09},"result.gsd_worst.value":{"rel":1e-09,"abs":1e-09},"result.gsd_takeoff.value":{"rel":1e-09,"abs":1e-09}}}
{"id":"v028","input":{"height":"0 m","highest_terrain":"0 m","front_overlap":75},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{}}
{"id":"v029","input":{"height":"100 m","highest_terrain":"120 m","front_overlap":75},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"Overlap at the highest relief, o_t = 1 - (1 - o) h / (h - t) (Pryor 1959, HRB Bulletin 228, pp. 36-37), evaluated in Python (tools/vectors/gen_photogrammetry_overlap.py)","sourceVersion":"Bulletin 228 (1959)","tolerance":{}}
