33from collections .abc import Callable
44from pathlib import Path
55
6- import xarray
7-
86import emsarray
97from emsarray .cli import BaseCommand , CommandException
108from emsarray .operations import geometry
11- from emsarray .types import Pathish
129
1310logger = logging .getLogger (__name__ )
1411
15- Writer = Callable [[ xarray . Dataset , Pathish ], None ]
16- format_writers : dict [str , Writer ] = {
12+
13+ format_writers : dict [str , Callable ] = {
1714 'geojson' : geometry .write_geojson ,
1815 'shapefile' : geometry .write_shapefile ,
1916 'wkt' : geometry .write_wkt ,
@@ -46,6 +43,14 @@ def add_arguments(self, parser: argparse.ArgumentParser) -> None:
4643 "The output format will be guessed using the output extension by default"
4744 ))
4845
46+ parser .add_argument (
47+ "-g" , "--grid-kind" , type = str ,
48+ default = None ,
49+ help = (
50+ "Grid kind to export. Will export the default grid if not specified."
51+ ),
52+ )
53+
4954 def guess_format (self , output_path : Path ) -> str :
5055 extension = output_path .suffix
5156 if extension in {'.json' , '.geojson' }:
@@ -69,13 +74,31 @@ def handle(self, options: argparse.Namespace) -> None:
6974 output_format = self .guess_format (output_path )
7075 logger .debug ("Guessed output format as %r" , output_format )
7176
72- count = dataset .ems .polygons [dataset .ems .mask ].size
73- logger .debug ("Dataset contains %d polygons" , count )
77+ if options .grid_kind is None :
78+ grid_kind = dataset .ems .default_grid_kind
79+ else :
80+ grid_kind_names = {str (grid_kind ): grid_kind for grid_kind in dataset .ems .grid_kinds }
81+ try :
82+ grid_kind = grid_kind_names [options .grid_kind ]
83+ except KeyError :
84+ grid_kind_choices = ", " .join (grid_kind_names .keys ())
85+ raise CommandException (
86+ f"Unknown grid kind { options .grid_kind !r} . "
87+ f"Valid choices are: { grid_kind_choices } ."
88+ )
7489
7590 try :
7691 writer = format_writers [output_format ]
7792 except KeyError :
7893 raise CommandException (f"Unknown output format { output_format !r} " )
7994
95+ grid = dataset .ems .grids [grid_kind ]
96+ geometries = grid .geometry [grid .mask ]
97+ count = geometries .size
98+
99+ logger .debug ("Grid kind: %s" , grid_kind )
100+ logger .debug ("Geometry type: %s" , grid .geometry_type .__name__ )
101+ logger .debug ("Geometry count: %d" , count )
80102 logger .debug ("Exporting geometry as %r" , output_format )
81- writer (dataset , output_path )
103+
104+ writer (dataset , output_path , grid_kind = grid_kind )
0 commit comments