def generate_classified_legend( analysis, exposure, hazard, debug_mode): """Generate an ordered python structure with the classified symbology. :param analysis: The analysis layer. :type analysis: QgsVectorLayer :param exposure: The exposure layer. :type exposure: QgsVectorLayer :param hazard: The hazard layer. :type hazard: QgsVectorLayer :param debug_mode: Boolean if run in debug mode. :type debug_mode: bool :return: The ordered dictionary to use to build the classified style. :rtype: OrderedDict """ # We need to read the analysis layer to get the number of features. analysis_row = analysis.getFeatures().next() # Let's style the hazard class in each layers. hazard_classification = hazard.keywords['classification'] hazard_classification = definition(hazard_classification) # Let's check if there is some thresholds: thresholds = hazard.keywords.get('thresholds') if thresholds: hazard_unit = hazard.keywords.get('continuous_hazard_unit') hazard_unit = definition(hazard_unit)['abbreviation'] else: hazard_unit = None exposure = exposure.keywords['exposure'] exposure_definitions = definition(exposure) exposure_units = exposure_definitions['units'] exposure_unit = exposure_units[0] coefficient = 1 # We check if can use a greater unit, such as kilometre for instance. if len(exposure_units) > 1: # We use only two units for now. delta = coefficient_between_units( exposure_units[1], exposure_units[0]) all_values_are_greater = True # We check if all values are greater than the coefficient for i, hazard_class in enumerate(hazard_classification['classes']): field_name = hazard_count_field['field_name'] % hazard_class['key'] try: value = analysis_row[field_name] except KeyError: value = 0 if 0 < value < delta: # 0 is fine, we can still keep the second unit. all_values_are_greater = False if all_values_are_greater: # If yes, we can use this unit. exposure_unit = exposure_units[1] coefficient = delta classes = OrderedDict() # In debug mode we don't round number. enable_rounding = not debug_mode for i, hazard_class in enumerate(hazard_classification['classes']): # Get the hazard class name. field_name = hazard_count_field['field_name'] % hazard_class['key'] # Get the number of affected feature by this hazard class. try: value = analysis_row[field_name] except KeyError: # The field might not exist if no feature impacted in this hazard # zone. value = 0 value = format_number( value, enable_rounding, exposure_definitions['use_population_rounding'], coefficient) minimum = None maximum = None # Check if we need to add thresholds. if thresholds: if i == 0: minimum = thresholds[hazard_class['key']][0] elif i == len(hazard_classification['classes']) - 1: maximum = thresholds[hazard_class['key']][1] else: minimum = thresholds[hazard_class['key']][0] maximum = thresholds[hazard_class['key']][1] label = _format_label( hazard_class=hazard_class['name'], value=value, exposure_unit=exposure_unit['abbreviation'], minimum=minimum, maximum=maximum, hazard_unit=hazard_unit) classes[hazard_class['key']] = (hazard_class['color'], label) if exposure_definitions['display_not_exposed'] or debug_mode: classes[not_exposed_class['key']] = _add_not_exposed( analysis_row, enable_rounding, exposure_definitions['use_population_rounding'], exposure_unit['abbreviation'], coefficient) return classes
def generate_classified_legend(analysis, exposure, hazard, debug_mode): """Generate an ordered python structure with the classified symbology. :param analysis: The analysis layer. :type analysis: QgsVectorLayer :param exposure: The exposure layer. :type exposure: QgsVectorLayer :param hazard: The hazard layer. :type hazard: QgsVectorLayer :param debug_mode: Boolean if run in debug mode. :type debug_mode: bool :return: The ordered dictionary to use to build the classified style. :rtype: OrderedDict """ # We need to read the analysis layer to get the number of features. analysis_row = analysis.getFeatures().next() # Let's style the hazard class in each layers. hazard_classification = hazard.keywords['classification'] hazard_classification = definition(hazard_classification) # Let's check if there is some thresholds: thresholds = hazard.keywords.get('thresholds') if thresholds: hazard_unit = hazard.keywords.get('continuous_hazard_unit') hazard_unit = definition(hazard_unit)['abbreviation'] else: hazard_unit = None exposure = exposure.keywords['exposure'] exposure_definitions = definition(exposure) exposure_units = exposure_definitions['units'] exposure_unit = exposure_units[0] coefficient = 1 # We check if can use a greater unit, such as kilometre for instance. if len(exposure_units) > 1: # We use only two units for now. delta = coefficient_between_units(exposure_units[1], exposure_units[0]) all_values_are_greater = True # We check if all values are greater than the coefficient for i, hazard_class in enumerate(hazard_classification['classes']): field_name = hazard_count_field['field_name'] % hazard_class['key'] try: value = analysis_row[field_name] except KeyError: value = 0 if 0 < value < delta: # 0 is fine, we can still keep the second unit. all_values_are_greater = False if all_values_are_greater: # If yes, we can use this unit. exposure_unit = exposure_units[1] coefficient = delta classes = OrderedDict() # In debug mode we don't round number. enable_rounding = not debug_mode for i, hazard_class in enumerate(hazard_classification['classes']): # Get the hazard class name. field_name = hazard_count_field['field_name'] % hazard_class['key'] # Get the number of affected feature by this hazard class. try: value = analysis_row[field_name] except KeyError: # The field might not exist if no feature impacted in this hazard # zone. value = 0 value = format_number(value, enable_rounding, exposure_definitions['use_population_rounding'], coefficient) minimum = None maximum = None # Check if we need to add thresholds. if thresholds: if i == 0: minimum = thresholds[hazard_class['key']][0] elif i == len(hazard_classification['classes']) - 1: maximum = thresholds[hazard_class['key']][1] else: minimum = thresholds[hazard_class['key']][0] maximum = thresholds[hazard_class['key']][1] label = _format_label(hazard_class=hazard_class['name'], value=value, exposure_unit=exposure_unit['abbreviation'], minimum=minimum, maximum=maximum, hazard_unit=hazard_unit) classes[hazard_class['key']] = (hazard_class['color'], label) if exposure_definitions['display_not_exposed'] or debug_mode: classes[not_exposed_class['key']] = _add_not_exposed( analysis_row, enable_rounding, exposure_definitions['use_population_rounding'], exposure_unit['abbreviation'], coefficient) return classes