示例#1
0
def _init_centroids(dis_xarray, centr_res_factor=1):
    """Get centroids from the firms dataset and refactor them.

    Parameters:
        dis_xarray (xarray): dataset obtained from ISIMIP netcdf

    Optional Parameters:
        centr_res_factor (float): the factor applied to voluntarly decrease/increase
            the centroids resolution

    Returns:
        centroids (Centroids)
    """
    res_data = np.min(
        np.abs([
            np.diff(dis_xarray.lon.values).min(),
            np.diff(dis_xarray.lat.values).min()
        ]))
    centroids = Centroids()
    centroids.set_raster_from_pnt_bounds(
        (dis_xarray.lon.values.min(), dis_xarray.lat.values.min(),
         dis_xarray.lon.values.max(), dis_xarray.lat.values.max()),
        res=res_data / centr_res_factor)
    centroids.set_meta_to_lat_lon()
    centroids.set_area_approx()
    centroids.set_on_land()
    centroids.empty_geometry_points()
    return centroids
示例#2
0
    def _select_exact_area(countries=[], reg=[]):
        """Extract coordinates of selected countries or region
        from NatID grid. If countries are given countries are cut,
        if only reg is given, the whole region is cut.
        Parameters:
            countries: List of countries
            reg: List of regions
        Raises:
            KeyError
        Returns:
            centroids
        """
        lat, lon = get_region_gridpoints(countries=countries,
                                         regions=reg,
                                         basemap="isimip",
                                         resolution=150)

        if reg:
            country_isos = region2isos(reg)
        else:
            country_isos = countries

        natIDs = country_iso2natid(country_isos)

        centroids = Centroids()
        centroids.set_lat_lon(lat, lon)
        centroids.id = np.arange(centroids.lon.shape[0])
        # centroids.set_region_id()
        return centroids, country_isos, natIDs
示例#3
0
    def test_meta_centroids_flood(self):
        min_lat, max_lat, min_lon, max_lon = 45.7, 47.8, 7.5, 10.5
        cent = Centroids()
        cent.set_raster_from_pnt_bounds((min_lon, min_lat, max_lon, max_lat),
                                        res=0.05)
        rf_rast = RiverFlood()
        rf_rast.set_from_nc(dph_path=HAZ_DEMO_FLDDPH,
                            frc_path=HAZ_DEMO_FLDFRC,
                            centroids=cent)
        self.assertEqual(rf_rast.centroids.shape, (43, 61))
        self.assertAlmostEqual(np.min(rf_rast.centroids.lat),
                               45.70000000000012, 4)
        self.assertAlmostEqual(np.max(rf_rast.centroids.lat), 47.8, 4)
        self.assertAlmostEqual(np.min(rf_rast.centroids.lon), 7.5, 4)
        self.assertAlmostEqual(np.max(rf_rast.centroids.lon),
                               10.49999999999999, 4)
        self.assertAlmostEqual(rf_rast.centroids.lon[90], 8.949999999999996, 4)
        self.assertAlmostEqual(rf_rast.centroids.lat[90], 47.75, 4)

        self.assertEqual(rf_rast.intensity.shape, (1, 2623))
        self.assertAlmostEqual(np.min(rf_rast.intensity), 0.0, 4)
        self.assertAlmostEqual(np.max(rf_rast.intensity), 5.8037286, 4)
        self.assertEqual(np.argmin(rf_rast.intensity), 0, 4)
        self.assertEqual(np.argmax(rf_rast.intensity), 55, 4)

        self.assertEqual(rf_rast.fraction.shape, (1, 2623))
        self.assertAlmostEqual(np.min(rf_rast.fraction), 0.0, 4)
        self.assertAlmostEqual(np.max(rf_rast.fraction), 0.4896, 4)
        self.assertEqual(np.argmin(rf_rast.fraction), 0, 4)
        self.assertEqual(np.argmax(rf_rast.fraction), 360, 4)
示例#4
0
def init_test_centroids(data):
    """define centroids for test data:"""
    centroids = Centroids()
    grid = np.meshgrid(np.arange(data.lat.min(), data.lat.max()+.5, .5),
                       np.arange(data.lon.min(), data.lon.max()+.5, .5))
    lat = list()
    lon = list()
    for arrlat, arrlon in zip(list(grid[0]), list(grid[1])):
        lat += list(arrlat)
        lon += list(arrlon)
    centroids.set_lat_lon(np.array(lat), np.array(lon))
    centroids.set_lat_lon_to_meta()
    return centroids
示例#5
0
 def select_exact_area(countries=[], reg=[]):
     """ Extract coordinates of selected countries or region
     from NatID grid. If countries are given countries are cut,
     if only reg is given, the whole region is cut.
     Parameters:
         countries: List of countries
         reg: List of regions
     Raises:
         KeyError
     Returns:
         centroids
     """
     centroids = Centroids()
     natID_info = pd.read_csv(NAT_REG_ID)
     isimip_grid = xr.open_dataset(GLB_CENTROIDS_NC)
     isimip_lon = isimip_grid.lon.data
     isimip_lat = isimip_grid.lat.data
     gridX, gridY = np.meshgrid(isimip_lon, isimip_lat)
     try:
         if countries:
             if not any(np.isin(natID_info['ISO'], countries)):
                 LOGGER.error('Country ISO3s ' + str(countries) +
                              ' unknown')
                 raise KeyError
             natID = natID_info["ID"][np.isin(natID_info["ISO"], countries)]
         elif reg:
             if not any(np.isin(natID_info["Reg_name"], reg)):
                 LOGGER.error('Shortcuts ' + str(reg) + ' unknown')
                 raise KeyError
             natID = natID_info["ID"][np.isin(natID_info["Reg_name"], reg)]
         else:
             centroids.lon = np.zeros((gridX.size))
             centroids.lat = np.zeros((gridX.size))
             centroids.lon = gridX.flatten()
             centroids.lat = gridY.flatten()
             centroids.id = np.arange(centroids.lon.shape[0])
             return centroids
     except KeyError:
         LOGGER.error('Selected country or region do ' +
                      'not match reference file')
         raise KeyError
     isimip_NatIdGrid = isimip_grid.NatIdGrid.data
     natID_pos = np.isin(isimip_NatIdGrid, natID)
     lon_coordinates = gridX[natID_pos]
     lat_coordinates = gridY[natID_pos]
     centroids.set_lat_lon(lat_coordinates, lon_coordinates)
     centroids.id = np.arange(centroids.lon.shape[0])
     centroids.set_region_id()
     return centroids
示例#6
0
    def select_exact_area_polygon(countries=[], reg=[]):
        """ Extract coordinates of selected countries or region
        from NatID grid. If countries are given countries are cut,
        if only reg is given, the whole region is cut.
        Parameters:
            countries: List of countries
            reg: List of regions
        Raises:
            AttributeError
        Returns:
            np.array
        """
        centroids = Centroids()
        natID_info = pd.read_csv(NAT_REG_ID)
        isimip_grid = xr.open_dataset(GLB_CENTROIDS_NC)
        isimip_lon = isimip_grid.lon.data
        isimip_lat = isimip_grid.lat.data
        gridX, gridY = np.meshgrid(isimip_lon, isimip_lat)
        if countries:
            natID = natID_info["ID"][np.isin(natID_info["ISO"], countries)]
        elif reg:
            natID = natID_info["ID"][np.isin(natID_info["Reg_name"], reg)]
        else:
            centroids.coord = np.zeros((gridX.size, 2))
            centroids.coord[:, 1] = gridX.flatten()
            centroids.coord[:, 0] = gridY.flatten()
            centroids.id = np.arange(centroids.coord.shape[0])
            return centroids
        isimip_NatIdGrid = isimip_grid.NatIdGrid.data
        natID_pos = np.isin(isimip_NatIdGrid, natID)
        lon_coordinates = gridX[natID_pos]
        lat_coordinates = gridY[natID_pos]
        centroids.coord = np.zeros((len(lon_coordinates), 2))
        centroids.coord[:, 1] = lon_coordinates
        centroids.coord[:, 0] = lat_coordinates
        centroids.id = np.arange(centroids.coord.shape[0])
        orig_proj = 'epsg:4326'
        country = gpd.GeoDataFrame()
        country['geometry'] = list(
            zip(centroids.coord[:, 1], centroids.coord[:, 0]))
        country['geometry'] = country['geometry'].apply(Point)
        country.crs = {'init': orig_proj}
        points = country.geometry.values
        concave_hull, _ = alpha_shape(points, alpha=1)

        return concave_hull
示例#7
0
    def test_centroids_flood(self):

        # this is going to go through the meta part
        rand_centroids = Centroids()
        lat = np.arange(47, 56, 0.2)
        lon = np.arange(5, 15, 0.2)
        lon, lat = np.meshgrid(lon, lat)
        rand_centroids.set_lat_lon(lat.flatten(), lon.flatten())
        rf = RiverFlood()
        rf.set_from_nc(dph_path=HAZ_DEMO_FLDDPH,
                       frc_path=HAZ_DEMO_FLDFRC,
                       centroids=rand_centroids,
                       ISINatIDGrid=False)

        self.assertEqual(rf.date[0], 730303)
        self.assertEqual(rf.event_id[0], 0)
        self.assertEqual(rf.event_name[0], '2000')
        self.assertEqual(rf.orig[0], False)
        self.assertAlmostEqual(rf.frequency[0], 1.)

        self.assertEqual(rf.centroids.shape, (45, 50))
        self.assertAlmostEqual(np.min(rf.centroids.lat), 47.0, 4)
        self.assertAlmostEqual(np.max(rf.centroids.lat), 55.8, 4)
        self.assertAlmostEqual(np.min(rf.centroids.lon), 5.0, 4)
        self.assertAlmostEqual(np.max(rf.centroids.lon), 14.8, 4)
        self.assertAlmostEqual(rf.centroids.lon[90], 13.0, 4)
        self.assertAlmostEqual(rf.centroids.lat[90], 47.2, 4)

        self.assertEqual(rf.intensity.shape, (1, 2250))
        self.assertAlmostEqual(np.min(rf.intensity), 0.0, 4)
        self.assertAlmostEqual(np.max(rf.intensity), 8.921593, 4)
        self.assertEqual(np.argmin(rf.intensity), 0, 4)
        self.assertEqual(np.argmax(rf.intensity), 191, 4)

        self.assertEqual(rf.fraction.shape, (1, 2250))
        self.assertAlmostEqual(np.min(rf.fraction), 0.0, 4)
        self.assertAlmostEqual(np.max(rf.fraction), 0.92, 4)
        self.assertEqual(np.argmin(rf.fraction), 0, 4)
        self.assertEqual(np.argmax(rf.fraction), 1438, 4)
Test tc_surge module.
"""
import os
import copy
import unittest
import numpy as np

from climada.hazard import TCSurge, TropCyclone, TCTracks
from climada.hazard.centroids import Centroids

DATA_DIR = os.path.join(os.path.dirname(__file__), os.pardir,
                        'hazard/test/data')
TEST_TRACK = os.path.join(DATA_DIR, "trac_brb_test.csv")

CENTR_TEST_BRB = Centroids()
CENTR_TEST_BRB.read_mat(os.path.join(DATA_DIR, 'centr_brb_test.mat'))


class TestEnd2End(unittest.TestCase):
    """Test reading TC from IBTrACS files"""
    def test_track_to_surge_point_pass(self):
        """ Test set_from_winds with default points (same as as_pixel=False) """

        tc_track = TCTracks()
        tc_track.read_processed_ibtracs_csv(TEST_TRACK)
        tc_track.calc_random_walk()
        tc_track.equal_timestep()

        tc_haz = TropCyclone()
        tc_haz.set_from_tracks(tc_track, CENTR_TEST_BRB)
示例#9
0
    def select_window_area(countries=[], reg=[]):
        """ Extract coordinates of selected countries or region
        from NatID in a rectangular box. If countries are given countries
        are cut, if only reg is given, the whole region is cut.
        Parameters:
            countries: List of countries
            reg: List of regions
        Raises:
            AttributeError
        Returns:
            np.array
        """
        centroids = Centroids()
        natID_info = pd.read_csv(NAT_REG_ID)
        isimip_grid = xr.open_dataset(GLB_CENTROIDS_NC)
        isimip_lon = isimip_grid.lon.data
        isimip_lat = isimip_grid.lat.data
        gridX, gridY = np.meshgrid(isimip_lon, isimip_lat)
        if countries:
            if not any(np.isin(natID_info['ISO'], countries)):
                LOGGER.error('Country ISO3s ' + str(countries) + ' unknown')
                raise KeyError
            natID = natID_info["ID"][np.isin(natID_info["ISO"], countries)]
        elif reg:
            natID = natID_info["ID"][np.isin(natID_info["Reg_name"], reg)]
            if not any(np.isin(natID_info["Reg_name"], reg)):
                LOGGER.error('Shortcuts ' + str(reg) + ' unknown')
                raise KeyError
        else:
            centroids.lat = np.zeros((gridX.size))
            centroids.lon = np.zeros((gridX.size))
            centroids.lon = gridX.flatten()
            centroids.lat = gridY.flatten()
            centroids.id = np.arange(centroids.lon.shape[0])
            centroids.id = np.arange(centroids.lon.shape[0])
            return centroids
        isimip_NatIdGrid = isimip_grid.NatIdGrid.data
        natID_pos = np.isin(isimip_NatIdGrid, natID)
        lon_coordinates = gridX[natID_pos]
        lat_coordinates = gridY[natID_pos]
        lon_min = math.floor(min(lon_coordinates))
        if lon_min <= -179:
            lon_inmin = 0
        else:
            lon_inmin = min(np.where((isimip_lon >= lon_min))[0]) - 1
        lon_max = math.ceil(max(lon_coordinates))
        if lon_max >= 179:
            lon_inmax = len(isimip_lon) - 1
        else:
            lon_inmax = max(np.where((isimip_lon <= lon_max))[0]) + 1
        lat_min = math.floor(min(lat_coordinates))
        if lat_min <= -89:
            lat_inmin = 0
        else:
            lat_inmin = min(np.where((isimip_lat >= lat_min))[0]) - 1
        lat_max = math.ceil(max(lat_coordinates))
        if lat_max >= 89:
            lat_max = len(isimip_lat) - 1
        else:
            lat_inmax = max(np.where((isimip_lat <= lat_max))[0]) + 1
        lon = isimip_lon[lon_inmin:lon_inmax]
        lat = isimip_lat[lat_inmin:lat_inmax]

        gridX, gridY = np.meshgrid(lon, lat)
        lat = np.zeros((gridX.size))
        lon = np.zeros((gridX.size))
        lon = gridX.flatten()
        lat = gridY.flatten()
        centroids.set_lat_lon(lat, lon)
        centroids.id = np.arange(centroids.coord.shape[0])
        centroids.set_region_id()

        return centroids
示例#10
0
 def _set_centroids_from_file(self, lon, lat):
     self.centroids = Centroids()
     gridX, gridY = np.meshgrid(lon, lat)
     self.centroids.set_lat_lon(gridY.flatten(), gridX.flatten())