Source code for criticalityMaps.mapping.criticality_map

# -*- coding: utf-8 -*-
"""
Created on Wed Aug  7 18:41:45 2019

@author: PHassett
"""
import os
import json
import jinja2
from criticalityMaps.mapping.geojson_handler import _criticality_yml_to_geojson, inp_to_geojson


[docs]def make_criticality_map(wn, results_file, output_file=None, pop=None): ''' Make a criticality map from a criticality results file. Parameters ---------- wn: wntr waternetwork model the wntr waternetwork model of interest results_file: str/path-like object path to the .yml results file from a criticality analysis output_file: str/path-like path and .html file name for map output. Defaults to the path of the results file with '.yml' replaced with '_map.html' pop: dict/Pandas Series, optional population estimate at each node. If None, will use wntr.metrics.population(wn). Defaults to None ''' if output_file is None: output_file = results_file.split('.yml')[0] + "_map.html" # Produce a geojson layer for the wn wn_layer = inp_to_geojson(wn, to_file=False) # Produce a geojson layer for the criticality results criticality_layer = _criticality_yml_to_geojson(wn, results_file, pop) # Determine which template to use if 'fire' in results_file: html_template = './templates/fire_criticality_template.html' data_layer = {'Fire Criticality': criticality_layer} elif 'pipe' in results_file: html_template = './templates/pipe_criticality_template.html' data_layer = {'Pipe Criticality': criticality_layer} # Pass geojson layers to fill the template file _fill_criticality_template(html_template, wn_layer, data_layer, output=output_file)
def _fill_criticality_template(template_file, wn_geojson, network_data_layers, output='./wn_map.html'): ''' Create a leaflet map of the water network from a geojson representation. jinja2 interaction based on example at: https://gist.github.com/wrunk/1317933/d204be62e6001ea21e99ca0a90594200ade2511e Parameters ---------- template_file: string/path-like object jinja2 html template file path wn_geojson: dict in geojson format geojson spatial representation of the water network network_data_layers: dict A dictionary of the form, {'Title for Layer1': layer1data}, where 'layer1data' is a dictionary of the form {id, value}, where id is a string and value is a float representing the value of a Water Network component for Layer1 output: str/path-like object output path for the .html file ''' # Capture our current directory. THIS_DIR = os.path.dirname(os.path.abspath(__file__)) # Create the jinja2 environment. # Notice the use of trim_blocks, which greatly helps control whitespace. j2_env = jinja2.Environment(loader=jinja2.FileSystemLoader(THIS_DIR), trim_blocks=True) # Load the wn geojson data. if type(wn_geojson) != dict: try: # Load the water network geojson file. with open(os.path.abspath(wn_geojson), 'r') as fp: wn_geojson = json.load(fp) except Exception as e: print("wn_geojson must either be a geojson FeatureCollection dict \ or a file path to a valid .json representatiom of the \ FeatureCollection.") raise e # Load additional data layer. data_layers = {} for name, data_layer in network_data_layers.items(): if type(data_layer) != dict: try: # Load the water network geojson file. with open(os.path.abspath(data_layer), 'r') as fp: data_layer = json.load(fp) except Exception as e: print("wn_geojson must either be a geojson FeatureCollection dict \ or a file path to a valid .json representation of the \ FeatureCollection.") raise e data_layers[name] = data_layer # Fill the jinja2 html template and save the file with open(output, 'w') as fp: fp.write(j2_env.get_template(template_file).render( wn_geojson=wn_geojson, data_layers_geojson=data_layers) )