83 lines
2.5 KiB
Python
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()
|