Exemplo n.º 1
0
def populate_datamart():
    print 'populate datamart'
    adminlevel_REG = AdminLevelType.get(u'REG')

    from functools import partial
    import pyproj
    from shapely.ops import transform

    project = partial(pyproj.transform, pyproj.Proj(init='epsg:4326'),
                      pyproj.Proj(init='epsg:3857'))

    shape = MultiPolygon([Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)])])
    reprojected = transform(project, shape)
    geometry = from_shape(reprojected, 3857)

    div = AdministrativeDivision(
        **{
            'code': 30,
            'leveltype_id': adminlevel_REG.id,
            'name': u'Administrative division level 3'
        })
    div.geom = geometry
    div.hazardcategories = []
    DBSession.add(div)

    DBSession.flush()
Exemplo n.º 2
0
def upscale_hazardcategories(target_adminlevel_mnemonic):
    # identify the admin divisions matching the given level:
    admindivs = DBSession.query(AdministrativeDivision)\
        .join(AdminLevelType) \
        .filter(AdminLevelType.mnemonic == target_adminlevel_mnemonic)
    hazardtypes = DBSession.query(HazardType)
    # for each of these admin divisions and hazard types,
    # identify the highest HazardCategory among their children:
    for admindiv in admindivs:
        # identify max(level) for each hazardtype across children
        for hazardtype in hazardtypes:
            hazardcategory = DBSession.query(HazardCategory) \
                .join((AdministrativeDivision, HazardCategory.administrativedivisions)) \
                .join(HazardType) \
                .join(HazardLevel) \
                .filter(HazardType.id == hazardtype.id) \
                .filter(AdministrativeDivision.parent == admindiv) \
                .order_by(HazardLevel.order.asc()).first()
            if hazardcategory:
                # find the highest hazardlevel for all children admindivs
                print '[upscaling] admindiv {} inherits hazardlevel {} for {}'\
                    .format(admindiv.code, hazardcategory.hazardlevel_id,
                            hazardcategory.hazardtype.mnemonic)
                admindiv.hazardcategories.append(hazardcategory)
                DBSession.add(admindiv)
Exemplo n.º 3
0
def populate_preprocessed(type):
    hazardset_id = u'preprocessed'
    hazardtype = HazardType.get(type)

    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset = HazardSet(
        id=hazardset_id,
        hazardtype=hazardtype,
        local=False,
        data_lastupdated_date=datetime.now(),
        metadata_lastupdated_date=datetime.now())
    DBSession.add(hazardset)

    layer = Layer(
        hazardlevel=None,
        mask=False,
        return_period=None,
        data_lastupdated_date=datetime.now(),
        metadata_lastupdated_date=datetime.now(),
        geonode_id=new_geonode_id(),
        download_url='test',
        calculation_method_quality=5,
        scientific_quality=1,
        local=False,
        downloaded=True
    )
    hazardset.layers.append(layer)

    hazardset.complete = True
    DBSession.flush()
Exemplo n.º 4
0
def populate_notpreprocessed(type, unit):
    hazardset_id = u'notpreprocessed'
    hazardtype = HazardType.get(type)
    hazardtype_settings = settings['hazard_types'][hazardtype.mnemonic]

    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset = HazardSet(
        id=hazardset_id,
        hazardtype=hazardtype,
        local=False,
        data_lastupdated_date=datetime.now(),
        metadata_lastupdated_date=datetime.now())
    DBSession.add(hazardset)

    return_periods = hazardtype_settings['return_periods']

    for level in (u'HIG', u'MED', u'LOW'):
        hazardlevel = HazardLevel.get(level)
        level_return_periods = return_periods[level]
        if isinstance(level_return_periods, list):
            return_period = level_return_periods[0]
        else:
            return_period = level_return_periods

        layer = Layer(
            hazardlevel=hazardlevel,
            mask=False,
            return_period=return_period,
            hazardunit=unit,
            data_lastupdated_date=datetime.now(),
            metadata_lastupdated_date=datetime.now(),
            geonode_id=new_geonode_id(),
            download_url='test',
            calculation_method_quality=5,
            scientific_quality=1,
            local=False,
            downloaded=True
        )
        hazardset.layers.append(layer)

    layer = Layer(
        hazardlevel=None,
        mask=True,
        return_period=hazardtype_settings['mask_return_period'],
        hazardunit=unit,
        data_lastupdated_date=datetime.now(),
        metadata_lastupdated_date=datetime.now(),
        geonode_id=new_geonode_id(),
        download_url='test',
        calculation_method_quality=5,
        scientific_quality=1,
        local=False,
        downloaded=True
    )
    hazardset.layers.append(layer)

    hazardset.complete = True
    DBSession.flush()
def add_resource(hazard_type, resource):
    categories = DBSession.query(HazardCategory) \
        .join(HazardType) \
        .filter(HazardType.mnemonic == hazard_type)
    for category in categories:
        association = HazardCategoryFurtherResourceAssociation(order=1)
        association.hazardcategory = category
        resource.hazardcategory_associations.append(association)
    DBSession.add(resource)
Exemplo n.º 6
0
def process_outputs():
    print "Decision Tree running..."
    # first of all, remove all records
    # in the datamart table linking admin divs with hazard categories:
    hazardcategory_administrativedivision_table.delete()
    # identify the admin level for which we run the decision tree:
    # (REG)ion aka admin level 2
    dt_level = DBSession.query(AdminLevelType)\
        .filter(AdminLevelType.mnemonic == u'REG').one()
    # then, identify the unique (admindiv, hazardtype) tuples
    # contained in the Output table:
    admindiv_hazardtype_tuples = (
        DBSession.query(AdministrativeDivision, HazardType).distinct()
        .join(Output)
        .join(HazardSet)
        .join(HazardType)
        # the following should not be necessary in production
        # because only the lowest admin levels should be inserted
        # in the Output table:
        .filter(AdministrativeDivision.leveltype_id == dt_level.id)
        # not necessary, but practical for debugging:
        .order_by(AdministrativeDivision.code)
    )
    # for each tuple, identify the most relevant HazardSet
    # in the light of the criteria that we all agreed on (cf Decision Tree):
    for (admindiv, hazardtype) in admindiv_hazardtype_tuples:
        (hazardset, output) = DBSession.query(HazardSet, Output) \
            .join(Output) \
            .filter(Output.admin_id == admindiv.id) \
            .filter(HazardSet.hazardtype_id == hazardtype.id) \
            .order_by(HazardSet.calculation_method_quality.desc(),
                      HazardSet.scientific_quality.desc(),
                      HazardSet.local.desc(),
                      HazardSet.data_lastupdated_date.desc()).first()
        print "[decision tree] admindiv {} gets hazardlevel {} from {} for {}"\
            .format(admindiv.code, output.hazardlevel_id, hazardset.id,
                    hazardtype.mnemonic)
        # find the relevant HazardCategory for the current hazardtype
        # and the hazardset's hazardlevel
        hazardcategory = DBSession.query(HazardCategory) \
            .filter(HazardCategory.hazardtype_id == hazardtype.id) \
            .filter(HazardCategory.hazardlevel_id == output.hazardlevel_id) \
            .one()
        # append new hazardcategory to current admin div:
        admindiv.hazardcategories.append(hazardcategory)
        DBSession.add(admindiv)

    # UpScaling level2 (REG)ion -> level1 (PRO)vince
    upscale_hazardcategories(u'PRO')
    # UpScaling level1 (PRO)vince -> level0 (COU)ntry
    upscale_hazardcategories(u'COU')

    transaction.commit()
Exemplo n.º 7
0
def populate_datamart():
    print 'populate datamart'
    adminlevel_REG = AdminLevelType.get(u'REG')

    shape = MultiPolygon([
        Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)])
    ])
    geometry = from_shape(shape, 4326)

    div = AdministrativeDivision(**{
        'code': 30,
        'leveltype_id': adminlevel_REG.id,
        'name': u'Administrative division level 3'
    })
    div.geom = geometry
    div.hazardcategories = []
    DBSession.add(div)

    DBSession.flush()
Exemplo n.º 8
0
def populate_processing():
    print 'populate processing'
    hazardset_id = u'test'
    hazardtype = HazardType.get(u'EQ')
    hazardtype_settings = settings['hazard_types'][hazardtype.mnemonic]

    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset = HazardSet()
    hazardset.id = hazardset_id
    hazardset.hazardtype = hazardtype
    hazardset.local = False
    hazardset.data_lastupdated_date = datetime.now()
    hazardset.metadata_lastupdated_date = datetime.now()
    DBSession.add(hazardset)

    return_periods = hazardtype_settings['global']['return_periods']
    unit = hazardtype_settings['thresholds'].keys()[0]

    for level in (u'HIG', u'MED', u'LOW'):
        hazardlevel = HazardLevel.get(level)
        return_period = return_periods[level]

        layer = Layer()
        layer.title = "{}-{}".format(id, return_period)
        layer.hazardlevel = hazardlevel
        layer.return_period = return_period
        layer.hazardunit = unit
        layer.data_lastupdated_date = datetime.now()
        layer.metadata_lastupdated_date = datetime.now()
        layer.geonode_id = new_geonode_id()
        layer.download_url = 'test'
        layer.calculation_method_quality = 5
        layer.scientific_quality = 1
        layer.local = False
        layer.downloaded = True
        hazardset.layers.append(layer)
        DBSession.flush()

    hazardset.complete = True
    DBSession.flush()
Exemplo n.º 9
0
def populate_db():
    config = ConfigParser.ConfigParser()
    config.read(local_settings_path)
    db_url = config.get('app:main', 'sqlalchemy.url')

    from sqlalchemy import create_engine
    engine = create_engine(db_url)

    from ..scripts.initializedb import populate_db as populate
    populate(engine, drop_all=True)

    shape = MultiPolygon([
        Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)])
    ])
    geometry = from_shape(shape, 4326)

    div_level_1 = AdministrativeDivision(**{
        'code': 10,
        'leveltype_id': 1,
        'name': u'Division level 1'
    })
    div_level_1.geom = geometry
    DBSession.add(div_level_1)

    div_level_2 = AdministrativeDivision(**{
        'code': 20,
        'leveltype_id': 2,
        'name': u'Division level 2'
    })
    div_level_2.parent_code = div_level_1.code
    div_level_2.geom = geometry
    DBSession.add(div_level_2)

    shape = MultiPolygon([
        Polygon([(0, 0), (0, 1), (.5, 1), (.5, 0), (0, 0)])
    ])
    geometry = from_shape(shape, 4326)

    div_level_3_1 = AdministrativeDivision(**{
        'code': 30,
        'leveltype_id': 3,
        'name': u'Division level 3 - 1'
    })
    div_level_3_1.parent_code = div_level_2.code
    div_level_3_1.geom = geometry
    div_level_3_1.hazardcategories = []

    shape = MultiPolygon([
        Polygon([(.5, 0), (.5, 1), (1, 1), (1, 0), (.5, 0)])
    ])
    geometry = from_shape(shape, 4326)

    div_level_3_2 = AdministrativeDivision(**{
        'code': 31,
        'leveltype_id': 3,
        'name': u'Division level 3 - 2'
    })
    div_level_3_2.parent_code = div_level_2.code
    div_level_3_2.geom = geometry
    div_level_3_2.hazardcategories = []

    category_eq_hig = HazardCategory(**{
        'general_recommendation': u'General recommendation for EQ HIG',
    })
    category_eq_hig.hazardtype = DBSession.query(HazardType) \
        .filter(HazardType.mnemonic == u'EQ').one()
    category_eq_hig.hazardlevel = DBSession.query(HazardLevel) \
        .filter(HazardLevel.mnemonic == u'HIG').one()

    associate_admindiv_hazardcategory(div_level_3_1, category_eq_hig, u'test')
    associate_admindiv_hazardcategory(div_level_3_2, category_eq_hig, u'test')

    climate_rec = ClimateChangeRecommendation()
    climate_rec.text = u'Climate change recommendation'
    climate_rec.administrativedivision = div_level_1
    climate_rec.hazardtype = DBSession.query(HazardType) \
        .filter(HazardType.mnemonic == u'EQ').one()
    DBSession.add(climate_rec)

    technical_rec = TechnicalRecommendation(**{
        'text': u'Recommendation #1 for earthquake, applied to'
                ' hazard categories HIG, MED and LOW'
    })
    association = HazardCategoryTechnicalRecommendationAssociation(order=1)
    association.hazardcategory = category_eq_hig
    technical_rec.hazardcategory_associations.append(association)
    DBSession.add(technical_rec)

    technical_rec = TechnicalRecommendation(**{
        'text': u'Educational web resources on earthquakes and'
                ' seismic hazard'
    })
    association = HazardCategoryTechnicalRecommendationAssociation(order=1)
    association.hazardcategory = category_eq_hig
    technical_rec.hazardcategory_associations.append(association)
    DBSession.add(technical_rec)

    category_fl_med = HazardCategory(**{
        'general_recommendation': u'General recommendation for FL MED',
    })
    category_fl_med.hazardtype = DBSession.query(HazardType) \
        .filter(HazardType.mnemonic == u'FL').one()
    category_fl_med.hazardlevel = DBSession.query(HazardLevel) \
        .filter(HazardLevel.mnemonic == u'MED').one()

    associate_admindiv_hazardcategory(div_level_3_1, category_fl_med, u'test')
    DBSession.add(div_level_3_1)
    associate_admindiv_hazardcategory(div_level_3_2, category_fl_med, u'test')
    DBSession.add(div_level_3_2)

    further_resource = FurtherResource(**{
        'text': u'Educational web resources on earthquakes and' +
                ' seismic hazard',
        'url': u'http://earthquake.usgs.gov/learn/?source=sitemap'
    })
    association = HazardCategoryFurtherResourceAssociation(order=1)
    association.hazardcategory = category_eq_hig
    further_resource.hazardcategory_associations.append(association)
    DBSession.add(further_resource)

    # Add further resource for one division only
    further_resource = FurtherResource(**{
        'text': u'Further resource specific to division level 3 - 2',
        'url': u'http://domain.com/the/document/url.txt'
    })
    association = HazardCategoryFurtherResourceAssociation(order=2)
    association.hazardcategory = category_eq_hig
    association.administrativedivision = div_level_3_2
    further_resource.hazardcategory_associations.append(association)
    DBSession.add(further_resource)
def populate_datamart():
    shape = Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)])
    geometry = from_shape(shape, 3857)

    div_level_1 = AdministrativeDivision(**{
        'code': 10,
        'leveltype_id': 1,
        'name': u'Division level 1'
    })
    div_level_1.geom = geometry
    DBSession.add(div_level_1)

    div_level_2 = AdministrativeDivision(**{
        'code': 20,
        'leveltype_id': 2,
        'name': u'Division level 2'
    })
    div_level_2.parent_code = div_level_1.code
    div_level_2.geom = geometry
    DBSession.add(div_level_2)

    div_level_3_0 = AdministrativeDivision(**{
        'code': 30,
        'leveltype_id': 3,
        'name': u'Division level 3 - 1'
    })
    div_level_3_0.parent_code = div_level_2.code
    div_level_3_0.geom = geometry
    div_level_3_0.hazardcategories = []
    DBSession.add(div_level_3_0)

    div_level_3_1 = AdministrativeDivision(**{
        'code': 31,
        'leveltype_id': 3,
        'name': u'Division level 3 - 1'
    })
    div_level_3_1.parent_code = div_level_2.code
    div_level_3_1.geom = geometry
    div_level_3_1.hazardcategories = []
    DBSession.add(div_level_3_1)

    div_level_3_2 = AdministrativeDivision(**{
        'code': 32,
        'leveltype_id': 3,
        'name': u'Division level 3 - 2'
    })
    div_level_3_2.parent_code = div_level_2.code
    div_level_3_2.geom = geometry
    div_level_3_2.hazardcategories = []
    DBSession.add(div_level_3_2)

    div_level_3_3 = AdministrativeDivision(**{
        'code': 33,
        'leveltype_id': 3,
        'name': u'Division level 3 - 3'
    })
    div_level_3_3.parent_code = div_level_2.code
    div_level_3_3.geom = geometry
    div_level_3_3.hazardcategories = []
    DBSession.add(div_level_3_3)

    div_level_3_4 = AdministrativeDivision(**{
        'code': 34,
        'leveltype_id': 3,
        'name': u'Division level 3 - 4'
    })
    div_level_3_4.parent_code = div_level_2.code
    div_level_3_4.geom = geometry
    div_level_3_4.hazardcategories = []
    DBSession.add(div_level_3_4)

    div_level_3_5 = AdministrativeDivision(**{
        'code': 35,
        'leveltype_id': 3,
        'name': u'Division level 3 - 5'
    })
    div_level_3_5.parent_code = div_level_2.code
    div_level_3_5.geom = geometry
    div_level_3_5.hazardcategories = []
    DBSession.add(div_level_3_5)

    div_level_3_6 = AdministrativeDivision(**{
        'code': 36,
        'leveltype_id': 3,
        'name': u'Division level 3 - 6'
    })
    div_level_3_6.parent_code = div_level_2.code
    div_level_3_6.geom = geometry
    div_level_3_6.hazardcategories = []
    DBSession.add(div_level_3_6)

    DBSession.flush()
def populate_processing():
    hazardtypeEQ = HazardType.get(u'EQ')
    hazardtypeFL = HazardType.get(u'FL')

    hazardset_id = u'hazardset1'
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset1 = HazardSet()
    hazardset1.id = hazardset_id
    hazardset1.hazardtype = hazardtypeEQ
    hazardset1.local = False
    hazardset1.calculation_method_quality = 0
    hazardset1.data_lastupdated_date = datetime.now()
    hazardset1.metadata_lastupdated_date = datetime.now()
    hazardset1.complete = True
    hazardset1.layers.extend(make_layers())
    DBSession.add(hazardset1)

    hazardset_id = u'hazardset1b'
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset1b = HazardSet()
    hazardset1b.id = hazardset_id
    hazardset1b.hazardtype = hazardtypeFL
    hazardset1b.local = True
    hazardset1b.calculation_method_quality = 3
    hazardset1b.data_lastupdated_date = datetime.now()
    hazardset1b.metadata_lastupdated_date = datetime.now()
    hazardset1b.complete = True
    hazardset1b.layers.extend(make_layers())
    DBSession.add(hazardset1b)

    # create hazardsets 2, 3 ... 5
    hazardset_id = u'hazardset2'
    # calculation_method_quality = 1 / scientific_quality = 0
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset2 = HazardSet()
    hazardset2.id = hazardset_id
    hazardset2.hazardtype = hazardtypeEQ
    hazardset2.local = True
    hazardset2.calculation_method_quality = 1
    hazardset2.scientific_quality = 0
    hazardset2.data_lastupdated_date = datetime.now()
    hazardset2.metadata_lastupdated_date = datetime.now()
    hazardset2.complete = True
    hazardset2.layers.extend(make_layers())
    DBSession.add(hazardset2)

    hazardset_id = u'hazardset3'
    # date = 2015-01-01 / global /
    # calculation_method_quality = 1 / scientific_quality = 2
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset3 = HazardSet()
    hazardset3.id = hazardset_id
    hazardset3.hazardtype = hazardtypeEQ
    hazardset3.local = False
    hazardset3.calculation_method_quality = 1
    hazardset3.scientific_quality = 2
    hazardset3.data_lastupdated_date = datetime(2015, 1, 1, 0, 0)
    hazardset3.metadata_lastupdated_date = datetime.now()
    hazardset3.complete = True
    hazardset3.layers.extend(make_layers())
    DBSession.add(hazardset3)

    hazardset_id = u'hazardset4'
    # date = 2015-01-01 / local /
    # calculation_method_quality = 1 / scientific_quality = 2
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset4 = HazardSet()
    hazardset4.id = hazardset_id
    hazardset4.hazardtype = hazardtypeEQ
    hazardset4.local = True
    hazardset4.calculation_method_quality = 1
    hazardset4.scientific_quality = 2
    hazardset4.data_lastupdated_date = datetime(2015, 1, 1, 0, 0)
    hazardset4.metadata_lastupdated_date = datetime.now()
    hazardset4.complete = True
    hazardset4.layers.extend(make_layers())
    DBSession.add(hazardset4)

    hazardset_id = u'hazardset5'
    # date = now() / local /
    # calculation_method_quality = 1 / scientific_quality = 2
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset5 = HazardSet()
    hazardset5.id = hazardset_id
    hazardset5.hazardtype = hazardtypeEQ
    hazardset5.local = True
    hazardset5.calculation_method_quality = 1
    hazardset5.scientific_quality = 2
    hazardset5.data_lastupdated_date = datetime.now()
    hazardset5.metadata_lastupdated_date = datetime.now()
    hazardset5.complete = True
    hazardset5.layers.extend(make_layers())
    DBSession.add(hazardset5)

    hazardset_id = u'hazardset6'
    # date = now() / global /
    # calculation_method_quality = 1 / scientific_quality = 2
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset6 = HazardSet()
    hazardset6.id = hazardset_id
    hazardset6.hazardtype = hazardtypeEQ
    hazardset6.local = False
    hazardset6.calculation_method_quality = 1
    hazardset6.scientific_quality = 2
    hazardset6.data_lastupdated_date = datetime.now()
    hazardset6.metadata_lastupdated_date = datetime.now()
    hazardset6.complete = True
    hazardset6.layers.extend(make_layers())
    DBSession.add(hazardset6)

    # populate output table

    # admin div (code 30) has only one hazardset for EQ
    admin30 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 30).one()
    # => test outcome = hazardset1
    output1 = Output()
    output1.coverage_ratio = 10
    output1.hazardset = hazardset1
    output1.administrativedivision = admin30
    output1.hazardlevel = HazardLevel.get(u'HIG')
    DBSession.add(output1)

    # admin div (code 30) also has another hazardset
    # but this one is for FL
    # => test outcome = hazardset1b
    output1b = Output()
    output1b.coverage_ratio = 11
    output1b.hazardset = hazardset1b
    output1b.administrativedivision = admin30
    output1b.hazardlevel = HazardLevel.get(u'NPR')
    DBSession.add(output1b)

    # admin div (code 31) has 2 hazardsets,
    # one with a higher calculation_method_quality
    # => test outcome = hazardset2
    admin31 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 31).one()
    output2 = Output()
    output2.coverage_ratio = 20
    output2.hazardset = hazardset1  # calculation_method_quality = 0
    output2.administrativedivision = admin31
    output2.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output2)
    output3 = Output()
    output3.coverage_ratio = 30
    output3.hazardset = hazardset2  # calculation_method_quality = 1
    output3.administrativedivision = admin31
    output3.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output3)

    # admin div (code 32) has 2 hazardsets,
    # both share the same calculation_method_quality,
    # one with a higher scientific_quality
    # => test outcome = hazardset3
    admin32 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 32).one()
    output4 = Output()
    output4.coverage_ratio = 40
    output4.hazardset = hazardset2
    # calculation_method_quality = 1 / scientific_quality = 0
    output4.administrativedivision = admin32
    output4.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output4)
    output5 = Output()
    output5.coverage_ratio = 50
    output5.hazardset = hazardset3
    # calculation_method_quality = 1 / scientific_quality = 2
    output5.administrativedivision = admin32
    output5.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output5)

    # admin div (code 33) has 2 hazardsets,
    # both share the same ratings, one is global, one local
    # => test outcome = hazardset4
    admin33 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 33).one()
    output6 = Output()
    output6.coverage_ratio = 60
    output6.hazardset = hazardset3
    # global / calculation_method_quality = 1 / scientific_quality = 2
    output6.administrativedivision = admin33
    output6.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output6)
    output7 = Output()
    output7.coverage_ratio = 70
    output7.hazardset = hazardset4
    # local / calculation_method_quality = 1 / scientific_quality = 2
    output7.administrativedivision = admin33
    output7.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output7)

    # admin div (code 34) has 2 hazardsets,
    # both share the same ratings, are local, one is more recent
    # => test outcome = hazardset5
    admin34 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 34).one()
    output8 = Output()
    output8.coverage_ratio = 80
    output8.hazardset = hazardset4
    # date = 2015-01-01 / local /
    # calculation_method_quality = 1 / scientific_quality = 2
    output8.administrativedivision = admin34
    output8.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output8)
    output9 = Output()
    output9.coverage_ratio = 90
    output9.hazardset = hazardset5
    # date = now() / local /
    # calculation_method_quality = 1 / scientific_quality = 2
    output9.administrativedivision = admin34
    output9.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output9)

    # admin div (code 35) has 2 hazardsets,
    # both share the same ratings, are global, one is more recent
    # => test outcome = hazardset6
    admin35 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 35).one()
    output10 = Output()
    output10.coverage_ratio = 95
    output10.hazardset = hazardset3
    # date = 2015-01-01 / global /
    # calculation_method_quality = 1 / scientific_quality = 2
    output10.administrativedivision = admin35
    output10.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output10)
    output11 = Output()
    output11.coverage_ratio = 99
    output11.hazardset = hazardset6
    # date = now() / global /
    # calculation_method_quality = 1 / scientific_quality = 2
    output11.administrativedivision = admin35
    output11.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output11)

    DBSession.flush()
def populate_datamart():
    shape = Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)])
    geometry = from_shape(shape, 3857)

    div_level_1 = AdministrativeDivision(**{
        'code': 10,
        'leveltype_id': 1,
        'name': u'Division level 1'
    })
    div_level_1.geom = geometry
    DBSession.add(div_level_1)

    div_level_2 = AdministrativeDivision(**{
        'code': 20,
        'leveltype_id': 2,
        'name': u'Division level 2'
    })
    div_level_2.parent_code = div_level_1.code
    div_level_2.geom = geometry
    DBSession.add(div_level_2)

    div_level_3_0 = AdministrativeDivision(**{
        'code': 30,
        'leveltype_id': 3,
        'name': u'Division level 3 - 1'
    })
    div_level_3_0.parent_code = div_level_2.code
    div_level_3_0.geom = geometry
    div_level_3_0.hazardcategories = []
    DBSession.add(div_level_3_0)

    div_level_3_1 = AdministrativeDivision(**{
        'code': 31,
        'leveltype_id': 3,
        'name': u'Division level 3 - 1'
    })
    div_level_3_1.parent_code = div_level_2.code
    div_level_3_1.geom = geometry
    div_level_3_1.hazardcategories = []
    DBSession.add(div_level_3_1)

    div_level_3_2 = AdministrativeDivision(**{
        'code': 32,
        'leveltype_id': 3,
        'name': u'Division level 3 - 2'
    })
    div_level_3_2.parent_code = div_level_2.code
    div_level_3_2.geom = geometry
    div_level_3_2.hazardcategories = []
    DBSession.add(div_level_3_2)

    div_level_3_3 = AdministrativeDivision(**{
        'code': 33,
        'leveltype_id': 3,
        'name': u'Division level 3 - 3'
    })
    div_level_3_3.parent_code = div_level_2.code
    div_level_3_3.geom = geometry
    div_level_3_3.hazardcategories = []
    DBSession.add(div_level_3_3)

    div_level_3_4 = AdministrativeDivision(**{
        'code': 34,
        'leveltype_id': 3,
        'name': u'Division level 3 - 4'
    })
    div_level_3_4.parent_code = div_level_2.code
    div_level_3_4.geom = geometry
    div_level_3_4.hazardcategories = []
    DBSession.add(div_level_3_4)

    div_level_3_5 = AdministrativeDivision(**{
        'code': 35,
        'leveltype_id': 3,
        'name': u'Division level 3 - 5'
    })
    div_level_3_5.parent_code = div_level_2.code
    div_level_3_5.geom = geometry
    div_level_3_5.hazardcategories = []
    DBSession.add(div_level_3_5)

    div_level_3_6 = AdministrativeDivision(**{
        'code': 36,
        'leveltype_id': 3,
        'name': u'Division level 3 - 6'
    })
    div_level_3_6.parent_code = div_level_2.code
    div_level_3_6.geom = geometry
    div_level_3_6.hazardcategories = []
    DBSession.add(div_level_3_6)

    DBSession.flush()
def populate_processing():
    hazardtypeEQ = HazardType.get(u'EQ')
    hazardtypeFL = HazardType.get(u'FL')

    hazardset_id = u'hazardset1'
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset1 = HazardSet()
    hazardset1.id = hazardset_id
    hazardset1.hazardtype = hazardtypeEQ
    hazardset1.local = False
    hazardset1.calculation_method_quality = 0
    hazardset1.data_lastupdated_date = datetime.now()
    hazardset1.metadata_lastupdated_date = datetime.now()
    hazardset1.complete = True
    hazardset1.layers.extend(make_layers())
    DBSession.add(hazardset1)

    hazardset_id = u'hazardset1b'
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset1b = HazardSet()
    hazardset1b.id = hazardset_id
    hazardset1b.hazardtype = hazardtypeFL
    hazardset1b.local = True
    hazardset1b.calculation_method_quality = 3
    hazardset1b.data_lastupdated_date = datetime.now()
    hazardset1b.metadata_lastupdated_date = datetime.now()
    hazardset1b.complete = True
    hazardset1b.layers.extend(make_layers())
    DBSession.add(hazardset1b)

    # create hazardsets 2, 3 ... 5
    hazardset_id = u'hazardset2'
    # calculation_method_quality = 1 / scientific_quality = 0
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset2 = HazardSet()
    hazardset2.id = hazardset_id
    hazardset2.hazardtype = hazardtypeEQ
    hazardset2.local = True
    hazardset2.calculation_method_quality = 1
    hazardset2.scientific_quality = 0
    hazardset2.data_lastupdated_date = datetime.now()
    hazardset2.metadata_lastupdated_date = datetime.now()
    hazardset2.complete = True
    hazardset2.layers.extend(make_layers())
    DBSession.add(hazardset2)

    hazardset_id = u'hazardset3'
    # date = 2015-01-01 / global /
    # calculation_method_quality = 1 / scientific_quality = 2
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset3 = HazardSet()
    hazardset3.id = hazardset_id
    hazardset3.hazardtype = hazardtypeEQ
    hazardset3.local = False
    hazardset3.calculation_method_quality = 1
    hazardset3.scientific_quality = 2
    hazardset3.data_lastupdated_date = datetime(2015, 1, 1, 0, 0)
    hazardset3.metadata_lastupdated_date = datetime.now()
    hazardset3.complete = True
    hazardset3.layers.extend(make_layers())
    DBSession.add(hazardset3)

    hazardset_id = u'hazardset4'
    # date = 2015-01-01 / local /
    # calculation_method_quality = 1 / scientific_quality = 2
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset4 = HazardSet()
    hazardset4.id = hazardset_id
    hazardset4.hazardtype = hazardtypeEQ
    hazardset4.local = True
    hazardset4.calculation_method_quality = 1
    hazardset4.scientific_quality = 2
    hazardset4.data_lastupdated_date = datetime(2015, 1, 1, 0, 0)
    hazardset4.metadata_lastupdated_date = datetime.now()
    hazardset4.complete = True
    hazardset4.layers.extend(make_layers())
    DBSession.add(hazardset4)

    hazardset_id = u'hazardset5'
    # date = now() / local /
    # calculation_method_quality = 1 / scientific_quality = 2
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset5 = HazardSet()
    hazardset5.id = hazardset_id
    hazardset5.hazardtype = hazardtypeEQ
    hazardset5.local = True
    hazardset5.calculation_method_quality = 1
    hazardset5.scientific_quality = 2
    hazardset5.data_lastupdated_date = datetime.now()
    hazardset5.metadata_lastupdated_date = datetime.now()
    hazardset5.complete = True
    hazardset5.layers.extend(make_layers())
    DBSession.add(hazardset5)

    hazardset_id = u'hazardset6'
    # date = now() / global /
    # calculation_method_quality = 1 / scientific_quality = 2
    print 'Populating hazardset {}'.format(hazardset_id)
    hazardset6 = HazardSet()
    hazardset6.id = hazardset_id
    hazardset6.hazardtype = hazardtypeEQ
    hazardset6.local = False
    hazardset6.calculation_method_quality = 1
    hazardset6.scientific_quality = 2
    hazardset6.data_lastupdated_date = datetime.now()
    hazardset6.metadata_lastupdated_date = datetime.now()
    hazardset6.complete = True
    hazardset6.layers.extend(make_layers())
    DBSession.add(hazardset6)

    # populate output table

    # admin div (code 30) has only one hazardset for EQ
    admin30 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 30).one()
    # => test outcome = hazardset1
    output1 = Output()
    output1.coverage_ratio = 10
    output1.hazardset = hazardset1
    output1.administrativedivision = admin30
    output1.hazardlevel = HazardLevel.get(u'HIG')
    DBSession.add(output1)

    # admin div (code 30) also has another hazardset
    # but this one is for FL
    # => test outcome = hazardset1b
    output1b = Output()
    output1b.coverage_ratio = 11
    output1b.hazardset = hazardset1b
    output1b.administrativedivision = admin30
    output1b.hazardlevel = HazardLevel.get(u'NPR')
    DBSession.add(output1b)

    # admin div (code 31) has 2 hazardsets,
    # one with a higher calculation_method_quality
    # => test outcome = hazardset2
    admin31 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 31).one()
    output2 = Output()
    output2.coverage_ratio = 20
    output2.hazardset = hazardset1  # calculation_method_quality = 0
    output2.administrativedivision = admin31
    output2.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output2)
    output3 = Output()
    output3.coverage_ratio = 30
    output3.hazardset = hazardset2  # calculation_method_quality = 1
    output3.administrativedivision = admin31
    output3.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output3)

    # admin div (code 32) has 2 hazardsets,
    # both share the same calculation_method_quality,
    # one with a higher scientific_quality
    # => test outcome = hazardset3
    admin32 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 32).one()
    output4 = Output()
    output4.coverage_ratio = 40
    output4.hazardset = hazardset2
    # calculation_method_quality = 1 / scientific_quality = 0
    output4.administrativedivision = admin32
    output4.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output4)
    output5 = Output()
    output5.coverage_ratio = 50
    output5.hazardset = hazardset3
    # calculation_method_quality = 1 / scientific_quality = 2
    output5.administrativedivision = admin32
    output5.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output5)

    # admin div (code 33) has 2 hazardsets,
    # both share the same ratings, one is global, one local
    # => test outcome = hazardset4
    admin33 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 33).one()
    output6 = Output()
    output6.coverage_ratio = 60
    output6.hazardset = hazardset3
    # global / calculation_method_quality = 1 / scientific_quality = 2
    output6.administrativedivision = admin33
    output6.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output6)
    output7 = Output()
    output7.coverage_ratio = 70
    output7.hazardset = hazardset4
    # local / calculation_method_quality = 1 / scientific_quality = 2
    output7.administrativedivision = admin33
    output7.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output7)

    # admin div (code 34) has 2 hazardsets,
    # both share the same ratings, are local, one is more recent
    # => test outcome = hazardset5
    admin34 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 34).one()
    output8 = Output()
    output8.coverage_ratio = 80
    output8.hazardset = hazardset4
    # date = 2015-01-01 / local /
    # calculation_method_quality = 1 / scientific_quality = 2
    output8.administrativedivision = admin34
    output8.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output8)
    output9 = Output()
    output9.coverage_ratio = 90
    output9.hazardset = hazardset5
    # date = now() / local /
    # calculation_method_quality = 1 / scientific_quality = 2
    output9.administrativedivision = admin34
    output9.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output9)

    # admin div (code 35) has 2 hazardsets,
    # both share the same ratings, are global, one is more recent
    # => test outcome = hazardset6
    admin35 = DBSession.query(AdministrativeDivision)\
        .filter(AdministrativeDivision.code == 35).one()
    output10 = Output()
    output10.coverage_ratio = 95
    output10.hazardset = hazardset3
    # date = 2015-01-01 / global /
    # calculation_method_quality = 1 / scientific_quality = 2
    output10.administrativedivision = admin35
    output10.hazardlevel = HazardLevel.get(u'MED')
    DBSession.add(output10)
    output11 = Output()
    output11.coverage_ratio = 99
    output11.hazardset = hazardset6
    # date = now() / global /
    # calculation_method_quality = 1 / scientific_quality = 2
    output11.administrativedivision = admin35
    output11.hazardlevel = HazardLevel.get(u'LOW')
    DBSession.add(output11)

    DBSession.flush()
Exemplo n.º 14
0
def import_recommendations():
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)

    with transaction.manager:

        DBSession.query(HazardCategoryTechnicalRecommendationAssociation) \
            .delete()
        DBSession.query(TechnicalRecommendation).delete()

        # First load general recommendations

        with open('data/general_recommendations.csv', 'rb') as csvfile:
            recommendations = csv.reader(csvfile, delimiter=',')
            for row in recommendations:

                hazardcategory = DBSession.query(HazardCategory) \
                    .join(HazardLevel) \
                    .join(HazardType) \
                    .filter(HazardLevel.mnemonic == row[1]) \
                    .filter(HazardType.mnemonic == row[0]) \
                    .one()
                hazardcategory.general_recommendation = row[2]
                DBSession.add(hazardcategory)

        categories = []
        for type in [u'EQ', u'FL', u'CY', u'TS', u'CF', u'VA', u'DG']:
            for level in [u'HIG', u'MED', u'LOW', u'VLO']:
                hazardcategory = DBSession.query(HazardCategory) \
                    .join(HazardLevel) \
                    .join(HazardType) \
                    .filter(HazardLevel.mnemonic == level) \
                    .filter(HazardType.mnemonic == type) \
                    .one()
                categories.append(hazardcategory)

        # Then technical recommendations

        hctra = HazardCategoryTechnicalRecommendationAssociation

        with open('data/technical_recommendations.csv', 'rb') as csvfile:
            recommendations = csv.reader(csvfile, delimiter=',')
            next(recommendations, None)  # skip the headers
            for row in recommendations:
                technical_rec = TechnicalRecommendation(**{
                    'text': row[0]
                })
                associations = technical_rec.hazardcategory_associations

                # the other columns are hazard category (type / level)
                for col_index in range(1, 28):
                    value = row[col_index]
                    if value is not '' and value is not 'Y':
                        association = hctra(order=value)
                        association.hazardcategory = categories[col_index - 1]
                        associations.append(association)
                DBSession.add(technical_rec)

        # Climate change recommendations

        DBSession.query(ClimateChangeRecommendation).delete()

        # hazard types and corresponding columns
        hazard_types = [
            (u'FL', 6),
            (u'EQ', 7),
            (u'CY', 8),
            (u'CF', 9),
            (u'DG', 10),
            (u'TS', 11),
            (u'VA', 12),
            (u'LS', 13),
        ]

        with open('data/climate_change_recommendations.csv', 'rb') as csvfile:
            countries = csv.reader(csvfile, delimiter=',')
            next(countries, None)  # skip the headers
            for row in countries:
                division = DBSession.query(AdministrativeDivision) \
                    .filter(AdministrativeDivision.code == row[1]) \
                    .one_or_none()

                if not division:
                    continue
                for hazard_type, column in hazard_types:
                    text = row[column]
                    if text == 'NA':
                        continue

                    climate_rec = ClimateChangeRecommendation()
                    climate_rec.text = row[column]
                    climate_rec.administrativedivision = division
                    climate_rec.hazardtype = DBSession.query(HazardType) \
                        .filter(HazardType.mnemonic == hazard_type).one()
                    DBSession.add(climate_rec)
Exemplo n.º 15
0
def harvest_layer(object, dry_run=False):
    title = object['title']
    '''
    typename = urllib.unquote(
        object['distribution_url'].split('/').pop())
    # print title
    '''

    hazardset_id = object['hazard_set']
    if not hazardset_id:
        logger.info('{} - hazard_set is empty'.format(title))
        return False

    hazard_type = object['hazard_type']
    if not hazard_type:
        logger.warning('{} - hazard_type is empty'.format(title))
        return False
    hazardtype = hazardtype_from_geonode(hazard_type)
    if hazardtype is None:
        logger.warning('{} - hazard_type not supported: {}'
                       .format(title, hazard_type))
        return False

    type_settings = settings['hazard_types'][hazardtype.mnemonic]
    preprocessed = 'values' in type_settings

    '''
    csw_wkt_geometry = object['csw_wkt_geometry']
    bounds = wkt_loads(csw_wkt_geometry).bounds
    # print '  bounds :', bounds

    # TODO: minimum global bbox should be defined in settings
    minimum_global_bounds = (-175, -45, 175, 45)
    from shapely.geometry import box
    local = not box(bounds).contains(box(minimum_global_bounds))
    '''
    local = 'GLOBAL' not in hazardset_id
    '''
    local = (
        bounds[0] > -175 or
        bounds[1] > -45 or
        bounds[2] < 175 or
        bounds[3] < 45)
    '''

    mask = False
    if preprocessed is True:
        hazardlevel = None
        hazard_unit = None
        if object['hazard_period']:
            logger.info('{} - Has a return period'.format(title))
            return False
        hazard_period = None
    else:
        hazard_period = int(object['hazard_period'])
        hazardlevel = None
        for level in (u'LOW', u'MED', u'HIG'):
            return_periods = type_settings['return_periods'][level]
            if isinstance(return_periods, list):
                if (hazard_period >= return_periods[0] and
                        hazard_period <= return_periods[1]):
                    hazardlevel = HazardLevel.get(level)
                    break
            else:
                if hazard_period == return_periods:
                    hazardlevel = HazardLevel.get(level)

        if ('mask_return_period' in type_settings and
                hazard_period == type_settings['mask_return_period']):
            mask = True

        if hazardlevel is None and not mask:
            logger.info('{} - No corresponding hazard_level'.format(title))
            return False

        hazard_unit = object['hazard_unit']
        if hazard_unit == '':
            logger.info('{} -  hazard_unit is empty'.format(title))
            return False

    if object['srid'] != 'EPSG:4326':
        logger.info('{} - srid is different from "EPSG:4326"'
                    .format(title))
        return False

    data_update_date = object['data_update_date']
    if not data_update_date:
        logger.warning('{} - data_update_date is empty'.format(title))
        # TODO: Restore bypassed constraint to get Volcanic data
        # return False
        data_update_date = datetime.now()

    metadata_update_date = object['metadata_update_date']
    if not metadata_update_date:
        logger.warning('{} - metadata_update_date is empty'.format(title))
        # return False
        metadata_update_date = datetime.now()

    calculation_method_quality = object['calculation_method_quality']
    if not calculation_method_quality:
        logger.warning('{} - calculation_method_quality is empty'
                       .format(title))
        return False
    calculation_method_quality = int(float(calculation_method_quality))

    scientific_quality = object['scientific_quality']
    if not scientific_quality:
        logger.warning('{} - scientific_quality is empty'.format(title))
        return False
    scientific_quality = int(float(scientific_quality))

    download_url = object['download_url']
    if not download_url:
        logger.warning('{} - download_url is empty'.format(title))
        return False

    hazardset = DBSession.query(HazardSet).get(hazardset_id)
    if hazardset is None:

        logger.info('{} - Create new hazardset {}'
                    .format(title, hazardset_id))
        hazardset = HazardSet()
        hazardset.id = hazardset_id
        hazardset.hazardtype = hazardtype
        hazardset.data_lastupdated_date = data_update_date
        hazardset.metadata_lastupdated_date = metadata_update_date
        DBSession.add(hazardset)
    else:
        # print '  Hazardset {} found'.format(hazardset_id)
        pass

    layer = DBSession.query(Layer) \
        .filter(Layer.hazardset_id == hazardset_id)
    if hazardlevel is not None:
        layer = layer.filter(Layer.hazardlevel_id == hazardlevel.id)
    if mask:
        layer = layer.filter(Layer.mask.is_(True))
    layer = layer.first()

    if layer is None:
        layer = Layer()
        logger.info('{} - Create new Layer {}'.format(title, title))
        DBSession.add(layer)

    else:
        if object['id'] == layer.geonode_id:
            # TODO: metadata change
            return False

        if hazard_period > layer.return_period:
            logger.info('{} - Use preferred return period {}'
                        .format(title, layer.return_period))
            return False

        logger.info('{} - Replace layer for level {}'
                    .format(title, hazardlevel.mnemonic))

    layer.hazardset = hazardset
    layer.hazardlevel = hazardlevel
    layer.mask = mask
    layer.return_period = hazard_period
    layer.hazardunit = hazard_unit
    layer.data_lastupdated_date = data_update_date
    layer.metadata_lastupdated_date = metadata_update_date
    layer.geonode_id = object['id']
    layer.download_url = download_url

    # TODO: retrieve quality attributes
    layer.calculation_method_quality = calculation_method_quality
    layer.scientific_quality = scientific_quality
    layer.local = local
    DBSession.flush()
    return True
Exemplo n.º 16
0
def process_hazardset(hazardset, force=False):
    print hazardset.id
    chrono = datetime.datetime.now()
    last_percent = 0

    level_VLO = HazardLevel.get(u'VLO')

    if hazardset is None:
        raise ProcessException('HazardSet {} does not exist.'
                               .format(hazardset.id))

    if hazardset.processed:
        if force:
            hazardset.processed = False
        else:
            raise ProcessException('HazardSet {} has already been processed.'
                                   .format(hazardset.id))

    # clean previous outputs
    DBSession.query(Output) \
        .filter(Output.hazardset_id == hazardset.id) \
        .delete()
    DBSession.flush()

    hazardtype = hazardset.hazardtype
    hazardtype_settings = settings['hazard_types'][hazardtype.mnemonic]
    thresholds = hazardtype_settings['thresholds']

    project = partial(
        pyproj.transform,
        pyproj.Proj(init='epsg:3857'),
        pyproj.Proj(init='epsg:4326'))

    layers = {}
    for level in (u'HIG', u'MED', u'LOW'):
        hazardlevel = HazardLevel.get(level)
        layer = DBSession.query(Layer) \
            .filter(Layer.hazardset_id == hazardset.id) \
            .filter(Layer.hazardlevel_id == hazardlevel.id) \
            .one()
        layers[level] = layer

    with rasterio.drivers():
        with rasterio.open(layers['HIG'].path()) as src_hig, \
                rasterio.open(layers['MED'].path()) as src_med, \
                rasterio.open(layers['LOW'].path()) as src_low:
            readers = {}
            readers['HIG'] = src_hig
            readers['MED'] = src_med
            readers['LOW'] = src_low

            polygon_hig = polygonFromBounds(src_hig.bounds)
            polygon_med = polygonFromBounds(src_med.bounds)
            polygon_low = polygonFromBounds(src_low.bounds)
            polygon = cascaded_union((
                polygon_hig,
                polygon_med,
                polygon_low))

            adminlevel_REG = AdminLevelType.get(u'REG')

            admindivs = DBSession.query(AdministrativeDivision) \
                .filter(AdministrativeDivision.leveltype_id == adminlevel_REG.id) \

            if hazardset.local:
                admindivs = admindivs \
                    .filter(
                        func.ST_Transform(AdministrativeDivision.geom, 4326)
                        .intersects(
                            func.ST_GeomFromText(polygon.wkt, 4326))) \
                    .filter(func.ST_Intersects(
                        func.ST_Transform(AdministrativeDivision.geom, 4326),
                        func.ST_GeomFromText(polygon.wkt, 4326)))

            current = 0
            outputs = 0
            total = admindivs.count()
            for admindiv in admindivs:
                # print ' ', admindiv.id, admindiv.code, admindiv.name

                current += 1
                if admindiv.geom is None:
                    print '   ', ('{}-{} has null geometry'
                                  .format(admindiv.code, admindiv.name))
                    continue

                reprojected = transform(
                    project,
                    to_shape(admindiv.geom))

                output = Output()
                output.hazardset = hazardset
                output.administrativedivision = admindiv
                output.hazardlevel = None

                # TODO: calculate coverage ratio
                output.coverage_ratio = 100

                for level in (u'HIG', u'MED', u'LOW'):
                    layer = layers[level]
                    src = readers[level]

                    if not reprojected.intersects(polygon):
                        continue

                    window = src.window(*reprojected.bounds)
                    data = src.read(1, window=window, masked=True)
                    if data.shape[0] * data.shape[1] == 0:
                        continue

                    threshold = thresholds[layer.hazardunit]
                    positive_data = (data > threshold).astype(rasterio.uint8)

                    division = features.rasterize(
                        ((g, 1) for g in [reprojected]),
                        out_shape=data.shape,
                        transform=src.window_transform(window),
                        all_touched=True)

                    masked = numpy.ma.masked_array(positive_data,
                                                   mask=~division.astype(bool))

                    if str(numpy.max(masked)) == str(numpy.ma.masked):
                        break
                    else:
                        if output.hazardlevel is None:
                            output.hazardlevel = level_VLO

                    if numpy.max(masked) > 0:
                        output.hazardlevel = layer.hazardlevel
                        break

                if output.hazardlevel is not None:
                    # print '    hazardlevel :', output.hazardlevel.mnemonic
                    DBSession.add(output)
                    outputs += 1

                percent = int(100.0 * current / total)
                if percent % 10 == 0 and percent != last_percent:
                    print '  ... processed {}%'.format(percent)
                    last_percent = percent
                    pass

    hazardset.processed = True

    DBSession.flush()
    transaction.commit()

    print ('Successfully processed {} divisions, {} outputs generated in {}'
           .format(total, outputs, datetime.datetime.now() - chrono))