{"id":"v001","input":{"area":[{"lat":40.0,"lon":-105.0},{"lat":40.0,"lon":-104.99295},{"lat":40.00135,"lon":-104.99295},{"lat":40.00135,"lon":-105.0}],"line_spacing":"52.5 m","photo_spacing":"30 m"},"expect":{"result.lines":3.0,"ok":true},"source":"Flight-line arithmetic (Wolf, Dewitt & Wilkinson 2014, ch. 18) evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.lines":{"rel":1e-12,"abs":1e-12}},"supersededBy":"v006","reason":"Version 1.1.0 counts flight lines the published way (Penn State GEOG 892): ceil(width / spacing) + 1, so the outer lines reach both edges, where 1.0.0 centered ceil(width / spacing) lines. The replacement pins the new line count and the photo count."}
{"id":"v002","input":{"area":[{"lat":35.0,"lon":-100.0},{"lat":35.0,"lon":-99.998},{"lat":35.009,"lon":-99.998},{"lat":35.009,"lon":-100.0}],"line_spacing":"40.0 m","photo_spacing":"30 m"},"expect":{"result.lines":5.0,"ok":true},"source":"Flight-line arithmetic (Wolf, Dewitt & Wilkinson 2014, ch. 18) evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.lines":{"rel":1e-12,"abs":1e-12}},"supersededBy":"v007","reason":"Version 1.1.0 counts flight lines the published way (Penn State GEOG 892): ceil(width / spacing) + 1, so the outer lines reach both edges, where 1.0.0 centered ceil(width / spacing) lines. The replacement pins the new line count and the photo count."}
{"id":"v003","input":{"area":[{"lat":51.0,"lon":0.1},{"lat":51.0,"lon":0.112},{"lat":51.004,"lon":0.112},{"lat":51.004,"lon":0.1}],"line_spacing":"60.0 m","photo_spacing":"30 m"},"expect":{"result.lines":8.0,"ok":true},"source":"Flight-line arithmetic (Wolf, Dewitt & Wilkinson 2014, ch. 18) evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.lines":{"rel":1e-12,"abs":1e-12}},"supersededBy":"v008","reason":"Version 1.1.0 counts flight lines the published way (Penn State GEOG 892): ceil(width / spacing) + 1, so the outer lines reach both edges, where 1.0.0 centered ceil(width / spacing) lines. The replacement pins the new line count and the photo count."}
{"id":"v004","input":{"area":[{"lat":-33.0,"lon":151.0},{"lat":-33.0,"lon":151.0022},{"lat":-32.9978,"lon":151.0022},{"lat":-32.9978,"lon":151.0}],"line_spacing":"25.0 m","photo_spacing":"30 m"},"expect":{"result.lines":9.0,"ok":true},"source":"Flight-line arithmetic (Wolf, Dewitt & Wilkinson 2014, ch. 18) evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.lines":{"rel":1e-12,"abs":1e-12}},"supersededBy":"v009","reason":"Version 1.1.0 counts flight lines the published way (Penn State GEOG 892): ceil(width / spacing) + 1, so the outer lines reach both edges, where 1.0.0 centered ceil(width / spacing) lines. The replacement pins the new line count and the photo count."}
{"id":"v005","input":{"area":[{"lat":60.0,"lon":25.0},{"lat":60.0,"lon":25.005},{"lat":60.02,"lon":25.005},{"lat":60.02,"lon":25.0}],"line_spacing":"100.0 m","photo_spacing":"30 m"},"expect":{"result.lines":3.0,"ok":true},"source":"Flight-line arithmetic (Wolf, Dewitt & Wilkinson 2014, ch. 18) evaluated in Python (tools/vectors/gen_drone.py)","sourceVersion":"4th edition (2014)","tolerance":{"result.lines":{"rel":1e-12,"abs":1e-12}},"supersededBy":"v010","reason":"Version 1.1.0 counts flight lines the published way (Penn State GEOG 892): ceil(width / spacing) + 1, so the outer lines reach both edges, where 1.0.0 centered ceil(width / spacing) lines. The replacement pins the new line count and the photo count."}
{"id":"v006","input":{"area":[{"lat":40.0,"lon":-105.0},{"lat":40.0,"lon":-104.99295},{"lat":40.00135,"lon":-104.99295},{"lat":40.00135,"lon":-105.0}],"line_spacing":"52.5 m","photo_spacing":"30 m"},"expect":{"result.lines":4.0,"result.photos":104.0,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v007","input":{"area":[{"lat":35.0,"lon":-100.0},{"lat":35.0,"lon":-99.998},{"lat":35.009,"lon":-99.998},{"lat":35.009,"lon":-100.0}],"line_spacing":"40.0 m","photo_spacing":"30 m"},"expect":{"result.lines":6.0,"result.photos":234.0,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v008","input":{"area":[{"lat":51.0,"lon":0.1},{"lat":51.0,"lon":0.112},{"lat":51.004,"lon":0.112},{"lat":51.004,"lon":0.1}],"line_spacing":"60.0 m","photo_spacing":"30 m"},"expect":{"result.lines":9.0,"result.photos":306.0,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v009","input":{"area":[{"lat":-33.0,"lon":151.0},{"lat":-33.0,"lon":151.0022},{"lat":-32.9978,"lon":151.0022},{"lat":-32.9978,"lon":151.0}],"line_spacing":"25.0 m","photo_spacing":"30 m"},"expect":{"result.lines":10.0,"result.photos":140.0,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v010","input":{"area":[{"lat":60.0,"lon":25.0},{"lat":60.0,"lon":25.005},{"lat":60.02,"lon":25.005},{"lat":60.02,"lon":25.0}],"line_spacing":"100.0 m","photo_spacing":"30 m"},"expect":{"result.lines":4.0,"result.photos":320.0,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v011","input":{"area":[{"lat":-0.094604,"lon":-0.14457},{"lat":-0.094604,"lon":0.14457},{"lat":0.094604,"lon":0.14457},{"lat":0.094604,"lon":-0.14457}],"line_spacing":"8400 ft","photo_spacing":"2800 ft"},"expect":{"result.lines":10.0,"result.photos":430.0,"result.survey_length.value":321.86874,"ok":true},"source":"Penn State GEOG 892 (Q. Abdullah), Designing a Flight Route: (13 x 5,280 / 8,400) + 1 = 9.171, 10 lines; (105,600 / 2,800) + 1 = 38.7, 39, + 4 = 43 images per line; 430 images","sourceVersion":"Penn State College of Earth and Mineral Sciences, online course text, retrieved 2026-09-23","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0},"result.survey_length.value":{"rel":1e-05}}}
{"id":"v012","input":{"area":[{"lat":-0.094604,"lon":-0.14457},{"lat":-0.094604,"lon":0.14457},{"lat":0.094604,"lon":0.14457},{"lat":0.094604,"lon":-0.14457}],"line_spacing":"8400 ft","photo_spacing":"2800 ft","end_photos":0},"expect":{"result.lines":10.0,"result.photos":390.0,"ok":true},"source":"Penn State GEOG 892 (Q. Abdullah), Designing a Flight Route: (13 x 5,280 / 8,400) + 1 = 9.171, 10 lines; (105,600 / 2,800) + 1 = 38.7, 39, + 4 = 43 images per line; 430 images (390 without the extra images)","sourceVersion":"Penn State College of Earth and Mineral Sciences, online course text, retrieved 2026-09-23","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v013","input":{"area":[{"lat":-0.094604,"lon":-0.14457},{"lat":-0.094604,"lon":0.14457},{"lat":0.094604,"lon":0.14457},{"lat":0.094604,"lon":-0.14457}],"line_spacing":"8400 ft","photo_spacing":"2800 ft","end_photos":2},"expect":{"result.lines":10.0,"result.photos":430.0,"ok":true},"source":"Penn State GEOG 892 (Q. Abdullah), Designing a Flight Route: (13 x 5,280 / 8,400) + 1 = 9.171, 10 lines; (105,600 / 2,800) + 1 = 38.7, 39, + 4 = 43 images per line; 430 images","sourceVersion":"Penn State College of Earth and Mineral Sciences, online course text, retrieved 2026-09-23","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v014","input":{"area":[{"lat":-0.180874,"lon":-0.269495},{"lat":-0.180874,"lon":0.269495},{"lat":0.180874,"lon":0.269495},{"lat":0.180874,"lon":-0.269495}],"line_spacing":"920 m","photo_spacing":"460 m"},"expect":{"result.lines":45.0,"result.photos":6120.0,"result.survey_length.value":2699.990792,"ok":true},"source":"King Saud University SE 321, Design of Photogrammetric Flight Plan (CLO3 example): (60,000 / 460) + 1 = 131.4, 132 + 4 = 136 photos per strip; (40,000 / 920) + 1 = 44.4, 45 lines; 136 x 45 = 6,120 photos","sourceVersion":"faculty.ksu.edu.sa, retrieved 2026-09-23","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0},"result.survey_length.value":{"rel":1e-05}}}
{"id":"v015","input":{"area":[{"lat":-0.180874,"lon":-0.269495},{"lat":-0.180874,"lon":0.269495},{"lat":0.180874,"lon":0.269495},{"lat":0.180874,"lon":-0.269495}],"line_spacing":"920 m","photo_spacing":"460 m","end_photos":0},"expect":{"result.lines":45.0,"result.photos":5940.0,"ok":true},"source":"King Saud University SE 321, Design of Photogrammetric Flight Plan (CLO3 example): (60,000 / 460) + 1 = 131.4, 132 + 4 = 136 photos per strip; (40,000 / 920) + 1 = 44.4, 45 lines; 136 x 45 = 6,120 photos (5,940 without the extra photos)","sourceVersion":"faculty.ksu.edu.sa, retrieved 2026-09-23","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v016","input":{"area":[{"lat":-0.094604,"lon":-0.14457},{"lat":-0.094604,"lon":0.14457},{"lat":0.094604,"lon":0.14457},{"lat":0.094604,"lon":-0.14457}],"line_spacing":"8400 ft","photo_spacing":"2800 ft","direction":"0 deg"},"expect":{"result.lines":14.0,"result.photos":420.0,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v017","input":{"area":[{"lat":-0.094604,"lon":-0.14457},{"lat":-0.094604,"lon":0.14457},{"lat":0.094604,"lon":0.14457},{"lat":0.094604,"lon":-0.14457}],"line_spacing":"8400 ft","photo_spacing":"2800 ft","end_photos":1},"expect":{"result.lines":10.0,"result.photos":410.0,"result.survey_length.value":321.86874,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0},"result.survey_length.value":{"rel":1e-05}}}
{"id":"v018","input":{"area":[{"lat":-0.180874,"lon":-0.269495},{"lat":-0.180874,"lon":0.269495},{"lat":0.180874,"lon":0.269495},{"lat":0.180874,"lon":-0.269495}],"line_spacing":"920 m","photo_spacing":"460 m","end_photos":5},"expect":{"result.lines":45.0,"result.photos":6390.0,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v019","input":{"area":[{"lat":-0.180874,"lon":-0.269495},{"lat":-0.180874,"lon":0.269495},{"lat":0.180874,"lon":0.269495},{"lat":0.180874,"lon":-0.269495}],"line_spacing":"1500 m","photo_spacing":"700 m"},"expect":{"result.lines":28.0,"result.photos":2548.0,"result.survey_length.value":1679.99427,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0},"result.survey_length.value":{"rel":1e-05}}}
{"id":"v020","input":{"area":[{"lat":-0.094604,"lon":-0.14457},{"lat":-0.094604,"lon":0.14457},{"lat":0.094604,"lon":0.14457},{"lat":0.094604,"lon":-0.14457}],"line_spacing":"30000 ft","photo_spacing":"10000 ft"},"expect":{"result.lines":4.0,"result.photos":64.0,"ok":true},"source":"Published flight-line count (Penn State GEOG 892): ceil(width / spacing) + 1 lines, ceil(length / photo spacing) + 1 + 2 x extra photos per line, on geographiclib arc lengths (tools/vectors/gen_image_count.py): spacings a third of the block, ceil(2.29) + 1 = 4 lines of ceil(10.56) + 1 + 4 = 16 photos","sourceVersion":"tool version 1.1.0","tolerance":{"result.lines":{"abs":0},"result.photos":{"abs":0}}}
{"id":"v021","input":{"area":[{"lat":40.0,"lon":-105.0},{"lat":40.0,"lon":-104.99295},{"lat":40.00135,"lon":-104.99295},{"lat":40.00135,"lon":-105.0}],"line_spacing":"52.5 m","photo_spacing":"30 m","end_photos":1.5},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"Extra photos per line end must be a whole number (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0"}
{"id":"v022","input":{"area":[{"lat":40.0,"lon":-105.0},{"lat":40.0,"lon":-104.99295},{"lat":40.00135,"lon":-104.99295},{"lat":40.00135,"lon":-105.0}],"line_spacing":"52.5 m","photo_spacing":"30 m","end_photos":11},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"Extra photos per line end are 0 to 10 (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0"}
{"id":"v023","input":{"area":[{"lat":40.0,"lon":-105.0},{"lat":40.0,"lon":-104.99295},{"lat":40.00135,"lon":-104.99295},{"lat":40.00135,"lon":-105.0}],"line_spacing":"52.5 m","photo_spacing":"30 m","end_photos":-1},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"Extra photos per line end are 0 to 10 (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0"}
{"id":"v024","input":{"area":[{"lat":40.0,"lon":-105.0},{"lat":40.0,"lon":-104.99295},{"lat":40.00135,"lon":-104.99295},{"lat":40.00135,"lon":-105.0}],"line_spacing":"0.1 m","photo_spacing":"30 m"},"expect":{"ok":false,"error.code":"OUT_OF_DOMAIN"},"source":"Line spacing under 0.5 m (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0"}
{"id":"v025","input":{"area":[{"lat":40.0,"lon":-105.0},{"lat":40.0,"lon":-104.99295},{"lat":40.00135,"lon":-104.99295},{"lat":40.00135,"lon":-105.0}],"line_spacing":"-5 m","photo_spacing":"30 m"},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"Line spacing must be positive (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0"}
{"id":"v026","input":{"area":[{"lat":40.0,"lon":-105.0},{"lat":40.0,"lon":-104.99295}],"line_spacing":"52.5 m","photo_spacing":"30 m"},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"An area needs 3 corners (tools/vectors/gen_image_count.py)","sourceVersion":"tool version 1.1.0"}
