NASA Logo
Ocean Color Science Software

ocssw V2022
georegion_gen.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 import datetime
3 import geopandas
4 import rasterio
5 import rasterio.mask
6 import argparse
7 import numpy as np
8 import netCDF4 as nc
9 import sys
10 import os
11 from typing import List
12 VERSION = "v.1.0.2"
13 PROGRAM = "georegion_gen"
14 
15 running_time = datetime.datetime.now()
16 RUNNING_TIME = running_time.strftime("%Y-%m-%dT%H%M%S")
17 
18 
19 def read_wkt_file(path_wkt: str):
20  with open(path_wkt) as f:
21  wkts = f.read().splitlines()
22  return geopandas.GeoSeries.from_wkt(wkts)
23 
24 
25 def generate_georegion(inp_shapefiles: List[str], out_netcdf: str, stepsize: float, **kwargs):
26  poly = []
27  if "wkt" in kwargs:
28  if kwargs["wkt"]:
29  for inp_shapefile in inp_shapefiles:
30  shape_data = read_wkt_file(inp_shapefile)
31  for geom in shape_data.geometry:
32  poly.append(geom)
33  else:
34  for inp_shapefile in inp_shapefiles:
35  shape_data = geopandas.read_file(inp_shapefile)
36  for geom in shape_data.geometry:
37  poly.append(geom)
38  poly = geopandas.GeoSeries(poly)
39  west_lon = np.min(poly.bounds["minx"][:])
40  east_lon = np.max(poly.bounds["maxx"][:])
41  north_lat = np.max(poly.bounds["maxy"][:])
42  south_lat = np.min(poly.bounds["miny"][:])
43  if "global_set" in kwargs:
44  if kwargs["global_set"]:
45  west_lon = -180.0
46  east_lon = 180.0
47  north_lat = 90.0
48  south_lat = -90.0
49  scale_y = stepsize
50  scale_x = scale_y
51  xsize = int((east_lon - west_lon) / scale_x) + 1
52  ysize = int((north_lat - south_lat) / scale_y) + 1
53  shift_x_array = np.linspace(west_lon, east_lon, xsize)
54  shift_y_array = np.linspace(north_lat, south_lat, ysize)
55  trs = rasterio.transform.from_origin(west_lon, north_lat, scale_x, scale_y)
56  img = rasterio.features.rasterize(
57  poly, transform=trs, out_shape=(ysize, xsize))
58  print(
59  f"Generated georegion with shape {img.shape} along (lat,lon). Saving to {out_netcdf}")
60  with nc.Dataset(out_netcdf, "w") as georegion:
61  georegion.version = VERSION
62  georegion.program = PROGRAM
63  georegion.date_created = RUNNING_TIME
64  if "location" in kwargs and not kwargs["location"] is None:
65  georegion.location = kwargs["location"]
66  georegion.createDimension('lat', ysize)
67  georegion.createDimension('lon', xsize)
68  georegion_var = georegion.createVariable(varname='georegion', datatype=np.int8, dimensions=('lat', 'lon'), zlib=True,
69  chunksizes=(432, 864), fill_value=-128)
70  lat_var = georegion.createVariable(
71  varname='lat', datatype=np.float64, dimensions='lat', zlib=True, chunksizes=(432,), fill_value=-32767)
72  lon_var = georegion.createVariable(
73  varname='lon', datatype=np.float64, dimensions='lon', zlib=True, chunksizes=(864,), fill_value=-32767)
74  georegion_var[:] = img
75  lat_var[:] = shift_y_array
76  lon_var[:] = shift_x_array
77 
78  lon_var.standard_name = "longitude"
79  lon_var.long_name = "longitude"
80  lon_var.units = "degrees_east"
81  lon_var.axis = "X"
82 
83  lat_var.standard_name = "latitude"
84  lon_var.long_name = "latitude"
85  lat_var.units = "degrees_north"
86  lat_var.axis = "Y"
87 
88  georegion_var.long_name = "geographical_binary_mask"
89  georegion_var.description = "Binary mask for masking out a specific earth domain "
90  georegion_var.comment = "0 = outside, 1 = inside the region"
91  georegion_var.valid_min = 0
92  georegion_var.valid_max = 1
93  # print global attributes
94  georegion.Conventions = "CF-1.8 ACDD-1.3"
95  georegion.license = "https://science.nasa.gov/earth-science/earth-science-data/data-information-policy/"
96  georegion.naming_authority = "gov.nasa.gsfc.sci.oceandata"
97  georegion.keywords_vocabulary = "NASA Global Change Master Directory (GCMD) Science Keywords"
98  georegion.standard_name_vocabulary = "CF Standard Name Table v79"
99  georegion.creator_name = "NASA/GSFC/OBPG"
100  georegion.creator_email = "data@oceancolor.gsfc.nasa.gov"
101  georegion.creator_url = "https://oceancolor.gsfc.nasa.gov"
102  georegion.project = "Ocean Biology Processing Group"
103  georegion.publisher_name = "NASA/GSFC/OB.DAAC"
104  georegion.publisher_email = "data@oceancolor.gsfc.nasa.gov"
105  georegion.publisher_url = "https://oceancolor.gsfc.nasa.gov"
106  georegion.institution = "NASA Goddard Space Flight Center, Ocean Biology Processing Group"
107  georegion.product_name = os.path.basename(out_netcdf)
108  georegion.history = " ".join(sys.argv)
109  georegion.geospatial_lat_min = south_lat
110  georegion.geospatial_lat_max = north_lat
111  georegion.geospatial_lon_min = west_lon
112  georegion.geospatial_lon_max = east_lon
113  georegion.geospatial_lat_units = "degrees_north"
114  georegion.geospatial_lon_units = "degrees_east"
115  georegion.geospatial_lat_resolution = scale_y
116  georegion.geospatial_lon_resolution = scale_x
117  georegion.grid_mapping_name = "latitude_longitude"
118  print("done")
119 
120 
121 if __name__ == "__main__":
122  print(PROGRAM, VERSION)
123  parser = argparse.ArgumentParser()
124  parser.add_argument(
125  "--ifiles", help="input shape files", type=str, required=True, nargs='+')
126  parser.add_argument(
127  "--ofile", help="output georegion file", type=str, required=True)
128  parser.add_argument(
129  "--stepsize", help="stepsize along latitude", type=float, default=1.0 / 16.0 / 16.0)
130  # parser.add_argument(
131  # "--location", help="name of the geographic area", type=str)
132  parser.add_argument(
133  "--pversion", help="pversion", type=str, default="V11")
134  parser.add_argument(
135  "--global_set", help="global coverage", type=bool, default=False)
136  parser.add_argument(
137  "--wkt", help="indicate that input files are ASCII files which contains WKT strings", type=bool, default=False)
138  if len(sys.argv) == 1:
139  parser.print_help()
140  sys.exit(0)
141  print("You are running {}, version {}. Current time is {}".format(
142  PROGRAM, VERSION, running_time))
143  args = parser.parse_args()
144  # "data/iho/iho.shp" # atlantic ocean. https://www.marineregions.org/gazetteer.php?p=details&id=1912
145  shapefile_path = args.ifiles
146  stepsize = args.stepsize
147  out_nc = args.ofile # "data/georegion_atlantic.nc"
148  generate_georegion(shapefile_path, out_nc, stepsize,
149  global_set=args.global_set, wkt=args.wkt)
def read_wkt_file(str path_wkt)
void print(std::ostream &stream, const char *format)
Definition: PrintDebug.hpp:38
def generate_georegion(List[str] inp_shapefiles, str out_netcdf, float stepsize, **kwargs)