diff --git a/dash_app/app.py b/dash_app/app.py index a5e4f2a..eb020b9 100644 --- a/dash_app/app.py +++ b/dash_app/app.py @@ -164,24 +164,35 @@ def show_hide_element(feature, is_ccs, cooling, capacity_factor): Input(component_id="carbon-capture-select", component_property="value"), Input(component_id="cooling-type-select", component_property="value"), Input(component_id="capacity-factor-select", component_property="value"), - Input(component_id="layer-selector", component_property="value"), + # Input(component_id="layer-selector", component_property="value"), Input('adjust-mode', 'value'), Input('button1', 'n_clicks'), Input('button2', 'n_clicks'), - Input('last-btn-pressed', 'children') + Input('last-btn-pressed', 'children'), + # Input(component_id="opacity-btn", component_property="n_clicks"), + Input(component_id="visibility-btn", component_property="n_clicks"), + Input(component_id="tabnav", component_property="value"), + Input('multi-layer-dropdown', 'value') ], ) def map(year, ssp, tech, subtech, feature, - is_ccs, coolingtype, capacity_factor, selected_layers, - adjust_mode, btn1, btn2, last_pressed): + is_ccs, coolingtype, capacity_factor, + # selected_layers, + adjust_mode, btn1, btn2, last_pressed, + # opacity_clicks, + visible_clicks, + tab_id, + layer_catalogue + ): # ----------------------------------------------------------------------------- # Creates and displays map by querying a "database" table of all pathways # to their filenames. # ----------------------------------------------------------------------------- + # print(" --------------------------------------------------------------- ") year = str(year) # print([ssp, year, tech, subtech, feature, is_ccs, coolingtype, capacity_factor]) @@ -195,20 +206,36 @@ def map(year, ssp, ui_capacity_factor in @capacity_factor") fpaths = query_df["fpath"].values - + # print(fpaths) # ['ssp5/2025/biomass/gridcerf_biomass_conventional_no-ccs_dry.tif'] # i = 0 # for fpath in fpaths: # TIFPATH = os.path.join(COMPILED_DIR, fpath) # data_array, array, source_crs, df_coors_long, boundingbox, img = open_as_raster(TIFPATH=TIFPATH, is_reproject=False, is_convert_to_png=False) # i += 1 + basemap_layers = ["base-map-ocean", "base-map"] + + if visible_clicks % 2 == 0: + visibility_mode = True + selected_layers = ["base-map-ocean", "base-map", "feasibility-layer"] + else: + visibility_mode = False + selected_layers = basemap_layers + + if tab_id == "insights-tab": + is_compiled = True + if tab_id == "layers-tab": + is_compiled = False + selected_layers = basemap_layers + layer_catalogue + + + print(selected_layers) # DeckGL ctx = callback_context # there are multiple callback contextes in this if ctx.triggered: clicked_id = ctx.triggered[0]['prop_id'].split('.')[0] - # print(ctx.triggered) # if adjust_mode: clicked_id_ = clicked_id + "-" + last_pressed @@ -217,26 +244,30 @@ def map(year, ssp, # "adjust-mode-True" # "adjust-mode-False" - # clicked_id == adjust-mode from light to dark then need go into button2 if clicked_id == 'button1': - fig_div = plot_deckgl_globe(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, adjust_mode=adjust_mode) + fig_div = plot_deckgl_globe(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, + adjust_mode=adjust_mode, visibility_mode=visibility_mode, is_compiled=is_compiled) last_pressed = "button1" # elif clicked_id_ == 'adjust-mode-button1': # fig_div = plot_deckgl_globe(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, adjust_mode=adjust_mode) # last_pressed = "button1" elif clicked_id == 'button2': - fig_div = plot_deckgl_map(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, adjust_mode=adjust_mode) + fig_div = plot_deckgl_map(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, + adjust_mode=adjust_mode, visibility_mode=visibility_mode, is_compiled=is_compiled) last_pressed = "button2" elif clicked_id_ == "adjust-mode-button2": - fig_div = plot_deckgl_map(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, adjust_mode=adjust_mode) + fig_div = plot_deckgl_map(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, + adjust_mode=adjust_mode, visibility_mode=visibility_mode, is_compiled=is_compiled) last_pressed = "button2" else: # default (or if fails all other options it will become a globe) - fig_div = plot_deckgl_globe(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, adjust_mode=adjust_mode) + fig_div = plot_deckgl_globe(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, + adjust_mode=adjust_mode, visibility_mode=visibility_mode, is_compiled=is_compiled) last_pressed = "button1" else: - fig_div = plot_deckgl_globe(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, adjust_mode=adjust_mode) + fig_div = plot_deckgl_globe(COMPILED_DIR=COMPILED_DIR, fpaths=fpaths, selected_layers=selected_layers, + adjust_mode=adjust_mode, visibility_mode=visibility_mode, is_compiled=is_compiled) last_pressed = "button1" return fig_div, last_pressed @@ -466,95 +497,139 @@ def toggle_expand(expand_clicks, close_clicks): return expanded_box_css, expanded_btn_css # Default state: expanded +# @app.callback( +# [Output(component_id="layer-container", component_property="style"), +# Output(component_id="layer-container", component_property="children"), +# ], +# [Input(component_id="layer-container", component_property="n_clicks"), +# Input(component_id="close-layer-button", component_property="n_clicks"), +# ] +# ) + +# def toggle_expand(expand_clicks, close_clicks): + +# expanded_box_css = {"display": "block"} +# expanded_btn_css =[ +# html.Button("X", id="close-layer-button", className="close-btn"), +# html.P("Layers", id='header0', className="header-text"), +# html.Hr(className="hr2"), +# html.Div(id="layer-funcs-container", +# children=[ +# html.Div("Technology Layer", id="layer-concept", className="layer-concept"), +# html.Div(id="layer-funcs", className="layer-funcs", +# children=[ +# # html.Button( +# # id="opacity-btn", +# # children=[ +# # html.Img(id="opacity", src=app.get_asset_url("icons/map_icons/opacity.svg")), +# # ], +# # # className='button-selected', # Initially selected +# # n_clicks=1 +# # ), +# html.Button( +# id="visibility-btn", +# children=[ +# html.Img(id="visibility", src=app.get_asset_url("icons/map_icons/eye-open.svg")), +# ], +# # className='button-selected', # Initially selected +# n_clicks=0 +# ), +# ]) +# ] +# ), +# html.Div(id="layer-name-container", +# children=[ +# html.Div(id="hex-box"), +# html.Div("FEASIBILITY", id="layer-name", className="layer-name"), +# ] +# ), +# html.Hr(className="hr3"), +# dcc.Checklist( +# id='layer-selector', +# options=[ +# {'label': 'Basemap Ocean', 'value': 'base-map-ocean'}, # AB: need to predfine the database +# {'label': 'Basemap Land', 'value': 'base-map'}, +# {'label': 'Feasibility Layer', 'value': 'feasibility-layer'}, +# ], +# value=["base-map-ocean", "base-map", "feasibility-layer"], # Default selected layers +# inline=True, +# # style={'display': 'none'} +# ), +# ] +# closed_box_css = { +# "width": "40px", +# "height": "40px", +# "border-radius": "10px", +# "transition": "width 0.3s, height 0.3s", +# } +# # closed_btn_css ={"display": "none"} +# closed_btn_css = [ +# html.Img(id="info-logo", className="svg", +# src=app.get_asset_url("icons/funcs_icons/layers-two-final.svg"), +# style={"width": "30px", +# "height": "30px", +# "margin-left": "-5px", +# "margin-top": "-5px" +# } +# ), +# html.Button( +# "X", +# id="close-layer-button", +# className="close-btn", +# style={"display": "none"})] + +# if close_clicks: +# return closed_box_css, closed_btn_css + +# if expand_clicks: +# return expanded_box_css, expanded_btn_css + + +# return expanded_box_css, expanded_btn_css # Default state: expanded + + + + + @app.callback( - [Output(component_id="layer-container", component_property="style"), - Output(component_id="layer-container", component_property="children"), - ], - [Input(component_id="layer-container", component_property="n_clicks"), - Input(component_id="close-layer-button", component_property="n_clicks"), - ] + Output("visibility", "src"), + Input("visibility-btn", "n_clicks"), ) +def toggle_eye_icon(n_clicks): -def toggle_expand(expand_clicks, close_clicks): + if n_clicks % 2 == 0: + # Even click count, show "eye-open" + return app.get_asset_url("icons/map_icons/eye-open.svg") + else: + # Odd click count, show "eye-closed" + return app.get_asset_url("icons/map_icons/eye-slashed.svg") - expanded_box_css = {"display": "block"} - expanded_btn_css =[ - html.Button("X", id="close-layer-button", className="close-btn"), - html.P("Layers", id='header0', className="header-text"), - html.Hr(className="hr2"), - html.Div(id="layer-funcs-container", - children=[ - html.Div("Technology Layer", id="layer-concept", className="layer-concept"), - html.Div(id="layer-funcs", className="layer-funcs", - children=[ - html.Button( - id="opacity-btn", - children=[ - html.Img(id="opacity", src=app.get_asset_url("icons/map_icons/opacity.svg")), - ], - # className='button-selected', # Initially selected - n_clicks=1 - ), - html.Button( - id="visibility-btn", - children=[ - html.Img(id="visibility", src=app.get_asset_url("icons/map_icons/eye-open.svg")), - ], - # className='button-selected', # Initially selected - n_clicks=1 - ), - ]) - - ] - ), - html.Div(id="layer-name-container", - children=[ - html.Div(id="hex-box"), - html.Div("FEASIBILITY", id="layer-name", className="layer-name"), - ] - ), - html.Hr(className="hr3"), - dcc.Checklist( - id='layer-selector', - options=[ - {'label': 'Basemap Ocean', 'value': 'base-map-ocean'}, # AB: need to predfine the database - {'label': 'Basemap Land', 'value': 'base-map'}, - {'label': 'Feasibility Layer', 'value': 'feasibility-layer'}, - ], - value=["base-map-ocean", "base-map", "feasibility-layer"], # Default selected layers - inline=True, - # style={'display': 'none'} - ), - ] - closed_box_css = { - "width": "40px", - "height": "40px", - "border-radius": "10px", - "transition": "width 0.3s, height 0.3s", - } - # closed_btn_css ={"display": "none"} - closed_btn_css = [ - html.Img(id="info-logo", className="svg", - src=app.get_asset_url("icons/funcs_icons/layers-two-final.svg"), - style={"width": "30px", - "height": "30px", - "margin-left": "-5px", - "margin-top": "-5px" - } - ), - html.Button( - "X", - id="close-layer-button", - className="close-btn", - style={"display": "none"})] - if close_clicks: - return closed_box_css, closed_btn_css +# @app.callback( +# [Output("visibility", "src"), # Update the image source +# Output("visibility-click-store", "data")], # Update the click count in the store +# Input("visibility-btn", "n_clicks"), # Trigger on button click +# State("visibility-click-store", "data") # Get the current stored click count +# ) +# def toggle_eye_icon(n_clicks, stored_clicks): - if expand_clicks: - return expanded_box_css, expanded_btn_css +# print("click ", n_clicks, stored_clicks) + +# if n_clicks is None: +# n_clicks = stored_clicks # If no clicks, retain the previous value + +# # Increment the stored click count by 1 +# # if n_clicks >= stored_clicks: +# # print("*****") + +# stored_clicks += 1 + +# # Toggle the icon based on whether the click count is odd or even +# if stored_clicks % 2 == 0: +# return app.get_asset_url("icons/map_icons/eye-open.svg"), stored_clicks +# else: +# return app.get_asset_url("icons/map_icons/eye-slashed.svg"), stored_clicks - return expanded_box_css, expanded_btn_css # Default state: expanded # ----------------------------------------------------------------------------- # App runs here. Define configurations, proxies, etc. diff --git a/dash_app/assets/layers.css b/dash_app/assets/layers.css index 533956d..3d62d6b 100644 --- a/dash_app/assets/layers.css +++ b/dash_app/assets/layers.css @@ -14,7 +14,7 @@ bottom: 0; right: 0; width: 250px; /* Set the desired width */ - height: 250px; + height: 150px; margin-bottom: 10px; margin-right: 270px; flex-direction: column; @@ -95,3 +95,28 @@ color: #545454; font-weight: 300; } + + +#multi-layer-dropdown{ + max-width: 300px; + /* word-wrap: break-word !important; */ + /* white-space: normal !important; */ +} +#dropdown-container { + max-width: 300px; + /* word-wrap: break-word !important; + white-space: normal !important; */ +} + +/* Wrap long text inside dropdown options */ +/* .Select-control .Select-menu-outer .Select-option { + word-wrap: break-word !important; + white-space: normal !important; +} */ + +.Select-value-label, .Select-multi-value-wrapper, .Select-menu-outer { + word-wrap: break-word; + white-space: normal; + line-height: 1.2; + font-size: 13px; +} \ No newline at end of file diff --git a/dash_app/data_manipulation.py b/dash_app/data_manipulation.py new file mode 100644 index 0000000..44be08d --- /dev/null +++ b/dash_app/data_manipulation.py @@ -0,0 +1,34 @@ +import os +import pandas as pd + +DATA_DIR = "../../data/msdlive-gridcerf/gridcerf" + +folders = [os.path.join(DATA_DIR, "common"), + os.path.join(DATA_DIR, "scenario_specific"), + os.path.join(DATA_DIR, "technology_specific") + ] + +file_data = [] + +for folder in folders: + + if os.path.exists(folder): + + for filename in os.listdir(folder): + + file_path = os.path.join(folder, filename) + + if os.path.isfile(file_path): # Ensure it's a file (not a folder) + file_path = file_path.replace("../../data/msdlive-gridcerf/", "") + filename = filename.replace("gridcerf_", "").replace(".tif", "").replace("_", " ") + file_data.append({"filename": filename, "filepath": file_path}) + else: + print(f"Folder {folder} does not exist!") + +# Create a pandas DataFrame from the list +df = pd.DataFrame(file_data) + +# Save the DataFrame as a CSV file +df.to_csv("layer_catalogue.csv", index=False) + +print("CSV file has been saved as 'layer_catalogue.csv'.") diff --git a/dash_app/layer_catalogue.csv b/dash_app/layer_catalogue.csv new file mode 100644 index 0000000..a745325 --- /dev/null +++ b/dash_app/layer_catalogue.csv @@ -0,0 +1,431 @@ +filename,filepath +dod military installations conus,gridcerf/common/gridcerf_dod_military_installations_conus.tif +usfs national wild scenic river system conus,gridcerf/common/gridcerf_usfs_national_wild_scenic_river_system_conus.tif +blm nlcs national monument conus,gridcerf/common/gridcerf_blm_nlcs_national_monument_conus.tif +blm nlcs wilderness conus,gridcerf/common/gridcerf_blm_nlcs_wilderness_conus.tif +usfws critical habitat conus,gridcerf/common/gridcerf_usfws_critical_habitat_conus.tif +wdpa tnc managed lands conus,gridcerf/common/gridcerf_wdpa_tnc_managed_lands_conus.tif +blm historic parks,gridcerf/common/gridcerf_blm_historic_parks.tif +nps historic trails conus,gridcerf/common/gridcerf_nps_historic_trails_conus.tif +usfs wilderness areas conus,gridcerf/common/gridcerf_usfs_wilderness_areas_conus.tif +usfs national designated areas conus,gridcerf/common/gridcerf_usfs_national_designated_areas_conus.tif +usfws special designation conus,gridcerf/common/gridcerf_usfws_special_designation_conus.tif +blm areas of critical environmental concern,gridcerf/common/gridcerf_blm_areas_of_critical_environmental_concern.tif +usgs padus class 1 to 2 conus additions,gridcerf/common/gridcerf_usgs_padus_class_1_to_2_conus_additions.tif +nlcd wetlands conus,gridcerf/common/gridcerf_nlcd_wetlands_conus.tif +blm drecp wildlife allocation,gridcerf/common/gridcerf_blm_drecp_wildlife_allocation.tif +nps administrative boundaries conus,gridcerf/common/gridcerf_nps_administrative_boundaries_conus.tif +blm national register property,gridcerf/common/gridcerf_blm_national_register_property.tif +usgs lakes reservoirs,gridcerf/common/gridcerf_usgs_lakes_reservoirs.tif +bor surface management agency areas,gridcerf/common/gridcerf_bor_surface_management_agency_areas.tif +epa class1 airsheds conus,gridcerf/common/gridcerf_epa_class1_airsheds_conus.tif +nps scenic trails conus,gridcerf/common/gridcerf_nps_scenic_trails_conus.tif +blm historic landmarks,gridcerf/common/gridcerf_blm_historic_landmarks.tif +blm nlcs wilderness study areas conus,gridcerf/common/gridcerf_blm_nlcs_wilderness_study_areas_conus.tif +population ssp2 2055 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2055_1km_conus_nuclear.tif +population ssp3 2050 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2050_1km_conus_50k_per25sqmi.tif +population ssp2 2040 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2040_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2030 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2030_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2100 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2100_1km_conus_50k_per25sqmi.tif +population ssp5 2095 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2095_1km_conus_50k_per25sqmi.tif +population ssp2 2050 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2050_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2020 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2020_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2075 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2075_1km_conus_50k_per25sqmi.tif +population ssp2 2060 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2060_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2035 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2035_1km_conus_nuclear.tif +population ssp5 2065 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2065_1km_conus_nuclear.tif +population ssp2 2070 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2070_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2095 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2095_1km_conus_nuclear.tif +population ssp3 2060 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2060_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2090 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2090_1km_conus_50k_per25sqmi.tif +population ssp2 2025 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2025_1km_conus_nuclear.tif +population ssp5 2070 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2070_1km_conus_50k_per25sqmi.tif +population ssp3 2070 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2070_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2085 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2085_1km_conus_nuclear.tif +population ssp3 2055 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2055_1km_conus_50k_per25sqmi.tif +population ssp3 2045 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2045_1km_conus_nuclear.tif +population ssp3 2040 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2040_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2030 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2030_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2050 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2050_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2020 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2020_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2100 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2100_1km_conus_nuclear.tif +population ssp3 2085 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2085_1km_conus_50k_per25sqmi.tif +population ssp3 2065 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2065_1km_conus_50k_per25sqmi.tif +population ssp2 2100 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2100_1km_conus_nuclear.tif +population ssp5 2060 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2060_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2025 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2025_1km_conus_50k_per25sqmi.tif +population ssp5 2070 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2070_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2040 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2040_1km_conus_50k_per25sqmi.tif +population ssp5 2040 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2040_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2085 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2085_1km_conus_nuclear.tif +population ssp5 2025 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2025_1km_conus_nuclear.tif +population ssp5 2050 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2050_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2075 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2075_1km_conus_nuclear.tif +population ssp5 2030 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2030_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2045 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2045_1km_conus_50k_per25sqmi.tif +population ssp2 2020 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2020_1km_conus_50k_per25sqmi.tif +population ssp5 2020 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2020_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2065 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2065_1km_conus_nuclear.tif +population ssp3 2080 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2080_1km_conus_50k_per25sqmi.tif +population ssp3 2060 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2060_1km_conus_50k_per25sqmi.tif +population ssp5 2055 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2055_1km_conus_nuclear.tif +population ssp5 2045 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2045_1km_conus_nuclear.tif +population ssp5 2085 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2085_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2100 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2100_1km_conus_nuclear.tif +population ssp5 2095 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2095_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2045 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2045_1km_conus_50k_per25sqmi.tif +population ssp5 2020 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2020_1km_conus_50k_per25sqmi.tif +population ssp2 2075 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2075_1km_conus_nuclear.tif +population ssp5 2035 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2035_1km_conus_nuclear.tif +population ssp3 2065 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2065_1km_conus_nuclear.tif +population ssp5 2095 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2095_1km_conus_nuclear.tif +population ssp5 2025 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2025_1km_conus_50k_per25sqmi.tif +population ssp2 2040 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2040_1km_conus_50k_per25sqmi.tif +population ssp3 2055 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2055_1km_conus_nuclear.tif +population ssp2 2090 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2090_1km_conus_50k_per25sqmi.tif +population ssp2 2070 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2070_1km_conus_50k_per25sqmi.tif +population ssp2 2085 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2085_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2095 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2095_1km_conus_nuclear.tif +population ssp2 2095 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2095_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2030 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2030_1km_conus_50k_per25sqmi.tif +population ssp2 2035 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2035_1km_conus_nuclear.tif +population ssp3 2085 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2085_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2085 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2085_1km_conus_nuclear.tif +population ssp3 2095 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2095_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2025 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2025_1km_conus_nuclear.tif +population ssp5 2075 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2075_1km_conus_nuclear.tif +population ssp3 2035 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2035_1km_conus_50k_per25sqmi.tif +population ssp2 2045 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2045_1km_conus_nuclear.tif +population ssp2 2095 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2095_1km_conus_50k_per25sqmi.tif +population ssp2 2075 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2075_1km_conus_50k_per25sqmi.tif +population ssp3 2020 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2020_1km_conus_50k_per25sqmi.tif +population ssp2 2060 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2060_1km_conus_50k_per25sqmi.tif +population ssp2 2080 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2080_1km_conus_50k_per25sqmi.tif +population ssp5 2040 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2040_1km_conus_nuclear.tif +population ssp2 2080 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2080_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2090 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2090_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2070 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2070_1km_conus_nuclear.tif +population ssp3 2080 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2080_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2090 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2090_1km_conus_nuclear.tif +population ssp2 2065 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2065_1km_conus_50k_per25sqmi.tif +population ssp2 2085 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2085_1km_conus_50k_per25sqmi.tif +population ssp3 2090 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2090_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2060 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2060_1km_conus_nuclear.tif +population ssp5 2030 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2030_1km_conus_nuclear.tif +population ssp3 2025 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2025_1km_conus_50k_per25sqmi.tif +population ssp5 2080 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2080_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2050 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2050_1km_conus_nuclear.tif +population ssp2 2055 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2055_1km_conus_50k_per25sqmi.tif +population ssp5 2030 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2030_1km_conus_50k_per25sqmi.tif +population ssp5 2090 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2090_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2030 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2030_1km_conus_nuclear.tif +population ssp2 2090 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2090_1km_conus_nuclear.tif +population ssp5 2035 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2035_1km_conus_50k_per25sqmi.tif +population ssp5 2070 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2070_1km_conus_nuclear.tif +population ssp2 2050 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2050_1km_conus_50k_per25sqmi.tif +population ssp3 2020 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2020_1km_conus_nuclear.tif +population ssp3 2080 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2080_1km_conus_nuclear.tif +population ssp2 2100 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2100_1km_conus_50k_per25sqmi.tif +population ssp2 2040 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2040_1km_conus_nuclear.tif +population ssp5 2065 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2065_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2075 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2075_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2050 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2050_1km_conus_nuclear.tif +population ssp5 2045 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2045_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2090 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2090_1km_conus_nuclear.tif +population ssp5 2100 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2100_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2035 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2035_1km_conus_50k_per25sqmi.tif +population ssp5 2050 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2050_1km_conus_50k_per25sqmi.tif +population ssp3 2075 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2075_1km_conus_50k_per25sqmi.tif +population ssp5 2060 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2060_1km_conus_nuclear.tif +population ssp3 2095 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2095_1km_conus_50k_per25sqmi.tif +population ssp5 2055 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2055_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2100 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2100_1km_conus_50k_per25sqmi.tif +population ssp3 2030 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2030_1km_conus_nuclear.tif +population ssp5 2035 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2035_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2080 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2080_1km_conus_nuclear.tif +population ssp5 2025 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp5_2025_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2020 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2020_1km_conus_nuclear.tif +population ssp3 2070 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2070_1km_conus_50k_per25sqmi.tif +population ssp3 2090 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2090_1km_conus_50k_per25sqmi.tif +population ssp5 2055 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2055_1km_conus_50k_per25sqmi.tif +population ssp3 2040 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2040_1km_conus_nuclear.tif +population ssp2 2030 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp2_2030_1km_conus_50k_per25sqmi.tif +population ssp2 2100 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2100_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2035 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2035_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2045 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2045_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2025 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2025_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2055 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2055_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2065 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2065_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2070 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp3_2070_1km_conus_nuclear.tif +population ssp5 2065 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2065_1km_conus_50k_per25sqmi.tif +population ssp5 2020 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2020_1km_conus_nuclear.tif +population ssp5 2085 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2085_1km_conus_50k_per25sqmi.tif +population ssp3 2040 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2040_1km_conus_50k_per25sqmi.tif +population ssp5 2080 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2080_1km_conus_nuclear.tif +population ssp2 2075 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2075_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2065 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2065_1km_conus_50k_per25sqmi_25buffer.tif +population ssp2 2060 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp2_2060_1km_conus_nuclear.tif +population ssp3 2075 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2075_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2050 1km conus nuclear,gridcerf/scenario_specific/gridcerf_population_ssp5_2050_1km_conus_nuclear.tif +population ssp3 2045 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp3_2045_1km_conus_50k_per25sqmi.tif +population ssp2 2035 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2035_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2100 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2100_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2045 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2045_1km_conus_50k_per25sqmi_25buffer.tif +population ssp5 2060 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2060_1km_conus_50k_per25sqmi.tif +population ssp5 2080 1km conus 50k per25sqmi,gridcerf/scenario_specific/gridcerf_population_ssp5_2080_1km_conus_50k_per25sqmi.tif +population ssp2 2025 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp2_2025_1km_conus_50k_per25sqmi_25buffer.tif +population ssp3 2055 1km conus 50k per25sqmi 25buffer,gridcerf/scenario_specific/gridcerf_population_ssp3_2055_1km_conus_50k_per25sqmi_25buffer.tif +nhd2plus surfaceflow greaterthan10mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan10mgd_buffer20km.tif +epa nonattainment no2 conus,gridcerf/technology_specific/gridcerf_epa_nonattainment_no2_conus.tif +nrel wind offshore potential 160m 50cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_160m_50cf.tif +nrel wind onshore potential 80m 40cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_40cf.tif +nrel geothermal potential class2 or greater,gridcerf/technology_specific/gridcerf_nrel_geothermal_potential_class2_or_greater.tif +nrel wind onshore potential 120m 10cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_10cf.tif +blm m s owl d,gridcerf/technology_specific/gridcerf_blm_m_s_owl_d.tif +blm national conservation area,gridcerf/technology_specific/gridcerf_blm_national_conservation_area.tif +usceq cejst include health dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_health_dacs.tif +blm back country byways,gridcerf/technology_specific/gridcerf_blm_back_country_byways.tif +blm wildlife management area,gridcerf/technology_specific/gridcerf_blm_wildlife_management_area.tif +nrel solar csp potential 46cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_46cf.tif +blm drecp erma,gridcerf/technology_specific/gridcerf_blm_drecp_erma.tif +coalmines20km railnodes5km navwaters5km conus,gridcerf/technology_specific/gridcerf_coalmines20km_railnodes5km_navwaters5km_conus.tif +epa nonattainment pm2p5 conus,gridcerf/technology_specific/gridcerf_epa_nonattainment_pm2p5_conus.tif +state level wind exclusions,gridcerf/technology_specific/gridcerf_state_level_wind_exclusions.tif +blm uttr,gridcerf/technology_specific/gridcerf_blm_uttr.tif +blm restricted airspace and mtr,gridcerf/technology_specific/gridcerf_blm_restricted_airspace_and_mtr.tif +nrel solar pv potential 18cf,gridcerf/technology_specific/gridcerf_nrel_solar_pv_potential_18cf.tif +nhd2plus surfaceflow greaterthan15mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan15mgd_buffer20km.tif +nrel solar csp potential 44cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_44cf.tif +nrel geothermal potential class5 or greater,gridcerf/technology_specific/gridcerf_nrel_geothermal_potential_class5_or_greater.tif +nrel wind onshore potential 100m 35cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_35cf.tif +usceq cejst include pollution dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_pollution_dacs.tif +nrel wind offshore potential 140m 30cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_140m_30cf.tif +usgs earthquake pga 0.3 at 2pct in 50yrs conus,gridcerf/technology_specific/gridcerf_usgs_earthquake_pga_0.3_at_2pct_in_50yrs_conus.tif +blm srma exclude nevada yuma east,gridcerf/technology_specific/gridcerf_blm_srma_exclude_nevada_yuma_east.tif +nrel wind onshore potential 140m 25cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_25cf.tif +blm row exclusion area,gridcerf/technology_specific/gridcerf_blm_row_exclusion_area.tif +nhd2plus surfaceflow greaterthan145mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan145mgd_buffer20km.tif +nrel wind offshore potential 140m 55cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_140m_55cf.tif +seawater proximity 20mi buffer,gridcerf/technology_specific/gridcerf_seawater_proximity_20mi_buffer.tif +nhd2plus surfaceflow greaterthan10000mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan10000mgd_buffer20km.tif +nrel wind onshore potential 100m 50cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_50cf.tif +nrel wind onshore potential 100m 15cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_15cf.tif +blm grsg sfa exclusion,gridcerf/technology_specific/gridcerf_blm_grsg_sfa_exclusion.tif +nrel solar csp potential 38cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_38cf.tif +blm ca condor d,gridcerf/technology_specific/gridcerf_blm_ca_condor_d.tif +blm dod hraiz,gridcerf/technology_specific/gridcerf_blm_dod_hraiz.tif +nrel wind onshore potential 140m 40cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_40cf.tif +landmask 0-land,gridcerf/technology_specific/gridcerf_landmask_0-land.tif +nhd2plus surfaceflow greaterthan25mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan25mgd_buffer20km.tif +nrel wind offshore potential 100m 45cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_100m_45cf.tif +noaa marine sanctuaries,gridcerf/technology_specific/gridcerf_noaa_marine_sanctuaries.tif +nrel geothermal potential class4 or greater,gridcerf/technology_specific/gridcerf_nrel_geothermal_potential_class4_or_greater.tif +nrel solar csp potential 40cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_40cf.tif +nrel wind onshore potential 120m 30cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_30cf.tif +nrel wind offshore potential 160m 35cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_160m_35cf.tif +nrel solar csp potential 42cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_42cf.tif +nrel wind onshore potential 80m 25cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_25cf.tif +airports faa 12km buffer conus,gridcerf/technology_specific/gridcerf_airports_faa_12km_buffer_conus.tif +blm drecp srma,gridcerf/technology_specific/gridcerf_blm_drecp_srma.tif +nhd2plus surfaceflow greaterthan20mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan20mgd_buffer20km.tif +nrel geothermal potential class3 or greater,gridcerf/technology_specific/gridcerf_nrel_geothermal_potential_class3_or_greater.tif +nhd2plus surfaceflow greaterthan3000mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan3000mgd_buffer20km.tif +noaa offshore munitions zones,gridcerf/technology_specific/gridcerf_noaa_offshore_munitions_zones.tif +srtm slope 20pct or less,gridcerf/technology_specific/gridcerf_srtm_slope_20pct_or_less.tif +blm nv instant study areas,gridcerf/technology_specific/gridcerf_blm_nv_instant_study_areas.tif +blm grsg sfa hlsc,gridcerf/technology_specific/gridcerf_blm_grsg_sfa_hlsc.tif +blm grsg ghma hlsc,gridcerf/technology_specific/gridcerf_blm_grsg_ghma_hlsc.tif +usda nrsc prime farmland classification,gridcerf/technology_specific/gridcerf_usda_nrsc_prime_farmland_classification.tif +blm sage grouse habitat,gridcerf/technology_specific/gridcerf_blm_sage_grouse_habitat.tif +wind onshore no potential 100m,gridcerf/technology_specific/gridcerf_wind_onshore_no_potential_100m.tif +noaa submarine cable areas,gridcerf/technology_specific/gridcerf_noaa_submarine_cable_areas.tif +nrel wind onshore potential 140m 45cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_45cf.tif +usceq cejst exclude pollution dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_pollution_dacs.tif +usceq cejst include energy dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_energy_dacs.tif +nrel wind offshore potential 100m 40cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_100m_40cf.tif +blm long term visitor use areas,gridcerf/technology_specific/gridcerf_blm_long_term_visitor_use_areas.tif +nhd2plus surfaceflow greaterthan120mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan120mgd_buffer20km.tif +blm drecp nscma,gridcerf/technology_specific/gridcerf_blm_drecp_nscma.tif +blm land purchased w private funds,gridcerf/technology_specific/gridcerf_blm_land_purchased_w_private_funds.tif +nrel geothermal potential class1 or greater,gridcerf/technology_specific/gridcerf_nrel_geothermal_potential_class1_or_greater.tif +noaa shipping lanes regulations buffer 3km,gridcerf/technology_specific/gridcerf_noaa_shipping_lanes_regulations_buffer_3km.tif +nrel wind offshore potential 140m 50cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_140m_50cf.tif +nhd2plus surfaceflow greaterthan40mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan40mgd_buffer20km.tif +usceq cejst include climate dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_climate_dacs.tif +fema 1pct or greater coastal flood risk,gridcerf/technology_specific/gridcerf_fema_1pct_or_greater_coastal_flood_risk.tif +nrel wind onshore potential 100m 10cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_10cf.tif +usceq cejst exclude all dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_all_dacs.tif +airports faa 9km buffer conus,gridcerf/technology_specific/gridcerf_airports_faa_9km_buffer_conus.tif +nrel solar csp potential 24cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_24cf.tif +nrel solar csp potential 26cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_26cf.tif +usceq cejst include housing dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_housing_dacs.tif +nrel wind onshore potential 120m 5cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_5cf.tif +srtm slope 30pct or less,gridcerf/technology_specific/gridcerf_srtm_slope_30pct_or_less.tif +blm drecp ohv,gridcerf/technology_specific/gridcerf_blm_drecp_ohv.tif +blm vrm class III,gridcerf/technology_specific/gridcerf_blm_vrm_class_III.tif +nhd2plus surfaceflow greaterthan95mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan95mgd_buffer20km.tif +nrel wind onshore potential 120m 35cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_35cf.tif +nrel wind onshore potential 80m 20cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_20cf.tif +wind onshore no potential 120m,gridcerf/technology_specific/gridcerf_wind_onshore_no_potential_120m.tif +nrel wind offshore potential 160m 30cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_160m_30cf.tif +usda nrsc farmland of state importance,gridcerf/technology_specific/gridcerf_usda_nrsc_farmland_of_state_importance.tif +blm peis supplemental exclusions,gridcerf/technology_specific/gridcerf_blm_peis_supplemental_exclusions.tif +noaa offshore danger zones,gridcerf/technology_specific/gridcerf_noaa_offshore_danger_zones.tif +nhd2plus surfaceflow greaterthan7000mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan7000mgd_buffer20km.tif +blm ca desert wildlife management areas,gridcerf/technology_specific/gridcerf_blm_ca_desert_wildlife_management_areas.tif +nhd2plus surfaceflow greaterthan75mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan75mgd_buffer20km.tif +blm lands acquired for conservation,gridcerf/technology_specific/gridcerf_blm_lands_acquired_for_conservation.tif +nrel wind onshore potential 80m 45cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_45cf.tif +nrel solar csp potential 22cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_22cf.tif +nrel wind offshore potential 160m 55cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_160m_55cf.tif +nrel wind onshore potential 120m 15cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_15cf.tif +nrel wind onshore potential 120m 50cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_50cf.tif +blm nso restriction,gridcerf/technology_specific/gridcerf_blm_nso_restriction.tif +nrel wind offshore potential 100m 60cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_100m_60cf.tif +nrel wind offshore potential 100m 25cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_100m_25cf.tif +nhd2plus surfaceflow greaterthan50000mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan50000mgd_buffer20km.tif +nrel wind onshore potential 140m 20cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_20cf.tif +nrel wind onshore potential 140m 5cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_5cf.tif +nrel solar csp potential 20cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_20cf.tif +blm fringe toed lizard habitat,gridcerf/technology_specific/gridcerf_blm_fringe_toed_lizard_habitat.tif +nhd2plus surfaceflow greaterthan70mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan70mgd_buffer20km.tif +usceq cejst exclude water dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_water_dacs.tif +airports faa 7km buffer conus,gridcerf/technology_specific/gridcerf_airports_faa_7km_buffer_conus.tif +blm garden coal valley exclusions,gridcerf/technology_specific/gridcerf_blm_garden_coal_valley_exclusions.tif +wind onshore no potential 140m,gridcerf/technology_specific/gridcerf_wind_onshore_no_potential_140m.tif +nrel wind onshore potential 100m 30cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_30cf.tif +blm ivanpah valley exclusions,gridcerf/technology_specific/gridcerf_blm_ivanpah_valley_exclusions.tif +blm wind exclusion area,gridcerf/technology_specific/gridcerf_blm_wind_exclusion_area.tif +nrel wind offshore potential 140m 35cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_140m_35cf.tif +blm n s owl d,gridcerf/technology_specific/gridcerf_blm_n_s_owl_d.tif +usceq cejst include all dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_all_dacs.tif +nhd2plus surfaceflow greaterthan110mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan110mgd_buffer20km.tif +nrel solar pv potential 8cf,gridcerf/technology_specific/gridcerf_nrel_solar_pv_potential_8cf.tif +blm grsg phma exclusion,gridcerf/technology_specific/gridcerf_blm_grsg_phma_exclusion.tif +nrel solar pv potential 4cf,gridcerf/technology_specific/gridcerf_nrel_solar_pv_potential_4cf.tif +usceq cejst exclude energy dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_energy_dacs.tif +nrel wind onshore potential 140m 35cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_35cf.tif +nrel wind offshore potential 100m 30cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_100m_30cf.tif +uscb state coastal waters buffer 20mi,gridcerf/technology_specific/gridcerf_uscb_state_coastal_waters_buffer_20mi.tif +nhd2plus surfaceflow greaterthan200mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan200mgd_buffer20km.tif +wind offshore no potential 100m,gridcerf/technology_specific/gridcerf_wind_offshore_no_potential_100m.tif +epa nonattainment ozone conus,gridcerf/technology_specific/gridcerf_epa_nonattainment_ozone_conus.tif +nrel geothermal no resource potential,gridcerf/technology_specific/gridcerf_nrel_geothermal_no_resource_potential.tif +fema 1pct or greater inland flood risk,gridcerf/technology_specific/gridcerf_fema_1pct_or_greater_inland_flood_risk.tif +srtm slope 5pct or less,gridcerf/technology_specific/gridcerf_srtm_slope_5pct_or_less.tif +nrel wind onshore potential 100m 25cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_25cf.tif +blm vrm class I,gridcerf/technology_specific/gridcerf_blm_vrm_class_I.tif +blm desert wildlife management areas,gridcerf/technology_specific/gridcerf_blm_desert_wildlife_management_areas.tif +nhd2plus surfaceflow greaterthan1000mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan1000mgd_buffer20km.tif +usda nrsc farmland of local importance,gridcerf/technology_specific/gridcerf_usda_nrsc_farmland_of_local_importance.tif +srtm slope 10pct or less,gridcerf/technology_specific/gridcerf_srtm_slope_10pct_or_less.tif +noaa habitats of particular concern,gridcerf/technology_specific/gridcerf_noaa_habitats_of_particular_concern.tif +blm special recreation management area,gridcerf/technology_specific/gridcerf_blm_special_recreation_management_area.tif +blm drecp wildlife allocation,gridcerf/technology_specific/gridcerf_blm_drecp_wildlife_allocation.tif +epa nonattainment lead conus,gridcerf/technology_specific/gridcerf_epa_nonattainment_lead_conus.tif +carbon capture storage suitability,gridcerf/technology_specific/gridcerf_carbon_capture_storage_suitability.tif +blm off highway vehicle areas,gridcerf/technology_specific/gridcerf_blm_off_highway_vehicle_areas.tif +usgs aquifer nhd2plus surfaceflow 5mgd buffer20km,gridcerf/technology_specific/gridcerf_usgs_aquifer_nhd2plus_surfaceflow_5mgd_buffer20km.tif +nrel solar pv potential 6cf,gridcerf/technology_specific/gridcerf_nrel_solar_pv_potential_6cf.tif +nrel wind onshore potential 120m 45cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_45cf.tif +nrel wind onshore potential 80m 50cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_50cf.tif +nrel wind onshore potential 80m 15cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_15cf.tif +usceq cejst exclude transportation dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_transportation_dacs.tif +nrel wind offshore potential 160m 40cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_160m_40cf.tif +blm mojave ground squirrel habitat,gridcerf/technology_specific/gridcerf_blm_mojave_ground_squirrel_habitat.tif +airports faa 8km buffer conus,gridcerf/technology_specific/gridcerf_airports_faa_8km_buffer_conus.tif +usceq cejst exclude workforce dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_workforce_dacs.tif +nrel wind onshore potential 80m 35cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_35cf.tif +nrel wind offshore potential 160m 25cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_160m_25cf.tif +nrel wind offshore potential 160m 60cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_160m_60cf.tif +nrel wind onshore potential 120m 20cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_20cf.tif +blm solar energy zone exclusions,gridcerf/technology_specific/gridcerf_blm_solar_energy_zone_exclusions.tif +wind offshore no potential 160m,gridcerf/technology_specific/gridcerf_wind_offshore_no_potential_160m.tif +wind onshore no potential 80m,gridcerf/technology_specific/gridcerf_wind_onshore_no_potential_80m.tif +blm lands managed for wilderness character,gridcerf/technology_specific/gridcerf_blm_lands_managed_for_wilderness_character.tif +usceq cejst include water dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_water_dacs.tif +nhd2plus surfaceflow greaterthan700mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan700mgd_buffer20km.tif +nhd2plus surfaceflow greaterthan5mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan5mgd_buffer20km.tif +nrel wind offshore potential 100m 55cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_100m_55cf.tif +wind offshore no potential 140m,gridcerf/technology_specific/gridcerf_wind_offshore_no_potential_140m.tif +nrel wind onshore potential 140m 50cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_50cf.tif +nrel wind onshore potential 140m 15cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_15cf.tif +nrel solar csp potential 28cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_28cf.tif +blm grsg ghma mlsc,gridcerf/technology_specific/gridcerf_blm_grsg_ghma_mlsc.tif +nrel solar csp potential 50cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_50cf.tif +nhd2plus surfaceflow greaterthan55mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan55mgd_buffer20km.tif +nrel wind onshore potential 100m 40cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_40cf.tif +blm national scenic highways,gridcerf/technology_specific/gridcerf_blm_national_scenic_highways.tif +nrel wind offshore potential 140m 45cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_140m_45cf.tif +blm az recreational facilities,gridcerf/technology_specific/gridcerf_blm_az_recreational_facilities.tif +nhd2plus surfaceflow greaterthan35mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan35mgd_buffer20km.tif +usceq cejst exclude climate dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_climate_dacs.tif +nrel wind onshore potential 80m 30cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_30cf.tif +nrel wind onshore potential 120m 25cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_25cf.tif +nrel solar pv potential 10cf,gridcerf/technology_specific/gridcerf_nrel_solar_pv_potential_10cf.tif +nrel solar csp potential 36cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_36cf.tif +blm g eagle d,gridcerf/technology_specific/gridcerf_blm_g_eagle_d.tif +blm sharp tailed grouse habitat,gridcerf/technology_specific/gridcerf_blm_sharp_tailed_grouse_habitat.tif +epa nonattainment so2 conus,gridcerf/technology_specific/gridcerf_epa_nonattainment_so2_conus.tif +blm m s owl critical,gridcerf/technology_specific/gridcerf_blm_m_s_owl_critical.tif +nhd2plus surfaceflow greaterthan5000mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan5000mgd_buffer20km.tif +usda nrsc farmland of unique importance,gridcerf/technology_specific/gridcerf_usda_nrsc_farmland_of_unique_importance.tif +state level geothermal exclusions,gridcerf/technology_specific/gridcerf_state_level_geothermal_exclusions.tif +usceq cejst exclude health dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_health_dacs.tif +usgs aquifer nhd2plus surfaceflow 2mgd buffer20km,gridcerf/technology_specific/gridcerf_usgs_aquifer_nhd2plus_surfaceflow_2mgd_buffer20km.tif +nrel wind onshore potential 100m 5cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_5cf.tif +nrel solar csp potential 34cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_34cf.tif +nrel wind onshore potential 100m 45cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_45cf.tif +nrel solar pv potential 12cf,gridcerf/technology_specific/gridcerf_nrel_solar_pv_potential_12cf.tif +blm rmp wind avoidance area,gridcerf/technology_specific/gridcerf_blm_rmp_wind_avoidance_area.tif +usdot railnodes navwaters within5km,gridcerf/technology_specific/gridcerf_usdot_railnodes_navwaters_within5km.tif +nrel wind offshore potential 140m 40cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_140m_40cf.tif +epa nonattainment co conus,gridcerf/technology_specific/gridcerf_epa_nonattainment_co_conus.tif +noaa radar stations 5mi buffer,gridcerf/technology_specific/gridcerf_noaa_radar_stations_5mi_buffer.tif +usceq cejst include transportation dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_transportation_dacs.tif +usceq cejst exclude housing dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_exclude_housing_dacs.tif +blm row avoidance area,gridcerf/technology_specific/gridcerf_blm_row_avoidance_area.tif +nrel wind offshore potential 100m 50cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_100m_50cf.tif +nrel wind onshore potential 140m 10cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_10cf.tif +airports faa 13km buffer conus,gridcerf/technology_specific/gridcerf_airports_faa_13km_buffer_conus.tif +blm desert tortoise designated critical habitat,gridcerf/technology_specific/gridcerf_blm_desert_tortoise_designated_critical_habitat.tif +nrel wind offshore potential 140m 60cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_140m_60cf.tif +blm ap falcon d,gridcerf/technology_specific/gridcerf_blm_ap_falcon_d.tif +nrel wind offshore potential 140m 25cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_140m_25cf.tif +blm grsg phma hlsc,gridcerf/technology_specific/gridcerf_blm_grsg_phma_hlsc.tif +nhd2plus surfaceflow greaterthan2mgd buffer20km,gridcerf/technology_specific/gridcerf_nhd2plus_surfaceflow_greaterthan2mgd_buffer20km.tif +nrel wind onshore potential 100m 20cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_100m_20cf.tif +srtm slope 12pct or less,gridcerf/technology_specific/gridcerf_srtm_slope_12pct_or_less.tif +airports faa 10km buffer conus,gridcerf/technology_specific/gridcerf_airports_faa_10km_buffer_conus.tif +blm srma california,gridcerf/technology_specific/gridcerf_blm_srma_california.tif +noaa offshore wrecks obstructions,gridcerf/technology_specific/gridcerf_noaa_offshore_wrecks_obstructions.tif +nrel solar csp potential 48cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_48cf.tif +state level solar exclusions,gridcerf/technology_specific/gridcerf_state_level_solar_exclusions.tif +nrel wind onshore potential 140m 30cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_140m_30cf.tif +nrel wind offshore potential 100m 35cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_100m_35cf.tif +offshore areas withdrawn from leasing,gridcerf/technology_specific/gridcerf_offshore_areas_withdrawn_from_leasing.tif +epa nonattainment pm10 conus,gridcerf/technology_specific/gridcerf_epa_nonattainment_pm10_conus.tif +blm flat tailed horned lizard habitat,gridcerf/technology_specific/gridcerf_blm_flat_tailed_horned_lizard_habitat.tif +airports faa no buffer conus,gridcerf/technology_specific/gridcerf_airports_faa_no_buffer_conus.tif +blm designated special status species management areas,gridcerf/technology_specific/gridcerf_blm_designated_special_status_species_management_areas.tif +nrel solar pv potential 16cf,gridcerf/technology_specific/gridcerf_nrel_solar_pv_potential_16cf.tif +nrel solar csp potential 30cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_30cf.tif +nrel wind onshore potential 120m 40cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_120m_40cf.tif +blm drecp national conservation lands,gridcerf/technology_specific/gridcerf_blm_drecp_national_conservation_lands.tif +blm state scenic highways,gridcerf/technology_specific/gridcerf_blm_state_scenic_highways.tif +nrel solar csp potential 32cf,gridcerf/technology_specific/gridcerf_nrel_solar_csp_potential_32cf.tif +nrel wind offshore potential 160m 45cf,gridcerf/technology_specific/gridcerf_nrel_wind_offshore_potential_160m_45cf.tif +nrel wind onshore potential 80m 10cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_10cf.tif +nrel solar pv potential 14cf,gridcerf/technology_specific/gridcerf_nrel_solar_pv_potential_14cf.tif +blm ca condor critical,gridcerf/technology_specific/gridcerf_blm_ca_condor_critical.tif +bia land area representations conus,gridcerf/technology_specific/gridcerf_bia_land_area_representations_conus.tif +blm drecp dfa solar geothermal,gridcerf/technology_specific/gridcerf_blm_drecp_dfa_solar_geothermal.tif +usceq cejst include workforce dacs,gridcerf/technology_specific/gridcerf_usceq_cejst_include_workforce_dacs.tif +blm n s owl critical,gridcerf/technology_specific/gridcerf_blm_n_s_owl_critical.tif +noaa shipping lanes regulations,gridcerf/technology_specific/gridcerf_noaa_shipping_lanes_regulations.tif +usgs aquifer nhd2plus surfaceflow 55mgd buffer20km,gridcerf/technology_specific/gridcerf_usgs_aquifer_nhd2plus_surfaceflow_55mgd_buffer20km.tif +blm desert tortoise connectivity area,gridcerf/technology_specific/gridcerf_blm_desert_tortoise_connectivity_area.tif +nrel wind onshore potential 80m 5cf,gridcerf/technology_specific/gridcerf_nrel_wind_onshore_potential_80m_5cf.tif +blm vrm class II,gridcerf/technology_specific/gridcerf_blm_vrm_class_II.tif +blm b eagle d,gridcerf/technology_specific/gridcerf_blm_b_eagle_d.tif +uscb state coastal waters,gridcerf/technology_specific/gridcerf_uscb_state_coastal_waters.tif diff --git a/dash_app/layout.py b/dash_app/layout.py index 1a0d679..281a1d9 100644 --- a/dash_app/layout.py +++ b/dash_app/layout.py @@ -43,6 +43,10 @@ tech_pathways_dict = recur_dictify(df=tech_pathways_df[pathway]) all_options = tech_pathways_dict ## sourced +layer_catalogue = pd.read_csv(os.path.join("layer_catalogue.csv")) +layer_catalogue.rename(columns={'filename': 'label', 'filepath': 'value'}, inplace=True) +list_of_dicts = layer_catalogue[['label', 'value']].to_dict(orient='records') + # ----------------------------------------------------------------------------- # Dash app layout begins here. # ----------------------------------------------------------------------------- @@ -362,17 +366,17 @@ def tabs_card(): html.Br(), html.P("Explore individual layers in the database", className="guidance-text"), html.Br(), - dcc.Dropdown( - id='multi-layer-dropdown', - className="dropdown-select", - options=[ - {'label': 'Option 1', 'value': 'option1'}, - {'label': 'Option 2', 'value': 'option2'}, - {'label': 'Option 3', 'value': 'option3'} - ], - value=['option1'], # Initial selected values - multi=True - ), + html.Div(id="dropdown-container", + children=[ + dcc.Dropdown( + id='multi-layer-dropdown', + className="dropdown-select", + options=list_of_dicts, + value=[], + multi=True, + searchable=True + )] + ) # table_card(), # layer_metadata_card() ] @@ -544,7 +548,7 @@ def map(): map_selector(), html.Div(id="layer-container", children=[ - html.Button("X", id="close-layer-button", className="close-btn"), + # html.Button("X", id="close-layer-button", className="close-btn"), html.P("Layers", id='header0', className="header-text"), html.Hr(className="hr2"), # html.Div(id="basemap-layer", @@ -557,21 +561,21 @@ def map(): html.Div("Technology Layer", id="layer-concept", className="layer-concept"), html.Div(id="layer-funcs", className="layer-funcs", children=[ - html.Button( - id="opacity-btn", - children=[ - html.Img(id="opacity", src=app.get_asset_url("icons/map_icons/opacity.svg")), - ], - # className='button-selected', # Initially selected - n_clicks=1 - ), + # html.Button( + # id="opacity-btn", + # children=[ + # html.Img(id="opacity", src=app.get_asset_url("icons/map_icons/opacity.svg")), + # ], + # # className='button-selected', # Initially selected + # n_clicks=1 + # ), html.Button( id="visibility-btn", children=[ html.Img(id="visibility", src=app.get_asset_url("icons/map_icons/eye-open.svg")), ], # className='button-selected', # Initially selected - n_clicks=1 + n_clicks=2 ), ]) @@ -584,17 +588,17 @@ def map(): ] ), html.Hr(className="hr3"), - dcc.Checklist( - id='layer-selector', - options=[ - {'label': 'Basemap Ocean', 'value': 'base-map-ocean'}, # AB: need to predfine the database - {'label': 'Basemap Land', 'value': 'base-map'}, - {'label': 'Feasibility Layer', 'value': 'feasibility-layer'}, - ], - value=["base-map-ocean", "base-map", "feasibility-layer"], # Default selected layers - inline=True, - # style={'display': 'none'} - ), + # dcc.Checklist( + # id='layer-selector', + # options=[ + # {'label': 'Basemap Ocean', 'value': 'base-map-ocean'}, # AB: need to predfine the database + # {'label': 'Basemap Land', 'value': 'base-map'}, + # {'label': 'Feasibility Layer', 'value': 'feasibility-layer'}, + # ], + # value=["base-map-ocean", "base-map", "feasibility-layer"], # Default selected layers + # inline=True, + # # style={'display': 'none'} + # ), ]) ] ) @@ -668,6 +672,7 @@ def page_card(): header_card(), page_card(), # footer_card(), + dcc.Store(id="visibility-click-store", data=0), ], ) diff --git a/dash_app/src/deckgl.py b/dash_app/src/deckgl.py index 4268317..56f8cf6 100644 --- a/dash_app/src/deckgl.py +++ b/dash_app/src/deckgl.py @@ -34,10 +34,10 @@ # SOURCED SCRIPTS from src.reader import open_as_raster from layout import cache -from definitions import OUTDIR, MAPBOX_TOKEN +from definitions import OUTDIR, MAPBOX_TOKEN, DATA_DIR @cache.memoize(timeout=7200) # Cache for 2 hours -def load_large_data(layer_name, COMPILED_DIR, fpaths, adjust_mode, is_globe): +def load_large_data(layer_name, COMPILED_DIR, fpaths, adjust_mode, is_compiled, is_globe): if layer_name == "base-map-ocean": @@ -95,7 +95,11 @@ def load_large_data(layer_name, COMPILED_DIR, fpaths, adjust_mode, is_globe): # Got it down from 20 seconds to to 5-7 seconds just by using pandas CSV file - TIFPATH = os.path.join(COMPILED_DIR, fpaths[0]) + if is_compiled: + TIFPATH = os.path.join(COMPILED_DIR, fpaths[0]) + else: + TIFPATH = os.path.join(DATA_DIR, fpaths[0]) + print(TIFPATH) # ../../data/msdlive-gridcerf/gridcerf/compiled/compiled_technology_layers/ssp5/2025/biomass/gridcerf_biomass_conventional_no-ccs_dry.tif data_df, array, source_crs, geo_crs, df_coors_long, boundingbox, img = open_as_raster(TIFPATH=TIFPATH, is_reproject=True, is_convert_to_png=False) if adjust_mode: # When the switch is "True" @@ -174,7 +178,7 @@ def load_large_data(layer_name, COMPILED_DIR, fpaths, adjust_mode, is_globe): ) -def plot_deckgl_globe(COMPILED_DIR, fpaths, selected_layers, adjust_mode): +def plot_deckgl_globe(COMPILED_DIR, fpaths, selected_layers, adjust_mode, visibility_mode, is_compiled): view_state = pydeck.ViewState(latitude=39.8283, longitude=-98.5795, # center U.S. zoom=2, @@ -186,7 +190,7 @@ def plot_deckgl_globe(COMPILED_DIR, fpaths, selected_layers, adjust_mode): deck_layers = [] for layer in selected_layers: - layer = load_large_data(layer, COMPILED_DIR, fpaths, adjust_mode, is_globe=True) # Load data, cached if previously loaded + layer = load_large_data(layer, COMPILED_DIR, fpaths, adjust_mode, is_compiled, is_globe=True) # Load data, cached if previously loaded deck_layers.append(layer) r = pydeck.Deck( @@ -251,7 +255,7 @@ def plot_deckgl_globe(COMPILED_DIR, fpaths, selected_layers, adjust_mode): return mapgl -def plot_deckgl_map(COMPILED_DIR, fpaths, selected_layers, adjust_mode): +def plot_deckgl_map(COMPILED_DIR, fpaths, selected_layers, adjust_mode, visibility_mode, is_compiled): view_state = pydeck.ViewState(latitude=39.8283, longitude=-98.5795, zoom=4) # view = pydeck.View(type="_GlobeView", controller=True, width="100%", height="100%") # width=1000, height=700 @@ -260,7 +264,7 @@ def plot_deckgl_map(COMPILED_DIR, fpaths, selected_layers, adjust_mode): selected_layers = ["feasibility-layer"] for layer in selected_layers: - layer = load_large_data(layer, COMPILED_DIR, fpaths, adjust_mode, is_globe=False) # Load data, cached if previously loaded + layer = load_large_data(layer, COMPILED_DIR, fpaths, adjust_mode, is_compiled, is_globe=False) # Load data, cached if previously loaded deck_layers.append(layer) if adjust_mode: # if true