stud

study spacejunk
Log | Files | Refs | LICENSE

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)