fig2layer.py (2033B) - Raw
1 #!/usr/bin/python3 2 import argparse 3 4 from math import pi 5 from pyproj import CRS 6 import numpy as np 7 import geopandas as gpd 8 from shapely.geometry import LineString, MultiLineString 9 10 BOUNDS = ('xmin', 'ymin', 'xmax', 'ymax') 11 12 13 def write_file(args, geom): 14 df = gpd.GeoDataFrame(crs=CRS(3346)) 15 df['geometry'] = None 16 df.loc[0, 'geometry'] = geom 17 df.to_file(args.outfile, driver='GPKG') 18 19 20 def sinewave(args): 21 INTERVAL = 0.1 22 23 if args.numwaves == 2: 24 TAIL_LEN, SINE_LEN = 7, 7 25 TAILS = np.zeros(int(TAIL_LEN / INTERVAL)) 26 sin_range = np.arange(-pi/4, SINE_LEN, INTERVAL) * pi / 2 27 amplitude = (np.sin(sin_range)+1) 28 else: 29 TAIL_LEN, SINE_LEN = 3.5, 3.5 30 TAILS = np.zeros(int(TAIL_LEN / INTERVAL)) 31 sin_range = np.arange(-pi/4, SINE_LEN - pi/8, INTERVAL) * pi / 2 32 amplitude = np.sin(sin_range) + 1 33 34 y = np.concatenate([TAILS, amplitude, TAILS]) 35 x = np.arange(-TAIL_LEN - pi/4, SINE_LEN + TAIL_LEN, INTERVAL) 36 lines = LineString(zip(x*10, y*10)) 37 geom = MultiLineString([lines]) 38 write_file(args, geom) 39 40 41 def rectangle(args): 42 line = LineString(( 43 (args.bounds[0], args.bounds[1]), 44 (args.bounds[0], args.bounds[3]), 45 (args.bounds[2], args.bounds[3]), 46 (args.bounds[2], args.bounds[1]), 47 (args.bounds[0], args.bounds[1]), 48 )) 49 write_file(args, MultiLineString([line])) 50 51 52 def parse_args(): 53 parser = argparse.ArgumentParser() 54 parser.add_argument('-o', '--outfile', metavar='<file>', required=True) 55 subparsers = parser.add_subparsers() 56 sine = subparsers.add_parser('sine', help='Sine wave') 57 sine.add_argument('--numwaves', choices=[1, 2], type=int, help='Number of waves') 58 sine.set_defaults(func=sinewave) 59 rect = subparsers.add_parser('rect', help='Rectangle') 60 rect.add_argument('--bounds', type=float, nargs=4, metavar=BOUNDS) 61 rect.set_defaults(func=rectangle) 62 return parser.parse_args() 63 64 65 if __name__ == '__main__': 66 args = parse_args() 67 args.func(args)