diff --git a/CHANGELOG.md b/CHANGELOG.md index 33173900550c7df06bb01cb489c6d2e3709c2dea..8e436e954a505bd9c676eb24b16fd3079883e34b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ * Function to_shapefile() to create shapefiles from a NES object without losing data from the original grid and being able to select the time and level. * Function from_shapefile() to create a new grid with data from a shapefile after doing a spatial join. * Function create_shapefile() can now be used in parallel. + * Function calculate_grid_area() to calculate the area of each cell in a grid. + * Function calculate_geometry_area() to calculate the area of each cell given a set of geometries. * Bugs fixing: * Correct the dimensions of the resulting points datasets from any interpolation. * Amend the interpolation method to take into account the cases in which the distance among points equals zero. diff --git a/nes/__init__.py b/nes/__init__.py index 13543cff291da0fa8fbcad12a0f3bec500aa8a01..625d722e7839209b9eaeede4a00b786605269ff5 100644 --- a/nes/__init__.py +++ b/nes/__init__.py @@ -4,3 +4,4 @@ __version__ = "1.0.1" from .load_nes import open_netcdf, concatenate_netcdfs from .create_nes import create_nes, from_shapefile from .nc_projections import * +from .methods.cell_measures import calculate_geometry_area \ No newline at end of file diff --git a/nes/methods/cell_measures.py b/nes/methods/cell_measures.py new file mode 100644 index 0000000000000000000000000000000000000000..d701cc42766611512cff007ca65e97c3244206c0 --- /dev/null +++ b/nes/methods/cell_measures.py @@ -0,0 +1,274 @@ +#!/usr/bin/env python + +import numpy as np +from copy import deepcopy + + +def calculate_grid_area(self): + """ + Get coordinate bounds and call function to calculate the area of each cell of a grid. + + Parameters + ---------- + self : nes.Nes + Source projection Nes Object. + """ + + # Create bounds if they do not exist + if self._lat_bnds is None or self._lon_bnds is None: + self.create_spatial_bounds() + + # Get spatial number of vertices + spatial_nv = self.lat_bnds['data'].shape[-1] + + # Reshape bounds + if spatial_nv == 2: + + aux_shape = (self.lat_bnds['data'].shape[0], self.lon_bnds['data'].shape[0], 4) + lon_bnds_aux = np.empty(aux_shape) + lon_bnds_aux[:, :, 0] = self.lon_bnds['data'][np.newaxis, :, 0] + lon_bnds_aux[:, :, 1] = self.lon_bnds['data'][np.newaxis, :, 1] + lon_bnds_aux[:, :, 2] = self.lon_bnds['data'][np.newaxis, :, 1] + lon_bnds_aux[:, :, 3] = self.lon_bnds['data'][np.newaxis, :, 0] + + lon_bnds = lon_bnds_aux + del lon_bnds_aux + + lat_bnds_aux = np.empty(aux_shape) + lat_bnds_aux[:, :, 0] = self.lat_bnds['data'][:, np.newaxis, 0] + lat_bnds_aux[:, :, 1] = self.lat_bnds['data'][:, np.newaxis, 0] + lat_bnds_aux[:, :, 2] = self.lat_bnds['data'][:, np.newaxis, 1] + lat_bnds_aux[:, :, 3] = self.lat_bnds['data'][:, np.newaxis, 1] + + lat_bnds = lat_bnds_aux + del lat_bnds_aux + + else: + lon_bnds = self.lon_bnds['data'] + lat_bnds = self.lat_bnds['data'] + + # Reshape bounds and assign as grid corner coordinates + grid_corner_lon = deepcopy(lon_bnds).reshape(lon_bnds.shape[0]*lon_bnds.shape[1], + lon_bnds.shape[2]) + grid_corner_lat = deepcopy(lat_bnds).reshape(lat_bnds.shape[0]*lat_bnds.shape[1], + lat_bnds.shape[2]) + + # Calculate cell areas + grid_area = calculate_cell_area(grid_corner_lon, grid_corner_lat, + earth_radius_minor_axis=self.earth_radius[0], + earth_radius_major_axis=self.earth_radius[1]) + + return grid_area + + +def calculate_geometry_area(geometry_list, earth_radius_minor_axis=6356752.3142, + earth_radius_major_axis=6378137.0): + """ + Get coordinate bounds and call function to calculate the area of each cell of a set of geometries. + + Parameters + ---------- + geometry_list : list + List with polygon geometries. + earth_radius_minor_axis : float + Radius of the minor axis of the Earth. + earth_radius_major_axis : float + Radius of the major axis of the Earth. + """ + + # Get coordinate bounds from polygons + geometry_corner_lon, geometry_corner_lat = get_bnds_from_polygon(geometry_list) + + # Calculate cell areas + geometry_area = calculate_cell_area(geometry_corner_lon, geometry_corner_lat, + earth_radius_minor_axis=earth_radius_minor_axis, + earth_radius_major_axis=earth_radius_major_axis) + + return geometry_area + + +def get_bnds_from_polygon(geometry_list): + """ + Get coordinate bounds from of a set of geometries. + + Parameters + ---------- + geometry_list : list + List with polygon geometries. + """ + + if geometry_list is not None: + + # Extract the point values that define the perimeter of the polygon + lon_bnds, lat_bnds = geometry_list[0].exterior.coords.xy + for poly_ind in range(1, len(geometry_list)): + poly_lon_bnds, poly_lat_bnds = geometry_list[poly_ind].exterior.coords.xy + lon_bnds = np.vstack((lon_bnds, np.array(poly_lon_bnds))) + lat_bnds = np.vstack((lat_bnds, np.array(poly_lat_bnds))) + + return lon_bnds, lat_bnds + + else: + + return None + + +def calculate_cell_area(grid_corner_lon, grid_corner_lat, + earth_radius_minor_axis=6356752.3142, + earth_radius_major_axis=6378137.0): + """ + Calculate the area of each cell of a grid. + + Parameters + ---------- + grid_corner_lon : np.array + Array with longitude bounds of grid. + grid_corner_lat : np.array + Array with longitude bounds of grid. + earth_radius_minor_axis : float + Radius of the minor axis of the Earth. + earth_radius_major_axis : float + Radius of the major axis of the Earth. + """ + + # Calculate area for each grid cell + n_cells = grid_corner_lon.shape[0] + area = np.empty(shape=(n_cells,)) + for i in range(0, n_cells): + area[i] = mod_huiliers_area(grid_corner_lon[i], grid_corner_lat[i]) + + return area*earth_radius_minor_axis*earth_radius_major_axis + + +def mod_huiliers_area(cell_corner_lon, cell_corner_lat): + """ + Calculate the area of each cell according to Huilier's theorem. + Reference: CDO (https://earth.bsc.es/gitlab/ces/cdo/) + + Parameters + ---------- + cell_corner_lon : np.array + Longitude boundaries of each cell + cell_corner_lat : np.array + Latitude boundaries of each cell + """ + + sum = 0 + + # Get points 0 (bottom left) and 1 (bottom right) in Earth coordinates + point_0 = lon_lat_to_cartesian(cell_corner_lon[0], cell_corner_lat[0], earth_radius_major_axis=1) + point_1 = lon_lat_to_cartesian(cell_corner_lon[1], cell_corner_lat[1], earth_radius_major_axis=1) + point_0, point_1 = point_0[0], point_1[0] + + # Get number of vertices + if cell_corner_lat[0] == cell_corner_lat[-1]: + spatial_nv = len(cell_corner_lon) - 1 + else: + spatial_nv = len(cell_corner_lon) + + for i in range(2, spatial_nv): + + # Get point 2 (top right) in Earth coordinates + point_2 = lon_lat_to_cartesian(cell_corner_lon[i], cell_corner_lat[i], earth_radius_major_axis=1) + point_2 = point_2[0] + + # Calculate area of triangle between points 0, 1 and 2 + sum += tri_area(point_0, point_1, point_2) + + # Copy to calculate area of next triangle + if i == (spatial_nv - 1): + point_1 = deepcopy(point_2) + + return sum + + +def tri_area(point_0, point_1, point_2): + """ + Calculate area between three points that form a triangle. + Reference: CDO (https://earth.bsc.es/gitlab/ces/cdo/) + + Parameters + ---------- + point_0 : np.array + Position of first point in cartesian coordinates. + point_1 : np.array + Position of second point in cartesian coordinates. + point_2 : np.array + Position of third point in cartesian coordinates. + """ + + # Get length of side a (between point 0 and 1) + tmp_vec = cross_product(point_0, point_1) + sina = norm(tmp_vec) + a = np.arcsin(sina) + + # Get length of side b (between point 0 and 2) + tmp_vec = cross_product(point_0, point_2) + sinb = norm(tmp_vec) + b = np.arcsin(sinb) + + # Get length of side c (between point 1 and 2) + tmp_vec = cross_product(point_2, point_1) + sinc = norm(tmp_vec) + c = np.arcsin(sinc) + + # Calculate area + s = 0.5*(a+b+c) + t = np.tan(s*0.5) * np.tan((s - a)*0.5) * np.tan((s - b)*0.5) * np.tan((s - c)*0.5) + area = np.fabs(4.0 * np.arctan(np.sqrt(np.fabs(t)))) + + return area + + +def cross_product(a, b): + """ + Calculate cross product between two points. + + Parameters + ---------- + a : np.array + Position of point a in cartesian coordinates. + b : np.array + Position of point b in cartesian coordinates. + """ + + return [a[1]*b[2] - a[2]*b[1], + a[2]*b[0] - a[0]*b[2], + a[0]*b[1] - a[1]*b[0]] + + +def norm(cp): + """ + Normalize the result of the cross product operation. + + Parameters + ---------- + cp : np.array + Cross product between two points. + """ + + return np.sqrt(cp[0]*cp[0] + cp[1]*cp[1] + cp[2]*cp[2]) + + +def lon_lat_to_cartesian(lon, lat, earth_radius_major_axis=6378137.0): + """ + Calculate lon, lat coordinates of a point on a sphere. + + Parameters + ---------- + lon : np.array + Longitude values. + lat : np.array + Latitude values. + earth_radius_major_axis : float + Radius of the major axis of the Earth. + """ + + lon_r = np.radians(lon) + lat_r = np.radians(lat) + + x = earth_radius_major_axis * np.cos(lat_r) * np.cos(lon_r) + y = earth_radius_major_axis * np.cos(lat_r) * np.sin(lon_r) + z = earth_radius_major_axis * np.sin(lat_r) + + return np.column_stack([x, y, z]) diff --git a/nes/methods/horizontal_interpolation.py b/nes/methods/horizontal_interpolation.py index b5d5d185b5402e270c2db2658983361b910defcb..8f480345426e6ef8e3bc64a32a763125356264c5 100644 --- a/nes/methods/horizontal_interpolation.py +++ b/nes/methods/horizontal_interpolation.py @@ -10,7 +10,6 @@ from scipy import spatial from filelock import FileLock from datetime import datetime from warnings import warn -import pyproj def interpolate_horizontal(self, dst_grid, weight_matrix_path=None, kind='NearestNeighbour', n_neighbours=4, @@ -391,12 +390,8 @@ def create_nn_weight_matrix(self, dst_grid, n_neighbours=4, info=False): # model geographic longitude/latitude coordinates are first converted # to cartesian ECEF (Earth Centred, Earth Fixed) coordinates, before # calculating distances. - - # src_mod_xy = lon_lat_to_cartesian(src_lon.flatten(), src_lat.flatten()) - # dst_mod_xy = lon_lat_to_cartesian(dst_lon.flatten(), dst_lat.flatten()) - - src_mod_xy = lon_lat_to_cartesian_ecef(src_lon.flatten(), src_lat.flatten()) - dst_mod_xy = lon_lat_to_cartesian_ecef(dst_lon.flatten(), dst_lat.flatten()) + src_mod_xy = self.lon_lat_to_cartesian_ecef(src_lon.flatten(), src_lat.flatten()) + dst_mod_xy = self.lon_lat_to_cartesian_ecef(dst_lon.flatten(), dst_lat.flatten()) # generate KDtree using model 1 coordinates (i.e. the model grid you are # interpolating from) @@ -430,56 +425,3 @@ def create_nn_weight_matrix(self, dst_grid, n_neighbours=4, info=False): weight_matrix._lev = {'data': np.arange(inverse_dists_transf.shape[1]), 'units': ''} return weight_matrix - - -def lon_lat_to_cartesian(lon, lat, radius=6378137.0): - """ - Calculate lon, lat coordinates of a point on a sphere. - - DEPRECATED!!!! - - Parameters - ---------- - lon : np.array - Longitude values. - lat : np.array - Latitude values. - radius : float - Radius of the sphere to get the distances. - """ - - lon_r = np.radians(lon) - lat_r = np.radians(lat) - - x = radius * np.cos(lat_r) * np.cos(lon_r) - y = radius * np.cos(lat_r) * np.sin(lon_r) - z = radius * np.sin(lat_r) - - return np.column_stack([x, y, z]) - - -def lon_lat_to_cartesian_ecef(lon, lat): - """ - # convert observational/model geographic longitude/latitude coordinates to cartesian ECEF (Earth Centred, - # Earth Fixed) coordinates, assuming WGS84 datum and ellipsoid, and that all heights = 0. - # ECEF coordiantes represent positions (in meters) as X, Y, Z coordinates, approximating the earth surface - # as an ellipsoid of revolution. - # This conversion is for the subsequent calculation of euclidean distances of the model gridcell centres - # from each observational station. - # Defining the distance between two points on the earth's surface as simply the euclidean distance - # between the two lat/lon pairs could lead to inaccurate results depending on the distance - # between two points (i.e. 1 deg. of longitude varies with latitude). - - Parameters - ---------- - lon : np.array - Longitude values. - lat : np.array - Latitude values. - """ - lla = pyproj.Proj(proj='latlong', ellps='WGS84', datum='WGS84') - ecef = pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84') - - x, y, z = pyproj.transform(lla, ecef, lon, lat, np.zeros(lon.shape), radians=False) - - return np.column_stack([x, y, z]) diff --git a/nes/nc_projections/default_nes.py b/nes/nc_projections/default_nes.py index 06c8ce76ce1709ab1e444adfe85703a83ebbeef2..5fe43ca393bcfaec8221cb2e3f388da948b855cb 100644 --- a/nes/nc_projections/default_nes.py +++ b/nes/nc_projections/default_nes.py @@ -16,8 +16,10 @@ import geopandas as gpd from shapely.geometry import Polygon from copy import deepcopy, copy import datetime +import pyproj from ..methods import vertical_interpolation from ..methods import horizontal_interpolation +from ..methods import cell_measures from ..nes_formats import to_netcdf_cams_ra from ..nc_projections import * @@ -155,6 +157,9 @@ class Nes(object): # Define parallel method self.parallel_method = parallel_method + # Get minor and major axes of Earth + self.earth_radius = self.get_earth_radius('WGS84') + # NetCDF object if create_nes: @@ -182,6 +187,9 @@ class Nes(object): self.lev = deepcopy(self._lev) self.lat_bnds, self.lon_bnds = self._lat_bnds, self._lon_bnds + # Cell measures screening + self.cell_measures = self.__get_cell_measures(create_nes) + # Set NetCDF attributes self.global_attrs = self.__get_global_attributes(create_nes) @@ -213,6 +221,9 @@ class Nes(object): self._lon = self._get_coordinate_dimension(['lon', 'longitude']) self._lat_bnds, self._lon_bnds = self.__get_coordinates_bnds() + # Complete cell measures + self._cell_measures = self.__get_cell_measures() + # Set axis limits for parallel reading self.read_axis_limits = self.get_read_axis_limits() @@ -225,6 +236,9 @@ class Nes(object): self.lat_bnds = self._get_coordinate_values(self._lat_bnds, 'Y', bounds=True) self.lon_bnds = self._get_coordinate_values(self._lon_bnds, 'X', bounds=True) + # Cell measures screening + self.cell_measures = self._get_cell_measures_values(self._cell_measures) + # Set axis limits for parallel writing self.write_axis_limits = self.get_write_axis_limits() @@ -482,8 +496,7 @@ class Nes(object): inc : float Increment between centre values. spatial_nv : int - Non mandatory parameter that informs the number of vertices that must have the - boundaries. Default: 2. + Non mandatory parameter that informs the number of vertices that the boundaries must have. Default: 2. inverse : bool For some grid latitudes. @@ -976,10 +989,8 @@ class Nes(object): """ if self.balanced: - print("balance") return self.get_read_axis_limits_balanced() else: - print("unbalance") return self.get_read_axis_limits_unbalanced() def get_read_axis_limits_unbalanced(self): @@ -999,7 +1010,6 @@ class Nes(object): 't_min': None, 't_max': None} idx = self.get_idx_intervals() - print("IDX", idx) if self.parallel_method == 'Y': y_len = idx['idx_y_max'] - idx['idx_y_min'] @@ -1066,7 +1076,7 @@ class Nes(object): else: self.last_level += 1 axis_limits['z_max'] = self.last_level - print("Rank {0:03d}: Axis limits: {1}".format(self.rank, axis_limits)) + return axis_limits def get_read_axis_limits_balanced(self): @@ -1485,6 +1495,33 @@ class Nes(object): return lat_bnds, lon_bnds + def __get_cell_measures(self, create_nes=False): + """ + Get the NetCDF cell measures values. + + Parameters + ---------- + create_nes : bool + Indicates if you want to create the object from scratch (True) or through an existing file. + + Returns + ------- + cell_measures : dict + Dictionary of cell measures of the NetCDF data. + """ + + cell_measures = {} + if self.master: + if not create_nes: + if 'cell_area' in self.netcdf.variables.keys(): + cell_measures['cell_area'] = {} + cell_measures['cell_area']['data'] = self.netcdf.variables['cell_area'][:] + cell_measures = self.comm.bcast(cell_measures, root=0) + + self.free_vars(['cell_area']) + + return cell_measures + def _get_coordinate_dimension(self, possible_names): """ Read the coordinate dimension data. @@ -1552,12 +1589,13 @@ class Nes(object): coordinate_len = len(values['data'].shape) if bounds: coordinate_len -= 1 - + if coordinate_axis == 'Y': if coordinate_len == 1: values['data'] = values['data'][self.read_axis_limits['y_min']:self.read_axis_limits['y_max']] elif coordinate_len == 2: - values['data'] = values['data'][self.read_axis_limits['y_min']:self.read_axis_limits['y_max'], self.read_axis_limits['x_min']:self.read_axis_limits['x_max']] + values['data'] = values['data'][self.read_axis_limits['y_min']:self.read_axis_limits['y_max'], + self.read_axis_limits['x_min']:self.read_axis_limits['x_max']] else: raise NotImplementedError("The coordinate has wrong dimensions: {dim}".format( dim=values['data'].shape)) @@ -1565,7 +1603,8 @@ class Nes(object): if coordinate_len == 1: values['data'] = values['data'][self.read_axis_limits['x_min']:self.read_axis_limits['x_max']] elif coordinate_len == 2: - values['data'] = values['data'][self.read_axis_limits['y_min']:self.read_axis_limits['y_max'], self.read_axis_limits['x_min']:self.read_axis_limits['x_max']] + values['data'] = values['data'][self.read_axis_limits['y_min']:self.read_axis_limits['y_max'], + self.read_axis_limits['x_min']:self.read_axis_limits['x_max']] else: raise NotImplementedError("The coordinate has wrong dimensions: {dim}".format( dim=values['data'].shape)) @@ -1578,6 +1617,44 @@ class Nes(object): return values + def _get_cell_measures_values(self, cell_measures_info): + """ + Get the cell measures data of the current portion. + + Parameters + ---------- + cell_measures_info : dict, list + Dictionary with the 'data' key with the cell measures variable values. and the attributes as other keys. + + Returns + ------- + values : dict + Dictionary with the portion of data corresponding to the rank. + """ + + if cell_measures_info is None: + return None + + cell_measures_values = {} + + for cell_measures_var in cell_measures_info.keys(): + + values = deepcopy(cell_measures_info[cell_measures_var]) + coordinate_len = len(values['data'].shape) + + if coordinate_len == 1: + values['data'] = values['data'][self.read_axis_limits['x_min']:self.read_axis_limits['x_max']] + elif coordinate_len == 2: + values['data'] = values['data'][self.read_axis_limits['y_min']:self.read_axis_limits['y_max'], + self.read_axis_limits['x_min']:self.read_axis_limits['x_max']] + else: + raise NotImplementedError("The coordinate has wrong dimensions: {dim}".format( + dim=values['data'].shape)) + + cell_measures_values[cell_measures_var] = values + + return cell_measures_values + def _get_lazy_variables(self): """ Get all the variables information. @@ -1678,7 +1755,7 @@ class Nes(object): Parameters ---------- - var_list : list, str + var_list : list, str, None List (or single string) of the variables to be loaded. """ @@ -2014,6 +2091,24 @@ class Nes(object): return None + def _create_cell_measures(self, netcdf): + + # CELL AREA + if 'cell_area' in self.cell_measures.keys(): + cell_area = netcdf.createVariable('cell_area', np.float64, self._var_dim, + zlib=self.zip_lvl > 0, complevel=self.zip_lvl) + if self.size > 1: + cell_area.set_collective(True) + cell_area[self.write_axis_limits['y_min']:self.write_axis_limits['y_max'], + self.write_axis_limits['x_min']:self.write_axis_limits['x_max']] = self.cell_measures['cell_area']['data'] + + cell_area.long_name = 'area of grid cell' + cell_area.standard_name = 'cell_area' + cell_area.units = 'm2' + + for var_name in self.variables.keys(): + self.variables[var_name]['cell_measures'] = 'area: cell_area' + def _create_variables(self, netcdf, chunking=False): """ Create the netCDF file variables. @@ -2167,6 +2262,11 @@ class Nes(object): if self.info: print("Rank {0:03d}: Dimensions done".format(self.rank)) + # Create cell measures + self._create_cell_measures(netcdf) + if self.info: + print("Rank {0:03d}: Cell measures done".format(self.rank)) + # Create variables self._create_variables(netcdf, chunking=chunking) @@ -2456,7 +2556,7 @@ class Nes(object): Time stamp to select. lev : int Vertical level to select. - var_list : list, str + var_list : list, str, None List (or single string) of the variables to be loaded and saved in the shapefile. """ @@ -2510,7 +2610,7 @@ class Nes(object): """ Add variables data to shapefile. - var_list : list, str + var_list : list List (or single string) of the variables to be loaded and saved in the shapefile. idx_lev : int Index of vertical level for which the data will be saved in the shapefile. @@ -2533,8 +2633,8 @@ class Nes(object): File or path from where the data will be obtained on the intersection. method : str Overlay method. Accepted values: ['nearest', 'intersection', 'centroid']. - var_list : list, None - + var_list : list, str, None + Variables list. """ if isinstance(shapefile, str): @@ -2573,7 +2673,7 @@ class Nes(object): axis=1, ignore_index=True) intersection.columns = (list(self.shapefile.geometry[inp].reset_index().columns) + list(shapefile.geometry[res].reset_index().rename(columns={'geometry': 'geometry_shapefile', - 'index': 'index_shapefile'}).columns)) + 'index': 'index_shapefile'}).columns)) intersection['area'] = intersection.apply(lambda x: x['geometry'].intersection(x['geometry_shapefile']).buffer(0).area, axis=1) intersection['fraction'] = intersection.apply(lambda x: x['area'] / x['geometry'].area, axis=1) @@ -2766,6 +2866,32 @@ class Nes(object): # ================================================================================================================== # Extra Methods # ================================================================================================================== + + def lon_lat_to_cartesian_ecef(self, lon, lat): + """ + # Convert observational/model geographic longitude/latitude coordinates to cartesian ECEF (Earth Centred, + # Earth Fixed) coordinates, assuming WGS84 datum and ellipsoid, and that all heights = 0. + # ECEF coordiantes represent positions (in meters) as X, Y, Z coordinates, approximating the earth surface + # as an ellipsoid of revolution. + # This conversion is for the subsequent calculation of euclidean distances of the model gridcell centres + # from each observational station. + # Defining the distance between two points on the earth's surface as simply the euclidean distance + # between the two lat/lon pairs could lead to inaccurate results depending on the distance + # between two points (i.e. 1 deg. of longitude varies with latitude). + + Parameters + ---------- + lon : np.array + Longitude values. + lat : np.array + Latitude values. + """ + + lla = pyproj.Proj(proj='latlong', ellps='WGS84', datum='WGS84') + ecef = pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84') + x, y, z = pyproj.transform(lla, ecef, lon, lat, np.zeros(lon.shape), radians=False) + + return np.column_stack([x, y, z]) def add_4d_vertical_info(self, info_to_add): """ @@ -2826,3 +2952,54 @@ class Nes(object): return horizontal_interpolation.interpolate_horizontal( self, dst_grid, weight_matrix_path=weight_matrix_path, kind=kind, n_neighbours=n_neighbours, info=info, to_providentia=to_providentia) + + def calculate_grid_area(self): + """ + Get coordinate bounds and call function to calculate the area of each cell of a grid. + + Parameters + ---------- + self : nes.Nes + Source projection Nes Object. + """ + + grid_area = cell_measures.calculate_grid_area(self) + self.cell_measures['cell_area'] = {'data': grid_area.reshape([self.lon_bnds['data'].shape[0], + self.lon_bnds['data'].shape[1]])} + + return None + + @staticmethod + def calculate_geometry_area(geometry_list, earth_radius_minor_axis=6356752.3142, + earth_radius_major_axis=6378137.0): + """ + Get coordinate bounds and call function to calculate the area of each cell of a set of geometries. + + Parameters + ---------- + geometry_list : list + List with polygon geometries. + earth_radius_minor_axis : float + Radius of the minor axis of the Earth. + earth_radius_major_axis : float + Radius of the major axis of the Earth. + """ + + return cell_measures.calculate_geometry_area(geometry_list, earth_radius_minor_axis=earth_radius_minor_axis, + earth_radius_major_axis=earth_radius_major_axis) + + @staticmethod + def get_earth_radius(ellps): + """ + Get minor and major axis of Earth. + + Parameters + ---------- + ellps : str + Spatial reference system. + """ + + # WGS84 with radius defined in Cartopy source code + earth_radius_dict = {'WGS84': [6356752.3142, 6378137.0]} + + return earth_radius_dict[ellps] \ No newline at end of file diff --git a/nes/nc_projections/lcc_nes.py b/nes/nc_projections/lcc_nes.py index 8ae1795cd6d2a3841bd134c617a661d313b7ebab..4cf7e8b37d2cf4190042e57489597b446c15f630 100644 --- a/nes/nc_projections/lcc_nes.py +++ b/nes/nc_projections/lcc_nes.py @@ -259,7 +259,7 @@ class LCCNes(Nes): self.projection = Proj( proj='lcc', ellps='WGS84', - R=6356752.3142, # WGS84_SEMIMINOR_AXIS (as defined in Cartopy source code) + R=self.earth_radius[0], lat_1=kwargs['lat_1'], lat_2=kwargs['lat_2'], lon_0=kwargs['lon_0'], @@ -267,7 +267,7 @@ class LCCNes(Nes): to_meter=1, x_0=0, y_0=0, - a=6378137.0, # WGS84_SEMIMAJOR_AXIS (as defined in Cartopy source code) + a=self.earth_radius[1], k_0=1.0 ) @@ -336,7 +336,7 @@ class LCCNes(Nes): self.projection = Proj( proj='lcc', ellps='WGS84', - R=6356752.3142, # WGS84_SEMIMINOR_AXIS (as defined in Cartopy source code) + R=self.earth_radius[0], lat_1=float(self.projection_data['standard_parallel'][0]), lat_2=float(self.projection_data['standard_parallel'][1]), lon_0=float(self.projection_data['longitude_of_central_meridian']), @@ -344,7 +344,7 @@ class LCCNes(Nes): to_meter=1, x_0=0, y_0=0, - a=6378137.0, # WGS84_SEMIMAJOR_AXIS (as defined in Cartopy source code) + a=self.earth_radius[1], k_0=1.0 ) grid_edge_lon_data, grid_edge_lat_data = self.projection(x_grid_edge, y_grid_edge, inverse=True) @@ -374,7 +374,7 @@ class LCCNes(Nes): self.projection = Proj( proj='lcc', ellps='WGS84', - R=6356752.3142, # WGS84_SEMIMINOR_AXIS (as defined in Cartopy source code) + R=self.earth_radius[0], lat_1=float(self.projection_data['standard_parallel'][0]), lat_2=float(self.projection_data['standard_parallel'][1]), lon_0=float(self.projection_data['longitude_of_central_meridian']), @@ -382,7 +382,7 @@ class LCCNes(Nes): to_meter=1, x_0=0, y_0=0, - a=6378137.0, # WGS84_SEMIMAJOR_AXIS (as defined in Cartopy source code) + a=self.earth_radius[1], k_0=1.0 ) lon_bnds, lat_bnds = self.projection(x_bnds, y_bnds, inverse=True) diff --git a/nes/nc_projections/mercator_nes.py b/nes/nc_projections/mercator_nes.py index 6acbf997f94b1cc68c480d7a042a2ada87a71c86..0722784a89a4463f25d38215f7a1ebd43369135e 100644 --- a/nes/nc_projections/mercator_nes.py +++ b/nes/nc_projections/mercator_nes.py @@ -256,8 +256,8 @@ class MercatorNes(Nes): self.projection = Proj( proj='merc', - a=6378137.0, # WGS84_SEMIMAJOR_AXIS (as defined in Cartopy source code) - b=6356752.3142, # WGS84_SEMIMINOR_AXIS (as defined in Cartopy source code) + a=self.earth_radius[1], + b=self.earth_radius[0], lat_ts=kwargs['lat_ts'], lon_0=kwargs['lon_0'], ) @@ -326,8 +326,8 @@ class MercatorNes(Nes): # Get edges for regular coordinates self.projection = Proj( proj='merc', - a=6378137.0, # WGS84_SEMIMAJOR_AXIS (as defined in Cartopy source code) - b=6356752.3142, # WGS84_SEMIMINOR_AXIS (as defined in Cartopy source code) + a=self.earth_radius[1], + b=self.earth_radius[0], lat_ts=float(self.projection_data['standard_parallel'][0]), lon_0=float(self.projection_data['longitude_of_projection_origin']), ) @@ -357,8 +357,8 @@ class MercatorNes(Nes): # Transform Mercator bounds to regular bounds self.projection = Proj( proj='merc', - a=6378137.0, # WGS84_SEMIMAJOR_AXIS (as defined in Cartopy source code) - b=6356752.3142, # WGS84_SEMIMINOR_AXIS (as defined in Cartopy source code) + a=self.earth_radius[1], + b=self.earth_radius[0], lat_ts=float(self.projection_data['standard_parallel'][0]), lon_0=float(self.projection_data['longitude_of_projection_origin']), ) diff --git a/tests/1-test_read_write_size.py b/tests/1-test_read_write_size.py deleted file mode 100644 index e545fadf190480843312c1797f9d0e10a1752d2e..0000000000000000000000000000000000000000 --- a/tests/1-test_read_write_size.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python -import timeit -import sys -from nes import * -import pandas as pd -# from mpi4py import MPI - -# test_list = [{'in_file': "/gpfs/scratch/bsc32/bsc32538/mr_multiplyby/original_file/MONARCH_d01_2008123100.nc", -# 'prefix': 'small'}, -# {'in_file': "/gpfs/scratch/bsc32/bsc32538/mr_multiplyby/original_file/MONARCH_d01_2021080212.nc", -# 'prefix': 'medium'}, -# {'in_file': "/gpfs/scratch/bsc32/bsc32538/mr_multiplyby/original_file/MONARCH_d01_2017123000.nc", -# 'prefix': 'large'}, -# ] -test_list = [{'in_file': "/gpfs/scratch/bsc32/bsc32538/mr_multiplyby/original_file/MONARCH_d01_2017123000.nc", - 'prefix': 'large'}, - ] -# parallel_method = 'X' -# parallel_method = 'Y' -parallel_method = 'T' - - -times = pd.DataFrame(index=[0]) -# size = MPI.COMM_WORLD.Get_size() - -for test in test_list: - # ====================================================================================================================== - - st_time = timeit.default_timer() - # ===== Reading - nessy = open_netcdf(path=test['in_file'], parallel_method=parallel_method) - size = nessy.size - if nessy.master: - print("\n=====", test['prefix'], "=====") - - nessy.keep_vars(['O3', 'T', 'U', 'V', 'layer_thickness']) - # nessy.keep_vars(['O3']) - # ===== END Reading - spent_time = timeit.default_timer() - st_time - if nessy.master: - print("Init time {0:02d}:{1:02.3f} (tot: {2:.3f} s)".format( - int(spent_time // 60), spent_time - (int(spent_time // 60) * 60), spent_time)) - sys.stdout.flush() - times["{0}_Init".format(test['prefix'])] = spent_time - - # ====================================================================================================================== - - st_time = timeit.default_timer() - # ===== Loading - nessy.load() - # ===== END Loading - spent_time = timeit.default_timer() - st_time - if nessy.master: - print("Loading time {min:02d}:{sec:02.3f} (tot: {tot:.3f} s ; var: {var:.3f}s/var)".format( - min=int(spent_time // 60), sec=spent_time - (int(spent_time // 60) * 60), - var=spent_time / len(nessy.variables.keys()), tot=spent_time)) - sys.stdout.flush() - times["{0}_Load".format(test['prefix'])] = spent_time - - # ====================================================================================================================== - - if test['prefix'] not in ['large']: - st_time = timeit.default_timer() - # ===== Serial Write - nessy.to_netcdf('nc_test_{0}_{1}_serial.nc'.format(test['prefix'], nessy.size), serial=True) - # ===== END Serial Write - spent_time = timeit.default_timer() - st_time - if nessy.master: - print("Writing in serial time {min:02d}:{sec:02.3f} (tot: {tot:.3f} s ; var: {var:.3f}s/var)".format( - min=int(spent_time // 60), sec=spent_time - (int(spent_time // 60) * 60), - var=spent_time / len(nessy.variables.keys()), tot=spent_time)) - sys.stdout.flush() - times["{0}_Serial".format(test['prefix'])] = spent_time - - # ====================================================================================================================== - - st_time = timeit.default_timer() - # ===== Parallel Chunk Write - nessy.to_netcdf('nc_test_{0}_{1}_parallel_chunked.nc'.format(test['prefix'], nessy.size), chunking=True) - # ===== END Parallel Chunk Write - spent_time = timeit.default_timer() - st_time - if nessy.master: - print("Writing in chunked parallel time {min:02d}:{sec:02.3f} (tot: {tot:.3f} s ; var: {var:.3f}s/var)".format( - min=int(spent_time // 60), sec=spent_time - (int(spent_time // 60) * 60), - var=spent_time / len(nessy.variables.keys()), tot=spent_time)) - sys.stdout.flush() - times["{0}_Chunk".format(test['prefix'])] = spent_time - - # ====================================================================================================================== - - st_time = timeit.default_timer() - # ===== Parallel Write - nessy.to_netcdf('nc_test_{0}_{1}_parallel.nc'.format(test['prefix'], nessy.size)) - # ===== END Parallel Write - spent_time = timeit.default_timer() - st_time - if nessy.master: - print("Writing in parallel time {min:02d}:{sec:02.3f} (tot: {tot:.3f} s ; var: {var:.3f}s/var)".format( - min=int(spent_time // 60), sec=spent_time - (int(spent_time // 60) * 60), - var=spent_time / len(nessy.variables.keys()), tot=spent_time)) - sys.stdout.flush() - times["{0}_Parallel".format(test['prefix'])] = spent_time - - # ====================================================================================================================== - - -times.to_csv("times_{0}.csv".format(str(size).zfill(3))) diff --git a/tests/2-test_read_write_projection.py b/tests/1.1-test_read_write_projection.py similarity index 94% rename from tests/2-test_read_write_projection.py rename to tests/1.1-test_read_write_projection.py index 5f4590c1482f5e2690643caeaaf765ab9db2cbb2..d77053dd80169b988a8cca85b298c1c9f8556782 100644 --- a/tests/2-test_read_write_projection.py +++ b/tests/1.1-test_read_write_projection.py @@ -1,4 +1,5 @@ #!/usr/bin/env python + import sys import timeit import pandas as pd @@ -71,7 +72,7 @@ for name, dict in paths.items(): print('WRITE IN SERIAL') sys.stdout.flush() start_time = timeit.default_timer() - nessy_1.to_netcdf('{0}_{1}_file_{2}_serial.nc'.format(size, projection, parallel_method), + nessy_1.to_netcdf('/tmp/{0}_{1}_file_{2}_serial.nc'.format(size, projection, parallel_method), info=True, serial=True) serial_time = timeit.default_timer() - start_time comm.Barrier() @@ -81,7 +82,7 @@ for name, dict in paths.items(): print('WRITE IN PARALLEL') sys.stdout.flush() start_time = timeit.default_timer() - nessy_1.to_netcdf('{0}_{1}_file_{2}_parallel.nc'.format(size, projection, parallel_method), + nessy_1.to_netcdf('/tmp/{0}_{1}_file_{2}_parallel.nc'.format(size, projection, parallel_method), info=True) parallel_time = timeit.default_timer() - start_time comm.Barrier() @@ -91,7 +92,7 @@ for name, dict in paths.items(): print('WRITE IN CHUNKS') sys.stdout.flush() start_time = timeit.default_timer() - nessy_1.to_netcdf('{0}_{1}_file_{2}_chunking.nc'.format(size, projection, parallel_method), + nessy_1.to_netcdf('/tmp/{0}_{1}_file_{2}_chunking.nc'.format(size, projection, parallel_method), info=True, chunking=True) chunking_time = timeit.default_timer() - start_time comm.Barrier() diff --git a/tests/3-test_spatial_join.py b/tests/2.1-test_spatial_join.py similarity index 78% rename from tests/3-test_spatial_join.py rename to tests/2.1-test_spatial_join.py index 5fe456c49d875b24fdfb6e8f7e8183ba7b365efd..845a05c51a160186b4b0bd3dc67ebaecfca5d40d 100644 --- a/tests/3-test_spatial_join.py +++ b/tests/2.1-test_spatial_join.py @@ -1,4 +1,5 @@ #!/usr/bin/env python + import sys from mpi4py import MPI import pandas as pd @@ -15,11 +16,11 @@ original_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/MONARCH_d01_20221 parallel_method = 'Y' -result_path = "Times_test_3_spatial_join_{0}_{1:03d}.csv".format(parallel_method, size) -result = pd.DataFrame(index=['read', 'calcul', 'write'], - columns=['3.1.Existing_file_centroid', '3.2.New_file_centroid', - '3.3.Existing_file_nearest', '3.4.New_file_nearest', - '3.5.Existing_file_intersection', '3.6.New_file_intersection']) +result_path = "Times_test_2-1_spatial_join_{0}_{1:03d}.csv".format(parallel_method, size) +result = pd.DataFrame(index=['read', 'calculate', 'write'], + columns=['2-1.1.Existing_file_centroid', '2-1.2.New_file_centroid', + '2-1.2.Existing_file_nearest', '2-1.4.New_file_nearest', + '2-1.5.Existing_file_intersection', '2-1.6.New_file_intersection']) # ===== PATH TO MASK ===== # shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/timezones_2021c.shp' @@ -27,7 +28,8 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # # ====================================================================================================================== # # =================================== CENTROID EXISTING FILE =================================================== # # ====================================================================================================================== -# test_name = '3.1.Existing_file_centroid' + +# test_name = '2-1.1.Existing_file_centroid' # print(test_name) # # # READ @@ -42,8 +44,8 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # # Method can be centroid, nearest and intersection # nessy.spatial_join(shapefile_path, method='centroid') # comm.Barrier() -# result.loc['calcul', test_name] = timeit.default_timer() - st_time -# print('SPATIAL JOIN - Rank: {0}. Shapefile: \n{1}'.format(rank, nessy.shapefile)) +# result.loc['calculate', test_name] = timeit.default_timer() - st_time +# print('SPATIAL JOIN - Rank {0:03d} - Shapefile: \n{1}'.format(rank, nessy.shapefile)) # # comm.Barrier() # if rank == 0: @@ -53,7 +55,8 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # # ====================================================================================================================== # # =================================== CENTROID FROM NEW FILE =================================================== # # ====================================================================================================================== -# test_name = '3.2.New_file_centroid' + +# test_name = '2-1.2.New_file_centroid' # print(test_name) # # # CREATE @@ -74,9 +77,9 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # inc_lat=inc_lat, inc_lon=inc_lon, # n_lat=n_lat, n_lon=n_lon) # comm.Barrier() -# result.loc['calcul', test_name] = timeit.default_timer() - st_time +# result.loc['calculate', test_name] = timeit.default_timer() - st_time # -# print('FROM SHAPEFILE - Rank: {0}. Shapefile: \n{1}'.format(rank, nessy.shapefile)) +# print('FROM SHAPEFILE - Rank {0:03d} - Shapefile: \n{1}'.format(rank, nessy.shapefile)) # # comm.Barrier() # if rank == 0: @@ -86,7 +89,8 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # # ====================================================================================================================== # # =================================== NEAREST EXISTING FILE =================================================== # # ====================================================================================================================== -# test_name = '3.3.Existing_file_nearest' + +# test_name = '2-1.3.Existing_file_nearest' # print(test_name) # # # READ @@ -101,8 +105,8 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # # Method can be centroid, nearest and intersection # nessy.spatial_join(shapefile_path, method='nearest') # comm.Barrier() -# result.loc['calcul', test_name] = timeit.default_timer() - st_time -# print('SPATIAL JOIN - Rank: {0}. Shapefile: \n{1}'.format(rank, nessy.shapefile)) +# result.loc['calculate', test_name] = timeit.default_timer() - st_time +# print('SPATIAL JOIN - Rank {0:03d} - Shapefile: \n{1}'.format(rank, nessy.shapefile)) # # comm.Barrier() # if rank == 0: @@ -112,7 +116,8 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # # ====================================================================================================================== # # =================================== NEAREST FROM NEW FILE =================================================== # # ====================================================================================================================== -# test_name = '3.4.New_file_nearest' + +# test_name = '2-1.4.New_file_nearest' # print(test_name) # # # CREATE @@ -133,9 +138,9 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # inc_lat=inc_lat, inc_lon=inc_lon, # n_lat=n_lat, n_lon=n_lon) # comm.Barrier() -# result.loc['calcul', test_name] = timeit.default_timer() - st_time +# result.loc['calculate', test_name] = timeit.default_timer() - st_time # -# print('FROM SHAPEFILE - Rank: {0}. Shapefile: \n{1}'.format(rank, nessy.shapefile)) +# print('FROM SHAPEFILE - Rank {0:03d} - Shapefile: \n{1}'.format(rank, nessy.shapefile)) # # comm.Barrier() # if rank == 0: @@ -146,7 +151,8 @@ shapefile_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/timezones_2021c/ # ====================================================================================================================== # =================================== INTERSECTION EXISTING FILE =================================================== # ====================================================================================================================== -test_name = '3.5.Existing_file_intersection' + +test_name = '2-1.5.Existing_file_intersection' print(test_name) # READ @@ -161,8 +167,8 @@ st_time = timeit.default_timer() # Method can be centroid, nearest and intersection nessy.spatial_join(shapefile_path, method='intersection') comm.Barrier() -result.loc['calcul', test_name] = timeit.default_timer() - st_time -print('SPATIAL JOIN - Rank: {0}. Shapefile: \n{1}'.format(rank, nessy.shapefile)) +result.loc['calculate', test_name] = timeit.default_timer() - st_time +print('SPATIAL JOIN - Rank {0:03d} - Shapefile: \n{1}'.format(rank, nessy.shapefile)) comm.Barrier() if rank == 0: @@ -173,12 +179,12 @@ sys.stdout.flush() # ====================================================================================================================== # =================================== INTERSECTION FROM NEW FILE =================================================== # ====================================================================================================================== -test_name = '3.6.New_file_intersection' + +test_name = '2-1.6.New_file_intersection' print(test_name) -# CREATE +# DEFINE PROJECTION st_time = timeit.default_timer() -# Define projection projection = 'regular' lat_orig = 41.1 lon_orig = 1.8 @@ -194,9 +200,9 @@ nessy = from_shapefile(shapefile_path, method='intersection', projection=project inc_lat=inc_lat, inc_lon=inc_lon, n_lat=n_lat, n_lon=n_lon) comm.Barrier() -result.loc['calcul', test_name] = timeit.default_timer() - st_time +result.loc['calculate', test_name] = timeit.default_timer() - st_time -print('FROM SHAPEFILE - Rank: {0}. Shapefile: \n{1}'.format(rank, nessy.shapefile)) +print('FROM SHAPEFILE - Rank {0:03d} - Shapefile: \n{1}'.format(rank, nessy.shapefile)) comm.Barrier() if rank == 0: diff --git a/tests/4-test_bounds.py b/tests/2.3-test_bounds.py similarity index 83% rename from tests/4-test_bounds.py rename to tests/2.3-test_bounds.py index 0abbe0ca78739f4a623401e179870219d448ed8b..b2cf78c1f7792dee7110ab8efbeb7019e1a1485d 100644 --- a/tests/4-test_bounds.py +++ b/tests/2.3-test_bounds.py @@ -1,4 +1,5 @@ #!/usr/bin/env python + import sys import timeit import pandas as pd @@ -11,14 +12,15 @@ size = comm.Get_size() parallel_method = 'Y' -result_path = "Times_test_4_bounds_{0}_{1:03d}.csv".format(parallel_method, size) -result = pd.DataFrame(index=['read', 'calcul', 'write'], - columns=['4.1.With_bounds', '4.2.Without_bounds', "4.3.Create_new"]) +result_path = "Times_test_2-3_bounds_{0}_{1:03d}.csv".format(parallel_method, size) +result = pd.DataFrame(index=['read', 'calculate', 'write'], + columns=['2-3.1.With_bounds', '2-3.2.Without_bounds', "2-3.3.Create_new"]) + # ====================================================================================================================== # ===================================== FILE WITH EXISTING BOUNDS ==================================================== # ====================================================================================================================== -test_name = "4.1.With_bounds" +test_name = "2-3.1.With_bounds" print(test_name) # READ @@ -31,22 +33,21 @@ nessy_1 = open_netcdf(path=path_1, parallel_method=parallel_method, info=True) comm.Barrier() result.loc['read', test_name] = timeit.default_timer() - st_time - # EXPLORE BOUNDS st_time = timeit.default_timer() print('FILE WITH EXISTING BOUNDS - Rank', rank, '-', 'Lat bounds', nessy_1.lat_bnds) print('FILE WITH EXISTING BOUNDS - Rank', rank, '-', 'Lon bounds', nessy_1.lon_bnds) comm.Barrier() -result.loc['calcul', test_name] = timeit.default_timer() - st_time +result.loc['calculate', test_name] = timeit.default_timer() - st_time # WRITE st_time = timeit.default_timer() -nessy_1.to_netcdf('bounds_file_1.nc', info=True) +nessy_1.to_netcdf('/tmp/bounds_file_1.nc', info=True) comm.Barrier() result.loc['write', test_name] = timeit.default_timer() - st_time # REOPEN -nessy_2 = open_netcdf('bounds_file_1.nc', info=True) +nessy_2 = open_netcdf('/tmp/bounds_file_1.nc', info=True) # LOAD DATA AND EXPLORE BOUNDS print('FILE WITH EXISTING BOUNDS AFTER WRITE - Rank', rank, '-', 'Lat bounds', nessy_2.lat_bnds) @@ -60,8 +61,10 @@ sys.stdout.flush() # ====================================================================================================================== # =================================== FILE WITHOUT EXISTING BOUNDS =================================================== # ====================================================================================================================== -test_name = '4.2.Without_bounds' + +test_name = '2-3.2.Without_bounds' print(test_name) + # Original path: /gpfs/scratch/bsc32/bsc32538/mr_multiplyby/OUT/stats_bnds/monarch/a45g/regional/daily_max/O3_all/O3_all-000_2021080300.nc # Rotated grid from MONARCH st_time = timeit.default_timer() @@ -74,7 +77,7 @@ result.loc['read', test_name] = timeit.default_timer() - st_time st_time = timeit.default_timer() nessy_3.create_spatial_bounds() comm.Barrier() -result.loc['calcul', test_name] = timeit.default_timer() - st_time +result.loc['calculate', test_name] = timeit.default_timer() - st_time # EXPLORE BOUNDS print('FILE WITHOUT EXISTING BOUNDS - Rank', rank, '-', 'Lat bounds', nessy_3.lat_bnds) @@ -82,12 +85,12 @@ print('FILE WITHOUT EXISTING BOUNDS - Rank', rank, '-', 'Lon bounds', nessy_3.lo # WRITE st_time = timeit.default_timer() -nessy_3.to_netcdf('bounds_file_2.nc', info=True) +nessy_3.to_netcdf('/tmp/bounds_file_2.nc', info=True) comm.Barrier() result.loc['write', test_name] = timeit.default_timer() - st_time # REOPEN -nessy_4 = open_netcdf('bounds_file_2.nc', info=True) +nessy_4 = open_netcdf('/tmp/bounds_file_2.nc', info=True) # LOAD DATA AND EXPLORE BOUNDS print('FILE WITH EXISTING BOUNDS AFTER WRITE - Rank', rank, '-', 'Lat bounds', nessy_4.lat_bnds) @@ -102,7 +105,7 @@ sys.stdout.flush() # ==================================== CREATE NES REGULAR LAT-LON ==================================================== # ====================================================================================================================== -test_name = "4.3.Create_new" +test_name = "2-3.3.Create_new" print(test_name) # CREATE GRID @@ -124,7 +127,7 @@ result.loc['read', test_name] = timeit.default_timer() - st_time st_time = timeit.default_timer() nessy_5.create_spatial_bounds() comm.Barrier() -result.loc['calcul', test_name] = timeit.default_timer() - st_time +result.loc['calculate', test_name] = timeit.default_timer() - st_time # EXPLORE BOUNDS print('FROM NEW GRID - Rank', rank, '-', 'Lat bounds', nessy_5.lat_bnds) @@ -132,12 +135,14 @@ print('FROM NEW GRID - Rank', rank, '-', 'Lon bounds', nessy_5.lon_bnds) # WRITE st_time = timeit.default_timer() -nessy_5.to_netcdf('bounds_file_3.nc', info=True) +nessy_5.to_netcdf('/tmp/bounds_file_3.nc', info=True) comm.Barrier() result.loc['write', test_name] = timeit.default_timer() - st_time -# REOPEN -nessy_6 = open_netcdf('bounds_file_3.nc', info=True) +# REOPENcomm.Barrier() +result.loc['write', test_name] = timeit.default_timer() - st_time + +nessy_6 = open_netcdf('/tmp/bounds_file_3.nc', info=True) # LOAD DATA AND EXPLORE BOUNDS print('FROM NEW GRID AFTER WRITE - Rank', rank, '-', 'Lat bounds', nessy_6.lat_bnds) diff --git a/tests/2.4-test_cell_area.py b/tests/2.4-test_cell_area.py new file mode 100644 index 0000000000000000000000000000000000000000..1fe5b9f52c8c5253289314686993cec5525d029d --- /dev/null +++ b/tests/2.4-test_cell_area.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python + +import sys +import timeit +import pandas as pd +from mpi4py import MPI +from nes import * + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() +size = comm.Get_size() + +parallel_method = 'Y' + +result_path = "Times_test_2.4_cell_area_{0}_{1:03d}.csv".format(parallel_method, size) +result = pd.DataFrame(index=['read', 'calculate', 'write'], + columns=['2-4.1.New_file_grid_area', '2-4.2.New_file_geometry_area', + '2-4.3.Existing_file_grid_area', '2-4.4.Existing_file_geometry_area']) + +# ====================================================================================================================== +# ===================================== CALCULATE CELLS AREA FROM NEW GRID =========================================== +# ====================================================================================================================== + +test_name = "2-4.1.Grid_area" +print(test_name) + +# CREATE GRID +st_time = timeit.default_timer() +lat_1 = 37 +lat_2 = 43 +lon_0 = -3 +lat_0 = 40 +nx = 20 +ny = 40 +inc_x = 4000 +inc_y = 4000 +x_0 = -807847.688 +y_0 = -797137.125 +nessy = create_nes(comm=None, info=False, projection='lcc', + lat_1=lat_1, lat_2=lat_2, lon_0=lon_0, lat_0=lat_0, + nx=nx, ny=ny, inc_x=inc_x, inc_y=inc_y, x_0=x_0, y_0=y_0) +comm.Barrier() +result.loc['read', test_name] = timeit.default_timer() - st_time + +# CALCULATE AREA OF EACH CELL IN GRID +st_time = timeit.default_timer() +nessy.calculate_grid_area() +comm.Barrier() +result.loc['calculate', test_name] = timeit.default_timer() - st_time + +# EXPLORE GRID AREA +print('Rank {0:03d}: Calculate grid cell area: {1}'.format(rank, nessy.cell_measures['cell_area'])) + +# WRITE +st_time = timeit.default_timer() +nessy.to_netcdf('nessy_1_nes_area.nc') +comm.Barrier() +result.loc['write', test_name] = timeit.default_timer() - st_time + +# REOPEN +# nessy = open_netcdf('nessy_1_nes_area.nc') + +# EXPLORE GRID AREA +print('Rank {0:03d}: Write grid cell area: {1}'.format(rank, nessy.cell_measures['cell_area'])) + +comm.Barrier() +if rank == 0: + print(result.loc[:, test_name]) +sys.stdout.flush() + +del nessy + +# ====================================================================================================================== +# ===================================== CALCULATE CELLS AREA FROM GEOMETRIES ========================================= +# ====================================================================================================================== + +test_name = "2-4.1.Geometry_area" +print(test_name) + +# CREATE GRID +st_time = timeit.default_timer() +lat_1 = 37 +lat_2 = 43 +lon_0 = -3 +lat_0 = 40 +nx = 20 +ny = 40 +inc_x = 4000 +inc_y = 4000 +x_0 = -807847.688 +y_0 = -797137.125 +nessy = create_nes(comm=None, info=False, projection='lcc', + lat_1=lat_1, lat_2=lat_2, lon_0=lon_0, lat_0=lat_0, + nx=nx, ny=ny, inc_x=inc_x, inc_y=inc_y, x_0=x_0, y_0=y_0) +comm.Barrier() +result.loc['read', test_name] = timeit.default_timer() - st_time + +# CALCULATE AREA OF EACH CELL POLYGON +st_time = timeit.default_timer() +nessy.create_shapefile() +geometry_list = nessy.shapefile['geometry'].values +geometry_area = calculate_geometry_area(geometry_list) +comm.Barrier() +result.loc['calculate', test_name] = timeit.default_timer() - st_time + +# EXPLORE GEOMETRIES AREA +print('Rank {0:03d}: Calculate geometry cell area: {1}'.format(rank, geometry_area)) + +comm.Barrier() +if rank == 0: + print(result.loc[:, test_name]) +sys.stdout.flush() + +# ====================================================================================================================== +# ===================================== CALCULATE CELLS AREA FROM EXISTING GRID ====================================== +# ====================================================================================================================== + +test_name = '2-4.3.Existing_file_grid_area' +print(test_name) + +# Original path: /esarchive/exp/monarch/a4dd/original_files/000/2022111512/MONARCH_d01_2022111512.nc +# Rotated grid from MONARCH +original_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/MONARCH_d01_2022111512.nc' + +# READ +st_time = timeit.default_timer() +nessy = open_netcdf(original_path, parallel_method=parallel_method) +comm.Barrier() +result.loc['read', test_name] = timeit.default_timer() - st_time + +# CALCULATE AREA OF EACH CELL IN GRID +st_time = timeit.default_timer() +nessy.calculate_grid_area() +comm.Barrier() +result.loc['calculate', test_name] = timeit.default_timer() - st_time + +# EXPLORE GRID AREA +print('Rank {0:03d}: Calculate grid cell area: {1}'.format(rank, nessy.cell_measures['cell_area'])) + +# WRITE +st_time = timeit.default_timer() +nessy.to_netcdf('nessy_2_nes_area.nc') +comm.Barrier() +result.loc['write', test_name] = timeit.default_timer() - st_time + +# REOPEN +# nessy = open_netcdf('nessy_2_nes_area.nc') + +comm.Barrier() +if rank == 0: + print(result.loc[:, test_name]) +sys.stdout.flush() +del nessy + +# ====================================================================================================================== +# ===================================== CALCULATE CELLS AREA FROM GEOMETRIES FROM EXISTING GRID ====================== +# ====================================================================================================================== + +test_name = '2-4.4.Existing_file_geometry_area' +print(test_name) + +# Original path: /esarchive/exp/monarch/a4dd/original_files/000/2022111512/MONARCH_d01_2022111512.nc +# Rotated grid from MONARCH +original_path = '/gpfs/projects/bsc32/models/NES_tutorial_data/MONARCH_d01_2022111512.nc' + +# READ +st_time = timeit.default_timer() +nessy = open_netcdf(original_path, parallel_method=parallel_method) +comm.Barrier() +result.loc['read', test_name] = timeit.default_timer() - st_time + +# CALCULATE AREA OF EACH CELL POLYGON +st_time = timeit.default_timer() +nessy.create_shapefile() +geometry_list = nessy.shapefile['geometry'].values +geometry_area = calculate_geometry_area(geometry_list) +comm.Barrier() +result.loc['calculate', test_name] = timeit.default_timer() - st_time + +# EXPLORE GEOMETRIES AREA +print('Rank {0:03d}: Calculate geometry cell area: {1}'.format(rank, geometry_area)) + +comm.Barrier() +if rank == 0: + print(result.loc[:, test_name]) +sys.stdout.flush() +del nessy + +if rank == 0: + result.to_csv(result_path) diff --git a/tests/run_scallability_tests_nord3v2.sh b/tests/run_scalability_tests_nord3v2.sh similarity index 89% rename from tests/run_scallability_tests_nord3v2.sh rename to tests/run_scalability_tests_nord3v2.sh index b06f89a7c2dc6de4a685938e1500b7c80f600d6a..3bd61335354b8378aad977963324044ee2546467 100644 --- a/tests/run_scallability_tests_nord3v2.sh +++ b/tests/run_scalability_tests_nord3v2.sh @@ -3,10 +3,10 @@ EXPORTPATH="/gpfs/projects/bsc32/models/NES_master" SRCPATH="/gpfs/projects/bsc32/models/NES_master/tests" -#EXE="1-test_read_write_size.py" -#EXE="2-test_read_write_projection.py" -#EXE="3-test_spatial_join.py" -EXE="4-test_bounds.py" +#EXE="1.1-test_read_write_projection.py" +#EXE="2.1-test_spatial_join.py" +#EXE="2.3-test_bounds.py" +EXE="2.4-test_cell_area.py" module purge module load Python/3.7.4-GCCcore-8.3.0 diff --git a/tests/test_bash_mn4.cmd b/tests/test_bash_mn4.cmd index 28ff46a0e3342d7b47a6faca9204ac844803325f..5a0fca92696b2fd4329d479b3f122dc5e98d700d 100644 --- a/tests/test_bash_mn4.cmd +++ b/tests/test_bash_mn4.cmd @@ -20,7 +20,7 @@ module load NES/1.0.0-mn4-foss-2019b-Python-3.7.4 cd /gpfs/projects/bsc32/models/NES_master/tests -#mpirun --mca mpi_warn_on_fork 0 -np 4 python 1-test_read_write_size.py -#mpirun --mca mpi_warn_on_fork 0 -np 4 python 2-test_read_write_projection.py -#mpirun --mca mpi_warn_on_fork 0 -np 4 python 3-test_spatial_join.py -mpirun --mca mpi_warn_on_fork 0 -np 4 python 4-test_bounds.py +#mpirun --mca mpi_warn_on_fork 0 -np 4 python 1.1-test_read_write_projection +#mpirun --mca mpi_warn_on_fork 0 -np 4 python 2.1-test_spatial_join.py +#mpirun --mca mpi_warn_on_fork 0 -np 4 python 2.3-test_bounds.py +mpirun --mca mpi_warn_on_fork 0 -np 4 python 2.4-test_cell_area.py diff --git a/tests/test_bash_nord3v2.cmd b/tests/test_bash_nord3v2.cmd index c255b60aee92a190f5c799fbceba263891f43d69..26d9e28448284eb5191787a3031f1627dc446f67 100644 --- a/tests/test_bash_nord3v2.cmd +++ b/tests/test_bash_nord3v2.cmd @@ -19,7 +19,7 @@ module load NES/1.0.0-nord3-v2-foss-2019b-Python-3.7.4 cd /gpfs/projects/bsc32/models/NES_master/tests -#mpirun --mca mpi_warn_on_fork 0 -np 4 python 1-test_read_write_size.py -#mpirun --mca mpi_warn_on_fork 0 -np 4 python 2-test_read_write_projection.py -#mpirun --mca mpi_warn_on_fork 0 -np 4 python 3-test_spatial_join.py -mpirun --mca mpi_warn_on_fork 0 -np 4 python 4-test_bounds.py +#mpirun --mca mpi_warn_on_fork 0 -np 4 python 1.1-test_read_write_projection +#mpirun --mca mpi_warn_on_fork 0 -np 4 python 2.1-test_spatial_join.py +#mpirun --mca mpi_warn_on_fork 0 -np 4 python 2.3-test_bounds.py +mpirun --mca mpi_warn_on_fork 0 -np 4 python 2.4-test_cell_area.py diff --git a/tutorials/4.Interpolation/4.2.Horizontal_Interpolation.ipynb b/tutorials/4.Interpolation/4.2.Horizontal_Interpolation.ipynb index f90cdcd7efc5a343d2271af4621976c1027f715a..5f0379f37316bb8f5f746651e8218948aa248f6d 100644 --- a/tutorials/4.Interpolation/4.2.Horizontal_Interpolation.ipynb +++ b/tutorials/4.Interpolation/4.2.Horizontal_Interpolation.ipynb @@ -593,7 +593,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.6.8 (default, Aug 12 2021, 07:06:15) \n[GCC 8.4.1 20200928 (Red Hat 8.4.1-1)]" }, "vscode": { "interpreter": { diff --git a/tutorials/4.Interpolation/4.3.Providentia_Interpolation.ipynb b/tutorials/4.Interpolation/4.3.Providentia_Interpolation.ipynb index e3bfb9a138fb75be83a6fc47975c515bdebde216..478b456b65bad7f48735b52f3c4b1b7d61ad7571 100644 --- a/tutorials/4.Interpolation/4.3.Providentia_Interpolation.ipynb +++ b/tutorials/4.Interpolation/4.3.Providentia_Interpolation.ipynb @@ -43,7 +43,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -227,17 +227,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2518: UserWarning: No time has been specified. The first one will be selected.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2479: UserWarning: No vertical level has been specified. The first one will be selected.\n", + " warnings.warn(msg)\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2489: UserWarning: No time has been specified. The first one will be selected.\n", " warnings.warn(msg)\n" ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Rank 000: Loading sconco3 var (1/1)\n", - "Rank 000: Loaded sconco3 var ((1, 1, 211, 351))\n" - ] } ], "source": [ @@ -383,7 +377,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, @@ -685,7 +679,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\tsconco3 horizontal interpolation\n" + "\tsconco3 horizontal methods\n" ] } ], @@ -840,19 +834,13 @@ "execution_count": 17, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Rank 000: Loading sconco3 var (1/1)\n", - "Rank 000: Loaded sconco3 var ((168, 1))\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2518: UserWarning: No time has been specified. The first one will be selected.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2479: UserWarning: No vertical level has been specified. The first one will be selected.\n", + " warnings.warn(msg)\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2489: UserWarning: No time has been specified. The first one will be selected.\n", " warnings.warn(msg)\n" ] } @@ -1001,7 +989,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.7.4" }, "vscode": { "interpreter": { diff --git a/tutorials/5.Shapefiles/5.1.Create_Shapefiles.ipynb b/tutorials/5.Geospatial/5.1.Create_Shapefiles.ipynb similarity index 82% rename from tutorials/5.Shapefiles/5.1.Create_Shapefiles.ipynb rename to tutorials/5.Geospatial/5.1.Create_Shapefiles.ipynb index ad0a8e759e980ae982212663360dcda013f7ba6c..0777eced08ad0be64fe107b30c3dac376488a4cc 100644 --- a/tutorials/5.Shapefiles/5.1.Create_Shapefiles.ipynb +++ b/tutorials/5.Geospatial/5.1.Create_Shapefiles.ipynb @@ -205,7 +205,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -229,6 +229,38 @@ "grid.shapefile.plot()" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "grid.shapefile[:10].plot()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -245,7 +277,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -262,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -361,7 +393,7 @@ "[5000 rows x 1 columns]" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -372,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -471,7 +503,7 @@ "[5000 rows x 1 columns]" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -482,16 +514,16 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, @@ -512,6 +544,38 @@ "regular_grid.shapefile.plot()" ] }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "regular_grid.shapefile[:10].plot()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -521,7 +585,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -539,7 +603,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -638,7 +702,7 @@ "[95121 rows x 1 columns]" ] }, - "execution_count": 13, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -649,7 +713,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -748,7 +812,7 @@ "[95121 rows x 1 columns]" ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -759,16 +823,16 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 15, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, @@ -789,6 +853,38 @@ "rotated_grid.shapefile.plot()" ] }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "rotated_grid.shapefile[:10].plot()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -798,7 +894,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -819,7 +915,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -918,7 +1014,7 @@ "[20000 rows x 1 columns]" ] }, - "execution_count": 17, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -929,7 +1025,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -1028,7 +1124,7 @@ "[20000 rows x 1 columns]" ] }, - "execution_count": 18, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -1039,16 +1135,16 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 19, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, @@ -1069,6 +1165,38 @@ "lcc_grid.shapefile.plot()" ] }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "lcc_grid.shapefile[:10].plot()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1323,7 +1451,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1346,6 +1474,38 @@ "source": [ "mercator_grid.shapefile.plot()" ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mercator_grid.shapefile[:10].plot()" + ] } ], "metadata": { diff --git a/tutorials/5.Shapefiles/5.2.Spatial_Join.ipynb b/tutorials/5.Geospatial/5.2.Spatial_Join.ipynb similarity index 100% rename from tutorials/5.Shapefiles/5.2.Spatial_Join.ipynb rename to tutorials/5.Geospatial/5.2.Spatial_Join.ipynb diff --git a/tutorials/6.Others/5.2.Add_Coordinates_Bounds.ipynb b/tutorials/5.Geospatial/5.3.Add_Coordinates_Bounds.ipynb similarity index 95% rename from tutorials/6.Others/5.2.Add_Coordinates_Bounds.ipynb rename to tutorials/5.Geospatial/5.3.Add_Coordinates_Bounds.ipynb index 84148276a6101bb8020866e4e1deb09586df72d0..3e68cb787acd31603ffb870e079b33a4e6328c55 100644 --- a/tutorials/6.Others/5.2.Add_Coordinates_Bounds.ipynb +++ b/tutorials/5.Geospatial/5.3.Add_Coordinates_Bounds.ipynb @@ -49,7 +49,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -74,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -219,7 +219,7 @@ " dtype=float32)}" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -409,97 +409,97 @@ "name": "stderr", "output_type": "stream", "text": [ - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable NO was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable NO was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable NO2 was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable NO2 was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable HONO was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable HONO was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable CO was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable CO was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable CO_GFAS was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable CO_GFAS was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable SO2 was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable SO2 was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable SO2_GFAS was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable SO2_GFAS was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable NH3 was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable NH3 was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable ALD2 was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable ALD2 was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable ALDX was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable ALDX was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable BENZENE was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable BENZENE was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable ETH was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable ETH was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable ETHA was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable ETHA was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable ETOH was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable ETOH was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable FORM was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable FORM was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable IOLE was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable IOLE was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable ISOP was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable ISOP was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable MEOH was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable MEOH was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable OLE was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable OLE was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable PAR was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable PAR was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable SESQ was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable SESQ was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable TERP was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable TERP was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable TOL was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable TOL was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable XYL was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable XYL was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable DMS was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable DMS was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable DMS_GFAS was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable DMS_GFAS was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable HCL was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable HCL was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable POA was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable POA was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable POA_GFAS was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable POA_GFAS was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable PEC was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable PEC was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable PEC_GFAS was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable PEC_GFAS was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable PNO3 was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable PNO3 was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable PSO4 was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable PSO4 was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable PMFINE was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable PMFINE was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable PMFINE_GFAS was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable PMFINE_GFAS was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable PMC was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable PMC was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable EPOA_biomass was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable EPOA_biomass was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable EPOA_anthro was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable EPOA_anthro was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable OPOA_biomass was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable OPOA_biomass was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable OPOA_anthro was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable OPOA_anthro was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable SOAP_bb was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable SOAP_bb was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable SOAP_anthro was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable SOAP_anthro was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable ECres was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable ECres was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable ECtot was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable ECtot was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable TPM_GFAS was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable TPM_GFAS was not loaded. It will not be written.\n", " warnings.warn(msg)\n", - "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2111: UserWarning: WARNING!!! Variable cell_area was not loaded. It will not be written.\n", + "/esarchive/scratch/avilanova/software/NES/nes/nc_projections/default_nes.py:2096: UserWarning: WARNING!!! Variable cell_area was not loaded. It will not be written.\n", " warnings.warn(msg)\n" ] } @@ -523,7 +523,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -875,7 +875,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, @@ -1114,7 +1114,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 16, diff --git a/tutorials/5.Geospatial/5.4.Calculate_Grid_Cell_Area.ipynb b/tutorials/5.Geospatial/5.4.Calculate_Grid_Cell_Area.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..05e59b54b25047996239bfa7644326745ca5dce4 --- /dev/null +++ b/tutorials/5.Geospatial/5.4.Calculate_Grid_Cell_Area.ipynb @@ -0,0 +1,738 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculate the area of each cell of a grid" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from nes import *\n", + "import numpy as np\n", + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Create grid" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "lat_1 = 37\n", + "lat_2 = 43\n", + "lon_0 = -3\n", + "lat_0 = 40\n", + "nx = 10\n", + "ny = 15\n", + "inc_x = 4000\n", + "inc_y = 4000\n", + "x_0 = -807847.688\n", + "y_0 = -797137.125\n", + "lcc_grid = create_nes(comm=None, info=False, projection='lcc',\n", + " lat_1=lat_1, lat_2=lat_2, lon_0=lon_0, lat_0=lat_0, \n", + " nx=nx, ny=ny, inc_x=inc_x, inc_y=inc_y, x_0=x_0, y_0=y_0)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
geometry
FID
0POLYGON ((-11.58393 32.47507, -11.54169 32.478...
1POLYGON ((-11.54169 32.47851, -11.49944 32.481...
2POLYGON ((-11.49944 32.48192, -11.45719 32.485...
3POLYGON ((-11.45719 32.48533, -11.41494 32.488...
4POLYGON ((-11.41494 32.48871, -11.37268 32.492...
......
145POLYGON ((-11.42882 32.99135, -11.38628 32.994...
146POLYGON ((-11.38628 32.99473, -11.34373 32.998...
147POLYGON ((-11.34373 32.99809, -11.30118 33.001...
148POLYGON ((-11.30118 33.00143, -11.25863 33.004...
149POLYGON ((-11.25863 33.00476, -11.21607 33.008...
\n", + "

150 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " geometry\n", + "FID \n", + "0 POLYGON ((-11.58393 32.47507, -11.54169 32.478...\n", + "1 POLYGON ((-11.54169 32.47851, -11.49944 32.481...\n", + "2 POLYGON ((-11.49944 32.48192, -11.45719 32.485...\n", + "3 POLYGON ((-11.45719 32.48533, -11.41494 32.488...\n", + "4 POLYGON ((-11.41494 32.48871, -11.37268 32.492...\n", + ".. ...\n", + "145 POLYGON ((-11.42882 32.99135, -11.38628 32.994...\n", + "146 POLYGON ((-11.38628 32.99473, -11.34373 32.998...\n", + "147 POLYGON ((-11.34373 32.99809, -11.30118 33.001...\n", + "148 POLYGON ((-11.30118 33.00143, -11.25863 33.004...\n", + "149 POLYGON ((-11.25863 33.00476, -11.21607 33.008...\n", + "\n", + "[150 rows x 1 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lcc_grid.create_shapefile()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Calculate grid area with NES" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "lcc_grid.calculate_grid_area()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'data': array([[15830419.37602491, 15830657.31464759, 15830893.98187641,\n", + " 15831129.37902908, 15831363.50737192, 15831596.36818251,\n", + " 15831827.96271216, 15832058.29223234, 15832287.3580128 ,\n", + " 15832515.16128843],\n", + " [15832888.43944364, 15833125.4618577 , 15833361.21722112,\n", + " 15833595.70682441, 15833828.93193695, 15834060.89385057,\n", + " 15834291.59384502, 15834521.03319032, 15834749.2131148 ,\n", + " 15834976.13488906],\n", + " [15835346.79240354, 15835582.8966068 , 15835817.73809013,\n", + " 15836051.31816116, 15836283.63810613, 15836514.69920246,\n", + " 15836744.50270247, 15836973.04988706, 15837200.34204102,\n", + " 15837426.38040528],\n", + " [15837794.42326163, 15838029.60727211, 15838263.53292125,\n", + " 15838496.20149222, 15838727.61427387, 15838957.77256741,\n", + " 15839186.6776418 , 15839414.33076289, 15839640.73319616,\n", + " 15839865.88622452],\n", + " [15840231.32048458, 15840465.58229638, 15840698.59009752,\n", + " 15840930.34519075, 15841160.84885779, 15841390.10239228,\n", + " 15841618.10708416, 15841844.86421011, 15842070.37502717,\n", + " 15842294.64079978],\n", + " [15842657.47252579, 15842890.8101492 , 15843122.89812364,\n", + " 15843353.73774392, 15843583.33033225, 15843811.67716125,\n", + " 15844038.77951487, 15844264.63868577, 15844489.2559287 ,\n", + " 15844712.63252152],\n", + " [15845072.86781775, 15845305.27923895, 15845536.44539522,\n", + " 15845766.36759449, 15845995.04712501, 15846222.4852872 ,\n", + " 15846448.68336277, 15846673.64263782, 15846897.36439707,\n", + " 15847119.84990175],\n", + " [15847477.49487919, 15847708.97812176, 15847939.22047551,\n", + " 15848168.22324328, 15848395.9877448 , 15848622.51527306,\n", + " 15848847.8071165 , 15849071.86456124, 15849294.68888149,\n", + " 15849516.28136931],\n", + " [15849871.34221948, 15850101.89526329, 15850331.21182007,\n", + " 15850559.293196 , 15850786.14069547, 15851011.75562783,\n", + " 15851236.13929178, 15851459.2929683 , 15851681.21793849,\n", + " 15851901.91547563],\n", + " [15852254.39832998, 15852484.01919013, 15852712.40796391,\n", + " 15852939.56596235, 15853165.49449526, 15853390.19487267,\n", + " 15853613.66838107, 15853835.91632964, 15854056.94000432,\n", + " 15854276.74067481],\n", + " [15854626.65180506, 15854855.33845814, 15855082.79744119,\n", + " 15855309.03006979, 15855534.03765641, 15855757.82150882,\n", + " 15855980.3829386 , 15856201.72323178, 15856421.84367417,\n", + " 15856640.74556485],\n", + " [15856988.09116465, 15857215.84163662, 15857442.36884046,\n", + " 15857667.67411114, 15857891.75877949, 15858114.62415727,\n", + " 15858336.27153077, 15858556.70220796, 15858775.91748785,\n", + " 15858993.91865496],\n", + " [15859338.70502081, 15859565.51727597, 15859791.11070865,\n", + " 15860015.48665859, 15860238.64643876, 15860460.59134635,\n", + " 15860681.3227187 , 15860900.84184616, 15861119.15002387,\n", + " 15861336.24853621],\n", + " [15861678.48197006, 15861904.35401631, 15862129.01168405,\n", + " 15862352.45630977, 15862574.68920346, 15862795.71170322,\n", + " 15863015.52510921, 15863234.13072645, 15863451.52986768,\n", + " 15863667.72381984],\n", + " [15864007.41061145, 15864232.34043731, 15864456.06035349,\n", + " 15864678.57167045, 15864899.87571356, 15865119.97382447,\n", + " 15865338.86731228, 15865556.55748565, 15865773.04563914,\n", + " 15865988.33307546]])}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lcc_grid.cell_measures['cell_area']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Write" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "lcc_grid.to_netcdf('lcc_grid_nes_area.nc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Reopen" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "nessy = open_netcdf('lcc_grid_nes_area.nc')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'data': masked_array(\n", + " data=[[15830419.376024913, 15830657.314647589, 15830893.981876407,\n", + " 15831129.379029078, 15831363.50737192, 15831596.368182508,\n", + " 15831827.962712158, 15832058.292232336, 15832287.358012801,\n", + " 15832515.161288435],\n", + " [15832888.43944364, 15833125.461857699, 15833361.217221119,\n", + " 15833595.706824414, 15833828.931936948, 15834060.89385057,\n", + " 15834291.593845021, 15834521.033190317, 15834749.2131148,\n", + " 15834976.134889057],\n", + " [15835346.792403538, 15835582.896606795, 15835817.738090131,\n", + " 15836051.318161163, 15836283.638106134, 15836514.699202463,\n", + " 15836744.502702465, 15836973.049887061, 15837200.342041023,\n", + " 15837426.380405283],\n", + " [15837794.423261626, 15838029.607272115, 15838263.532921247,\n", + " 15838496.201492224, 15838727.614273867, 15838957.77256741,\n", + " 15839186.677641798, 15839414.330762891, 15839640.733196164,\n", + " 15839865.88622452],\n", + " [15840231.320484577, 15840465.582296379, 15840698.590097519,\n", + " 15840930.345190752, 15841160.848857794, 15841390.102392279,\n", + " 15841618.107084159, 15841844.864210112, 15842070.375027169,\n", + " 15842294.640799781],\n", + " [15842657.472525794, 15842890.810149202, 15843122.898123644,\n", + " 15843353.737743918, 15843583.330332253, 15843811.677161248,\n", + " 15844038.779514872, 15844264.638685772, 15844489.255928697,\n", + " 15844712.63252152],\n", + " [15845072.867817752, 15845305.279238949, 15845536.445395218,\n", + " 15845766.367594492, 15845995.047125012, 15846222.485287195,\n", + " 15846448.683362775, 15846673.642637823, 15846897.364397066,\n", + " 15847119.849901745],\n", + " [15847477.494879192, 15847708.978121761, 15847939.220475506,\n", + " 15848168.223243283, 15848395.987744803, 15848622.51527306,\n", + " 15848847.8071165, 15849071.864561237, 15849294.68888149,\n", + " 15849516.28136931],\n", + " [15849871.342219478, 15850101.895263294, 15850331.211820066,\n", + " 15850559.293195998, 15850786.140695473, 15851011.755627826,\n", + " 15851236.139291776, 15851459.2929683, 15851681.217938488,\n", + " 15851901.915475631],\n", + " [15852254.398329977, 15852484.019190125, 15852712.40796391,\n", + " 15852939.565962346, 15853165.494495256, 15853390.194872674,\n", + " 15853613.668381073, 15853835.916329645, 15854056.940004325,\n", + " 15854276.740674812],\n", + " [15854626.65180506, 15854855.33845814, 15855082.797441188,\n", + " 15855309.030069793, 15855534.037656406, 15855757.82150882,\n", + " 15855980.3829386, 15856201.723231781, 15856421.843674172,\n", + " 15856640.745564846],\n", + " [15856988.091164649, 15857215.841636622, 15857442.368840463,\n", + " 15857667.674111139, 15857891.758779489, 15858114.624157269,\n", + " 15858336.271530768, 15858556.702207962, 15858775.917487847,\n", + " 15858993.918654963],\n", + " [15859338.705020806, 15859565.517275967, 15859791.110708648,\n", + " 15860015.48665859, 15860238.646438757, 15860460.59134635,\n", + " 15860681.322718704, 15860900.841846164, 15861119.150023872,\n", + " 15861336.248536212],\n", + " [15861678.48197006, 15861904.354016308, 15862129.01168405,\n", + " 15862352.456309775, 15862574.68920346, 15862795.711703217,\n", + " 15863015.52510921, 15863234.130726451, 15863451.529867679,\n", + " 15863667.72381984],\n", + " [15864007.410611445, 15864232.340437308, 15864456.060353493,\n", + " 15864678.571670454, 15864899.875713555, 15865119.973824475,\n", + " 15865338.867312277, 15865556.55748565, 15865773.045639142,\n", + " 15865988.333075456]],\n", + " mask=[[False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False],\n", + " [False, False, False, False, False, False, False, False, False,\n", + " False]],\n", + " fill_value=1e+20)}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nessy.cell_measures['cell_area']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Calculate cell area with CDO" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "lcc_grid.variables['aux'] = {'data': np.ones((1, 1, len(lcc_grid.y['data']), len(lcc_grid.x['data'])))}" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "lcc_grid.to_netcdf('lcc_grid.nc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the terminal:\n", + "\n", + "```\n", + "module load CDO\n", + "\n", + "cdo gridarea lcc_grid.nc lcc_grid_cdo_area.nc\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Compare results from NES and CDO" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "shape = lcc_grid.shapefile" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "shape['area_cdo'] = xr.open_dataset('lcc_grid_cdo_area.nc').cell_area.values.ravel()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "shape['area_nes'] = lcc_grid.cell_measures['cell_area']['data'].ravel()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
geometryarea_cdoarea_nes
FID
0POLYGON ((-11.58393 32.47507, -11.54169 32.478...1.584877e+071.583042e+07
1POLYGON ((-11.54169 32.47851, -11.49944 32.481...1.584900e+071.583066e+07
2POLYGON ((-11.49944 32.48192, -11.45719 32.485...1.584924e+071.583089e+07
3POLYGON ((-11.45719 32.48533, -11.41494 32.488...1.584948e+071.583113e+07
4POLYGON ((-11.41494 32.48871, -11.37268 32.492...1.584971e+071.583136e+07
............
145POLYGON ((-11.42882 32.99135, -11.38628 32.994...1.588347e+071.586512e+07
146POLYGON ((-11.38628 32.99473, -11.34373 32.998...1.588369e+071.586534e+07
147POLYGON ((-11.34373 32.99809, -11.30118 33.001...1.588390e+071.586556e+07
148POLYGON ((-11.30118 33.00143, -11.25863 33.004...1.588412e+071.586577e+07
149POLYGON ((-11.25863 33.00476, -11.21607 33.008...1.588433e+071.586599e+07
\n", + "

150 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " geometry area_cdo \\\n", + "FID \n", + "0 POLYGON ((-11.58393 32.47507, -11.54169 32.478... 1.584877e+07 \n", + "1 POLYGON ((-11.54169 32.47851, -11.49944 32.481... 1.584900e+07 \n", + "2 POLYGON ((-11.49944 32.48192, -11.45719 32.485... 1.584924e+07 \n", + "3 POLYGON ((-11.45719 32.48533, -11.41494 32.488... 1.584948e+07 \n", + "4 POLYGON ((-11.41494 32.48871, -11.37268 32.492... 1.584971e+07 \n", + ".. ... ... \n", + "145 POLYGON ((-11.42882 32.99135, -11.38628 32.994... 1.588347e+07 \n", + "146 POLYGON ((-11.38628 32.99473, -11.34373 32.998... 1.588369e+07 \n", + "147 POLYGON ((-11.34373 32.99809, -11.30118 33.001... 1.588390e+07 \n", + "148 POLYGON ((-11.30118 33.00143, -11.25863 33.004... 1.588412e+07 \n", + "149 POLYGON ((-11.25863 33.00476, -11.21607 33.008... 1.588433e+07 \n", + "\n", + " area_nes \n", + "FID \n", + "0 1.583042e+07 \n", + "1 1.583066e+07 \n", + "2 1.583089e+07 \n", + "3 1.583113e+07 \n", + "4 1.583136e+07 \n", + ".. ... \n", + "145 1.586512e+07 \n", + "146 1.586534e+07 \n", + "147 1.586556e+07 \n", + "148 1.586577e+07 \n", + "149 1.586599e+07 \n", + "\n", + "[150 rows x 3 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "shape" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FID\n", + "0 -0.115760\n", + "1 -0.115758\n", + "2 -0.115757\n", + "3 -0.115755\n", + "4 -0.115754\n", + " ... \n", + "145 -0.115506\n", + "146 -0.115505\n", + "147 -0.115503\n", + "148 -0.115502\n", + "149 -0.115500\n", + "Length: 150, dtype: float64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(shape['area_nes']-shape['area_cdo'])*100/shape['area_cdo']" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.11563013960521208" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "((shape['area_nes']-shape['area_cdo'])*100/shape['area_cdo']).mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.11550023822068668" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "((shape['area_nes']-shape['area_cdo'])*100/shape['area_cdo']).max()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.11575966708690363" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "((shape['area_nes']-shape['area_cdo'])*100/shape['area_cdo']).min()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/5.Geospatial/5.5.Calculate_Geometry_Cell_Area.ipynb b/tutorials/5.Geospatial/5.5.Calculate_Geometry_Cell_Area.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..95384592a9d6b86085454bc58643c577e4391a17 --- /dev/null +++ b/tutorials/5.Geospatial/5.5.Calculate_Geometry_Cell_Area.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculate the area of each cell of a set of geometries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from nes import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Get geometries from grid" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "lat_1 = 37\n", + "lat_2 = 43\n", + "lon_0 = -3\n", + "lat_0 = 40\n", + "nx = 10\n", + "ny = 15\n", + "inc_x = 4000\n", + "inc_y = 4000\n", + "x_0 = -807847.688\n", + "y_0 = -797137.125\n", + "lcc_grid = create_nes(comm=None, info=False, projection='lcc',\n", + " lat_1=lat_1, lat_2=lat_2, lon_0=lon_0, lat_0=lat_0, \n", + " nx=nx, ny=ny, inc_x=inc_x, inc_y=inc_y, x_0=x_0, y_0=y_0)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
geometry
FID
0POLYGON ((-11.58393 32.47507, -11.54169 32.478...
1POLYGON ((-11.54169 32.47851, -11.49944 32.481...
2POLYGON ((-11.49944 32.48192, -11.45719 32.485...
3POLYGON ((-11.45719 32.48533, -11.41494 32.488...
4POLYGON ((-11.41494 32.48871, -11.37268 32.492...
......
145POLYGON ((-11.42882 32.99135, -11.38628 32.994...
146POLYGON ((-11.38628 32.99473, -11.34373 32.998...
147POLYGON ((-11.34373 32.99809, -11.30118 33.001...
148POLYGON ((-11.30118 33.00143, -11.25863 33.004...
149POLYGON ((-11.25863 33.00476, -11.21607 33.008...
\n", + "

150 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " geometry\n", + "FID \n", + "0 POLYGON ((-11.58393 32.47507, -11.54169 32.478...\n", + "1 POLYGON ((-11.54169 32.47851, -11.49944 32.481...\n", + "2 POLYGON ((-11.49944 32.48192, -11.45719 32.485...\n", + "3 POLYGON ((-11.45719 32.48533, -11.41494 32.488...\n", + "4 POLYGON ((-11.41494 32.48871, -11.37268 32.492...\n", + ".. ...\n", + "145 POLYGON ((-11.42882 32.99135, -11.38628 32.994...\n", + "146 POLYGON ((-11.38628 32.99473, -11.34373 32.998...\n", + "147 POLYGON ((-11.34373 32.99809, -11.30118 33.001...\n", + "148 POLYGON ((-11.30118 33.00143, -11.25863 33.004...\n", + "149 POLYGON ((-11.25863 33.00476, -11.21607 33.008...\n", + "\n", + "[150 rows x 1 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lcc_grid.create_shapefile()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\n", + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ...\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]\n", + "Length: 150, dtype: geometry" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "geometry_list = lcc_grid.shapefile['geometry'].values\n", + "geometry_list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Calculate area of each polygon" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([15830419.37602491, 15830657.31464759, 15830893.98187641,\n", + " 15831129.37902908, 15831363.50737192, 15831596.36818251,\n", + " 15831827.96271216, 15832058.29223234, 15832287.3580128 ,\n", + " 15832515.16128843, 15832888.43944364, 15833125.4618577 ,\n", + " 15833361.21722112, 15833595.70682441, 15833828.93193695,\n", + " 15834060.89385057, 15834291.59384502, 15834521.03319032,\n", + " 15834749.2131148 , 15834976.13488906, 15835346.79240354,\n", + " 15835582.8966068 , 15835817.73809013, 15836051.31816116,\n", + " 15836283.63810613, 15836514.69920246, 15836744.50270247,\n", + " 15836973.04988706, 15837200.34204102, 15837426.38040528,\n", + " 15837794.42326163, 15838029.60727211, 15838263.53292125,\n", + " 15838496.20149222, 15838727.61427387, 15838957.77256741,\n", + " 15839186.6776418 , 15839414.33076289, 15839640.73319616,\n", + " 15839865.88622452, 15840231.32048458, 15840465.58229638,\n", + " 15840698.59009752, 15840930.34519075, 15841160.84885779,\n", + " 15841390.10239228, 15841618.10708416, 15841844.86421011,\n", + " 15842070.37502717, 15842294.64079978, 15842657.47252579,\n", + " 15842890.8101492 , 15843122.89812364, 15843353.73774392,\n", + " 15843583.33033225, 15843811.67716125, 15844038.77951487,\n", + " 15844264.63868577, 15844489.2559287 , 15844712.63252152,\n", + " 15845072.86781775, 15845305.27923895, 15845536.44539522,\n", + " 15845766.36759449, 15845995.04712501, 15846222.4852872 ,\n", + " 15846448.68336277, 15846673.64263782, 15846897.36439707,\n", + " 15847119.84990175, 15847477.49487919, 15847708.97812176,\n", + " 15847939.22047551, 15848168.22324328, 15848395.9877448 ,\n", + " 15848622.51527306, 15848847.8071165 , 15849071.86456124,\n", + " 15849294.68888149, 15849516.28136931, 15849871.34221948,\n", + " 15850101.89526329, 15850331.21182007, 15850559.293196 ,\n", + " 15850786.14069547, 15851011.75562783, 15851236.13929178,\n", + " 15851459.2929683 , 15851681.21793849, 15851901.91547563,\n", + " 15852254.39832998, 15852484.01919013, 15852712.40796391,\n", + " 15852939.56596235, 15853165.49449526, 15853390.19487267,\n", + " 15853613.66838107, 15853835.91632964, 15854056.94000432,\n", + " 15854276.74067481, 15854626.65180506, 15854855.33845814,\n", + " 15855082.79744119, 15855309.03006979, 15855534.03765641,\n", + " 15855757.82150882, 15855980.3829386 , 15856201.72323178,\n", + " 15856421.84367417, 15856640.74556485, 15856988.09116465,\n", + " 15857215.84163662, 15857442.36884046, 15857667.67411114,\n", + " 15857891.75877949, 15858114.62415727, 15858336.27153077,\n", + " 15858556.70220796, 15858775.91748785, 15858993.91865496,\n", + " 15859338.70502081, 15859565.51727597, 15859791.11070865,\n", + " 15860015.48665859, 15860238.64643876, 15860460.59134635,\n", + " 15860681.3227187 , 15860900.84184616, 15861119.15002387,\n", + " 15861336.24853621, 15861678.48197006, 15861904.35401631,\n", + " 15862129.01168405, 15862352.45630977, 15862574.68920346,\n", + " 15862795.71170322, 15863015.52510921, 15863234.13072645,\n", + " 15863451.52986768, 15863667.72381984, 15864007.41061145,\n", + " 15864232.34043731, 15864456.06035349, 15864678.57167045,\n", + " 15864899.87571356, 15865119.97382447, 15865338.86731228,\n", + " 15865556.55748565, 15865773.04563914, 15865988.33307546])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "geometry_area = calculate_geometry_area(geometry_list)\n", + "geometry_area" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8 (default, Aug 12 2021, 07:06:15) \n[GCC 8.4.1 20200928 (Red Hat 8.4.1-1)]" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/6.Others/5.1.Add_Time_Bounds.ipynb b/tutorials/6.Others/6.1.Add_Time_Bounds.ipynb similarity index 100% rename from tutorials/6.Others/5.1.Add_Time_Bounds.ipynb rename to tutorials/6.Others/6.1.Add_Time_Bounds.ipynb diff --git a/tutorials/6.Others/5.3.Selecting.ipynb b/tutorials/6.Others/6.2.Selecting.ipynb similarity index 100% rename from tutorials/6.Others/5.3.Selecting.ipynb rename to tutorials/6.Others/6.2.Selecting.ipynb