Files
coastline-tools/take_subset.py
2025-06-12 15:41:21 +02:00

83 lines
2.5 KiB
Python

"""
Extract subset from huge Polygon.txt for debugging.
Example:
$ python take_subset.py --input Norgeskyst.txt --output smaller.txt --start 10000 --end 15000 --prune 10 --min-points 100
"""
import argparse
def parse_arguments():
parser = argparse.ArgumentParser(
description="Extract subset from huge Polygon.txt for debugging.",
epilog="Example: $ python take_subset.py --input Norgeskyst.txt --output smaller.txt --start 10000 --end 15000 --prune 10 --min-points 100",
)
parser.add_argument(
"--input", required=True, help="Path to file in Polygon.txt format (input)"
)
parser.add_argument("--output", required=True, help="Path to the output file")
parser.add_argument("--start", default=1, type=int, help="Start polygon")
parser.add_argument("--end", default=1000000, type=int, help="End polygon")
parser.add_argument(
"--prune",
type=int,
help="Pruning factor for polygons with more than 1000 points",
)
parser.add_argument(
"--min-points",
type=int,
default=0,
help="Minimum number of points in a polygon to be included",
)
return parser.parse_args()
def main():
args = parse_arguments()
assert args.start <= args.end, (
"start_polygon must be less than or equal to end_polygon"
)
output_lines = []
current_polygon = 0
num_polygons = 0
with open(args.input, "r") as f:
_ = next(f) # COAST
_ = next(f) # number of polygons
while True:
try:
line = next(f)
except StopIteration:
break
n, _ = map(int, line.split())
current_polygon += 1
if current_polygon > args.end:
break
if args.start <= current_polygon <= args.end:
new_polygon = []
for _ in range(n):
new_polygon.append(next(f))
if n > 1000 and args.prune:
new_polygon = new_polygon[:: args.prune]
if len(new_polygon) >= args.min_points:
num_polygons += 1
output_lines.append(f"{len(new_polygon)} 1\n")
output_lines.extend(new_polygon)
else:
for _ in range(n):
next(f)
with open(args.output, "w") as f:
f.write("COAST\n")
f.write(f"{num_polygons}\n")
f.write("".join(output_lines))
if __name__ == "__main__":
main()