From 669aae207d99e32ed559a0f1422a24a507b44ba0 Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Thu, 7 Mar 2024 15:05:32 +0000 Subject: [PATCH 01/10] Configurable network filtering Restore prior functionality -- can request 'road-secondary', 'road-residential' as opposed to 'road'. Each filter string has its own file. Precursor to networks of varying fidelity. --- config/config.yaml | 5 ++++- config/osm_filters/road-primary.txt | 1 + tests/config/config.yaml | 2 +- ...> djibouti-latest_filter-road-secondary.osm.pbf} | Bin tests/integration/test_filter_osm_data.py | 2 +- workflow/transport-flood/flood_damages.smk | 12 ++++++------ workflow/transport/create_network.smk | 3 ++- workflow/transport/openstreetmap.smk | 2 +- workflow/transport/osm_to_geoparquet.smk | 5 +++-- 9 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 config/osm_filters/road-primary.txt rename tests/integration/filter_osm_data/expected/results/input/OSM/{djibouti-latest_filter-road.osm.pbf => djibouti-latest_filter-road-secondary.osm.pbf} (100%) diff --git a/config/config.yaml b/config/config.yaml index 74cf91af..f552dfa4 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -44,7 +44,10 @@ infrastructure_datasets: # these files contain osmium filter expressions for selecting relevant nodes, ways and relations from .osm.pbf files # the keys in the mapping, i.e. 'road' and 'rail' will be used to create FILTER_SLUG in rules network_filters: - road: 'config/osm_filters/road-residential.txt' + road-residential: 'config/osm_filters/road-residential.txt' + road-tertiary: 'config/osm_filters/road-tertiary.txt' + road-secondary: 'config/osm_filters/road-secondary.txt' + road-primary: 'config/osm_filters/road-primary.txt' rail: 'config/osm_filters/rail.txt' # OSM tag data to retain on selected features, typically for usage in network annotation/analysis diff --git a/config/osm_filters/road-primary.txt b/config/osm_filters/road-primary.txt new file mode 100644 index 00000000..c946d05f --- /dev/null +++ b/config/osm_filters/road-primary.txt @@ -0,0 +1 @@ +w/highway=motorway,motorway_link,trunk,trunk_link,primary,primary_link diff --git a/tests/config/config.yaml b/tests/config/config.yaml index ac14c594..1256fa9b 100644 --- a/tests/config/config.yaml +++ b/tests/config/config.yaml @@ -32,7 +32,7 @@ infrastructure_datasets: # these files contain osmium filter expressions for selecting relevant nodes, ways and relations from .osm.pbf files # the keys in the mapping, i.e. 'road' and 'rail' will be used to create FILTER_SLUG in rules network_filters: - road: 'config/osm_filters/road-secondary.txt' + road-secondary: 'config/osm_filters/road-secondary.txt' rail: 'config/osm_filters/rail.txt' # OSM tag data to retain on selected features, typically for usage in network annotation/analysis diff --git a/tests/integration/filter_osm_data/expected/results/input/OSM/djibouti-latest_filter-road.osm.pbf b/tests/integration/filter_osm_data/expected/results/input/OSM/djibouti-latest_filter-road-secondary.osm.pbf similarity index 100% rename from tests/integration/filter_osm_data/expected/results/input/OSM/djibouti-latest_filter-road.osm.pbf rename to tests/integration/filter_osm_data/expected/results/input/OSM/djibouti-latest_filter-road-secondary.osm.pbf diff --git a/tests/integration/test_filter_osm_data.py b/tests/integration/test_filter_osm_data.py index 1f26c5ad..5fb4308a 100644 --- a/tests/integration/test_filter_osm_data.py +++ b/tests/integration/test_filter_osm_data.py @@ -5,6 +5,6 @@ def test_filter_osm_data(): runner.run_snakemake_test( "filter_osm_data", ( - "results/input/OSM/djibouti-latest_filter-road.osm.pbf", + "results/input/OSM/djibouti-latest_filter-road-secondary.osm.pbf", ) ) diff --git a/workflow/transport-flood/flood_damages.smk b/workflow/transport-flood/flood_damages.smk index 9db1e784..560ec527 100644 --- a/workflow/transport-flood/flood_damages.smk +++ b/workflow/transport-flood/flood_damages.smk @@ -8,7 +8,7 @@ rule return_period_direct_damages: input: unsplit = rules.create_transport_network.output.edges, # for pre-intersection geometry exposure = rules.rasterise_osm_network.output.geoparquet, - rehab_cost=lambda wildcards: f"config/rehab_costs/{wildcards.FILTER_SLUG.replace('filter-', '')}.csv", + rehab_cost=lambda wildcards: f"config/rehab_costs/{wildcards.FILTER_SLUG.split('-')[1]}.csv", damage_curves="config/damage_curves/", output: damage_fraction = "{OUTPUT_DIR}/direct_damages/{DATASET}_{FILTER_SLUG}/{HAZARD_SLUG}/fraction_per_RP/{SLICE_SLUG}.geoparquet", @@ -25,7 +25,7 @@ rule return_period_direct_damages: """ Test with: -snakemake --cores 1 results/direct_damages/egypt-latest_filter-road/hazard-aqueduct-river/EAD_and_cost_per_RP/slice-5.geoparquet +snakemake --cores 1 results/direct_damages/egypt-latest_filter-road-tertiary/hazard-aqueduct-river/EAD_and_cost_per_RP/slice-5.geoparquet """ @@ -47,20 +47,20 @@ rule event_set_direct_damages: input: unsplit = rules.create_transport_network.output.edges, # for pre-intersection geometry exposure = rules.rasterise_osm_network.output.geoparquet, - rehab_cost=lambda wildcards: f"config/rehab_costs/{wildcards.FILTER_SLUG.replace('filter-', '')}.csv", + rehab_cost=lambda wildcards: f"config/rehab_costs/{wildcards.FILTER_SLUG.split('-')[1]}.csv", damage_curves="config/damage_curves/", output: damage_fraction = "{OUTPUT_DIR}/direct_damages/{DATASET}_{FILTER_SLUG}/{HAZARD_SLUG}/fraction/{SLICE_SLUG}.gpq", damage_cost = "{OUTPUT_DIR}/direct_damages/{DATASET}_{FILTER_SLUG}/{HAZARD_SLUG}/cost/{SLICE_SLUG}.gpq", params: - network_type=lambda wildcards: wildcards.FILTER_SLUG.replace('filter-', ''), + network_type=lambda wildcards: wildcards.FILTER_SLUG.split('-')[1], hazard_type=lambda wildcards: config["hazard_types"][wildcards.HAZARD_SLUG.replace('hazard-', '')] script: "./event_set_direct_damages.py" """ Test with: -snakemake --cores 1 results/direct_damages/thailand-latest_filter-road/hazard-jba-event/cost/slice-5.gpq +snakemake --cores 1 results/direct_damages/thailand-latest_filter-road-primary/hazard-jba-event/cost/slice-5.gpq """ @@ -92,4 +92,4 @@ rule concat_event_set_direct_damages: """ Test with: snakemake -c1 results/direct_damages/thailand-latest_filter-road/hazard-jba-event/cost.gpq -""" \ No newline at end of file +""" diff --git a/workflow/transport/create_network.smk b/workflow/transport/create_network.smk index 7b07d404..0174cc34 100644 --- a/workflow/transport/create_network.smk +++ b/workflow/transport/create_network.smk @@ -13,7 +13,8 @@ rule create_transport_network: edges="{OUTPUT_DIR}/geoparquet/{DATASET}_{FILTER_SLUG}/processed/{SLICE_SLUG}_edges.geoparquet" params: # determine the network type from the filter, e.g. road, rail - network_type=lambda wildcards: wildcards.FILTER_SLUG.replace('filter-', ''), + # example FILTER_SLUG values might be 'filter-road-tertiary' or 'filter-rail' + network_type=lambda wildcards: wildcards.FILTER_SLUG.split('-')[1], # pass in the slice number so we can label edges and nodes with their slice # edge and node IDs should be unique across all slices slice_number=lambda wildcards: int(wildcards.SLICE_SLUG.replace('slice-', '')) diff --git a/workflow/transport/openstreetmap.smk b/workflow/transport/openstreetmap.smk index abed9464..87c10b4d 100644 --- a/workflow/transport/openstreetmap.smk +++ b/workflow/transport/openstreetmap.smk @@ -35,5 +35,5 @@ rule filter_osm_data: """ Test with: -snakemake --cores all results/input/OSM/tanzania-mini_filter-road.osm.pbf +snakemake --cores all results/input/OSM/tanzania-mini_filter-road-primary.osm.pbf """ diff --git a/workflow/transport/osm_to_geoparquet.smk b/workflow/transport/osm_to_geoparquet.smk index 6157b988..8841ddae 100644 --- a/workflow/transport/osm_to_geoparquet.smk +++ b/workflow/transport/osm_to_geoparquet.smk @@ -4,7 +4,8 @@ rule osm_to_geoparquet: pbf=rules.slice.output.slice_path, params: # use the FILTER_SLUG to lookup the relevant keep_tags for this network type - keep_tags=lambda wildcards: config["keep_tags"][wildcards.FILTER_SLUG.replace('filter-', '')] + # example FILTER_SLUG values might be 'filter-road-tertiary' or 'filter-rail' + keep_tags=lambda wildcards: config["keep_tags"][wildcards.FILTER_SLUG.split('-')[1]] output: edges="{OUTPUT_DIR}/geoparquet/{DATASET}_{FILTER_SLUG}/raw/{SLICE_SLUG}_edges.geoparquet", nodes="{OUTPUT_DIR}/geoparquet/{DATASET}_{FILTER_SLUG}/raw/{SLICE_SLUG}_nodes.geoparquet", @@ -14,5 +15,5 @@ rule osm_to_geoparquet: """ Test with: -snakemake --cores all results/geoparquet/tanzania-mini_filter-road/raw/slice-0_edges.geoparquet +snakemake --cores all results/geoparquet/tanzania-mini_filter-road-primary/raw/slice-0_edges.geoparquet """ From 2da7ba728974a0a7e4197142811b8e45c7d5119e Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Fri, 8 Mar 2024 10:27:49 +0000 Subject: [PATCH 02/10] Use short file extension --- .../{edges.geoparquet => edges.gpq} | Bin .../{nodes.geoparquet => nodes.gpq} | Bin .../{edges.geoparquet => edges.gpq} | Bin .../{nodes.geoparquet => nodes.gpq} | Bin tests/integration/test_join_network.py | 4 ++-- workflow/power-tc/network_components.smk | 4 ++-- workflow/transport/join_network.smk | 6 +++--- 7 files changed, 7 insertions(+), 7 deletions(-) rename tests/integration/join_network/expected/results/djibouti-latest_filter-road/{edges.geoparquet => edges.gpq} (100%) rename tests/integration/join_network/expected/results/djibouti-latest_filter-road/{nodes.geoparquet => nodes.gpq} (100%) rename tests/integration/network_components/data/results/djibouti-latest_filter-road/{edges.geoparquet => edges.gpq} (100%) rename tests/integration/network_components/data/results/djibouti-latest_filter-road/{nodes.geoparquet => nodes.gpq} (100%) diff --git a/tests/integration/join_network/expected/results/djibouti-latest_filter-road/edges.geoparquet b/tests/integration/join_network/expected/results/djibouti-latest_filter-road/edges.gpq similarity index 100% rename from tests/integration/join_network/expected/results/djibouti-latest_filter-road/edges.geoparquet rename to tests/integration/join_network/expected/results/djibouti-latest_filter-road/edges.gpq diff --git a/tests/integration/join_network/expected/results/djibouti-latest_filter-road/nodes.geoparquet b/tests/integration/join_network/expected/results/djibouti-latest_filter-road/nodes.gpq similarity index 100% rename from tests/integration/join_network/expected/results/djibouti-latest_filter-road/nodes.geoparquet rename to tests/integration/join_network/expected/results/djibouti-latest_filter-road/nodes.gpq diff --git a/tests/integration/network_components/data/results/djibouti-latest_filter-road/edges.geoparquet b/tests/integration/network_components/data/results/djibouti-latest_filter-road/edges.gpq similarity index 100% rename from tests/integration/network_components/data/results/djibouti-latest_filter-road/edges.geoparquet rename to tests/integration/network_components/data/results/djibouti-latest_filter-road/edges.gpq diff --git a/tests/integration/network_components/data/results/djibouti-latest_filter-road/nodes.geoparquet b/tests/integration/network_components/data/results/djibouti-latest_filter-road/nodes.gpq similarity index 100% rename from tests/integration/network_components/data/results/djibouti-latest_filter-road/nodes.geoparquet rename to tests/integration/network_components/data/results/djibouti-latest_filter-road/nodes.gpq diff --git a/tests/integration/test_join_network.py b/tests/integration/test_join_network.py index 0d94849a..4188f9cf 100644 --- a/tests/integration/test_join_network.py +++ b/tests/integration/test_join_network.py @@ -5,7 +5,7 @@ def test_join_network(): runner.run_snakemake_test( "join_network", ( - "results/djibouti-latest_filter-road/nodes.geoparquet", - "results/djibouti-latest_filter-road/edges.geoparquet", + "results/djibouti-latest_filter-road/nodes.gpq", + "results/djibouti-latest_filter-road/edges.gpq", ) ) diff --git a/workflow/power-tc/network_components.smk b/workflow/power-tc/network_components.smk index f5124f6a..59890bf2 100644 --- a/workflow/power-tc/network_components.smk +++ b/workflow/power-tc/network_components.smk @@ -1,7 +1,7 @@ rule network_components: input: - nodes="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/nodes.geoparquet", - edges="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/edges.geoparquet", + nodes="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/nodes.gpq", + edges="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/edges.gpq", output: component_population="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/component_population.svg", component_map="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/network_map_by_component.png", diff --git a/workflow/transport/join_network.smk b/workflow/transport/join_network.smk index e2f140c6..b143e22c 100644 --- a/workflow/transport/join_network.smk +++ b/workflow/transport/join_network.smk @@ -16,12 +16,12 @@ rule join_network: i=range(config['slice_count']) ), output: - nodes="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/nodes.geoparquet", - edges="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/edges.geoparquet" + nodes="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/nodes.gpq", + edges="{OUTPUT_DIR}/{DATASET}_{FILTER_SLUG}/edges.gpq" script: "./join_network.py" """ Test with: -snakemake --cores all results/tanzania-mini_filter-road/nodes.geoparquet +snakemake --cores all results/tanzania-mini_filter-road/nodes.gpq """ From 4fef5de938ca4c80f319b526cfb1e2007142d26b Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Fri, 15 Mar 2024 16:51:48 +0000 Subject: [PATCH 03/10] Use default snkit id column names --- src/open_gira/network.py | 6 ----- workflow/transport/join_network.py | 41 ++++++++---------------------- workflow/transport/utils.py | 32 +++++++++++------------ 3 files changed, 27 insertions(+), 52 deletions(-) diff --git a/src/open_gira/network.py b/src/open_gira/network.py index 52198d8c..56030867 100644 --- a/src/open_gira/network.py +++ b/src/open_gira/network.py @@ -77,10 +77,4 @@ def create_network( logging.info("Creating network topology") network = snkit.network.add_topology(network, id_col="id") - network.edges.rename( - columns={"from_id": "from_node_id", "to_id": "to_node_id", "id": "edge_id"}, - inplace=True, - ) - network.nodes.rename(columns={"id": "node_id"}, inplace=True) - return network diff --git a/workflow/transport/join_network.py b/workflow/transport/join_network.py index e755785a..27ba61b8 100644 --- a/workflow/transport/join_network.py +++ b/workflow/transport/join_network.py @@ -25,14 +25,10 @@ def concat_slices(slice_files: Iterable[str]) -> gpd.GeoDataFrame: if __name__ == "__main__": - try: - node_slice_files = snakemake.input["nodes"] # type: ignore - edge_slice_files = snakemake.input["edges"] # type: ignore - nodes_output_file = snakemake.output["nodes"] # type: ignore - edges_output_file = snakemake.output["edges"] # type: ignore - except NameError: - # not sure of an elegant way to handle the two lists of input filenames - sys.exit("please invoke via snakemake") + node_slice_files = snakemake.input["nodes"] + edge_slice_files = snakemake.input["edges"] + nodes_output_file = snakemake.output["nodes"] + edges_output_file = snakemake.output["edges"] logging.basicConfig(format="%(asctime)s %(process)d %(filename)s %(message)s", level=logging.INFO) @@ -44,32 +40,17 @@ def concat_slices(slice_files: Iterable[str]) -> gpd.GeoDataFrame: logging.info("Joining network edge slices") edges = concat_slices(edge_slice_files) - # drop the ids we used on a per-slice basis - nodes = nodes.drop(["node_id"], axis="columns") - edges = edges.drop(["edge_id", "from_node_id", "to_node_id"], axis="columns") - network = snkit.network.Network(edges=edges, nodes=nodes) - # relabel with network-wide ids prior to adding topology -# logging.info("Labelling edges and nodes with ids") -# network = snkit.network.add_ids(network) - -# logging.info("Labelling edge ends with node ids") -# network = snkit.network.add_topology(network) - - # TODO: adding the topology and component ids needs accelerating, 9M rows takes over a day - - # TODO: check what takes the time, is it identifying the components or labelling them? - - # perhaps, do it for each slice, and then at this step, check which slice components - # join neighbouring slice components and relabel components as such - # N.B. this will require using the {start|end}_node_reference=NaN nodes - # N.B. these should only be at bbox edges, but appear to be all over slices + # ensure we haven't reused any ids + assert len(network.nodes) == len(network.nodes.id.unique()) + assert len(network.edges) == len(network.edges.id.unique()) - # another option is to use igraph rather than networkx in snkit to identify the components + logging.info("Labelling edge ends with from/to node ids") + network = snkit.network.add_topology(network) -# logging.info("Labelling edges and nodes with network component ids") -# network = snkit.network.add_component_ids(network) + logging.info("Labelling edges and nodes with network component ids") + network = snkit.network.add_component_ids(network) logging.info("Writing network to disk") network.nodes.to_parquet(nodes_output_file) diff --git a/workflow/transport/utils.py b/workflow/transport/utils.py index 8e860b9e..decfc096 100644 --- a/workflow/transport/utils.py +++ b/workflow/transport/utils.py @@ -99,8 +99,8 @@ def annotate_country(network: snkit.network.Network, countries: gpd.GeoDataFrame Arguments: network (snkit.network.Network): Network to label with geographic information - network.edges must have 'from_node_id', 'to_node_id' - network.nodes must have 'node_id', 'geometry' + network.edges must have 'from_id', 'to_id' + network.nodes must have 'id', 'geometry' countries (gpd.GeoDataFrame): Table required to contain the following columns: 'iso_a3', 'geometry' @@ -113,8 +113,8 @@ def annotate_country(network: snkit.network.Network, countries: gpd.GeoDataFrame nodes = network.nodes # check we have required inputs - assert set(edges.columns.values).issuperset({"from_node_id", "to_node_id"}) - assert set(nodes.columns.values).issuperset({"node_id", "geometry"}) + assert set(edges.columns.values).issuperset({"from_id", "to_id"}) + assert set(nodes.columns.values).issuperset({"id", "geometry"}) assert set(countries.columns.values).issuperset({"iso_a3", "geometry"}) # check our inputs have a registered CRS @@ -155,27 +155,27 @@ def annotate_country(network: snkit.network.Network, countries: gpd.GeoDataFrame crs=input_node_crs ) - # set edge.from_node_id from node.node_id and use iso_a3 of from node as edge start + # set edge.from_iso_a3 from node.iso_a3 of edge.from_id edges = pd.merge( edges, - nodes[["node_id", "iso_a3"]], + nodes[["id", "iso_a3"]], how="left", - left_on=["from_node_id"], - right_on=["node_id"], + left_on=["from_id"], + right_on=["id"], ) - edges.rename(columns={"iso_a3": "from_iso_a3"}, inplace=True) - edges.drop("node_id", axis=1, inplace=True) + edges = edges.drop("id_y", axis=1) + edges = edges.rename(columns={"iso_a3": "from_iso_a3", "id_x": "id"}) - # set edge.to_node_id from node.node_id and use iso_a3 of from node as edge end + # set edge.to_iso_a3 from node.iso_a3 of edge.to_id edges = pd.merge( edges, - nodes[["node_id", "iso_a3"]], + nodes[["id", "iso_a3"]], how="left", - left_on=["to_node_id"], - right_on=["node_id"], + left_on=["to_id"], + right_on=["id"], ) - edges.rename(columns={"iso_a3": "to_iso_a3"}, inplace=True) - edges.drop("node_id", axis=1, inplace=True) + edges = edges.drop("id_y", axis=1) + edges = edges.rename(columns={"iso_a3": "to_iso_a3", "id_x": "id"}) network.nodes = nodes network.edges = edges From b83d63b3d608c1cbf8730aacb104b05da4ec8ac4 Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Fri, 15 Mar 2024 16:52:36 +0000 Subject: [PATCH 04/10] Prepend edge/node id with OSM dataset --- workflow/transport/create_rail_network.py | 20 ++++++++++---------- workflow/transport/create_road_network.py | 15 ++++++++------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/workflow/transport/create_rail_network.py b/workflow/transport/create_rail_network.py index 1eb68268..487f93e4 100644 --- a/workflow/transport/create_rail_network.py +++ b/workflow/transport/create_rail_network.py @@ -19,14 +19,14 @@ if __name__ == "__main__": - osm_edges_path = snakemake.input["edges"] # type: ignore - osm_nodes_path = snakemake.input["nodes"] # type: ignore - administrative_data_path = snakemake.input["admin"] # type: ignore - nodes_output_path = snakemake.output["nodes"] # type: ignore - edges_output_path = snakemake.output["edges"] # type: ignore - slice_number = int(snakemake.params["slice_number"]) # type: ignore - - slice_number = int(slice_number) + osm_edges_path = snakemake.input["edges"] + osm_nodes_path = snakemake.input["nodes"] + administrative_data_path = snakemake.input["admin"] + dataset_name = snakemake.wildcards.DATASET + nodes_output_path = snakemake.output["nodes"] + edges_output_path = snakemake.output["edges"] + slice_number = int(snakemake.params["slice_number"]) + osm_epsg = 4326 logging.basicConfig(format="%(asctime)s %(process)d %(filename)s %(message)s", level=logging.INFO) @@ -58,7 +58,7 @@ # pass an id_prefix containing the slice number to ensure edges and nodes # are uniquely identified across all slices in the network - network = create_network(edges=edges, nodes=nodes, id_prefix=f"{slice_number}") + network = create_network(edges=edges, nodes=nodes, id_prefix=f"{dataset_name}_{slice_number}") logging.info( f"Network contains {len(network.edges)} edges and {len(network.nodes)} nodes" ) @@ -91,4 +91,4 @@ network.edges.to_parquet(edges_output_path) network.nodes.to_parquet(nodes_output_path) - logging.info("Done creating network") \ No newline at end of file + logging.info("Done creating network") diff --git a/workflow/transport/create_road_network.py b/workflow/transport/create_road_network.py index a03b37b3..6ddbe87f 100644 --- a/workflow/transport/create_road_network.py +++ b/workflow/transport/create_road_network.py @@ -149,12 +149,13 @@ def annotate_condition(network: snkit.network.Network) -> snkit.network.Network: if __name__ == "__main__": - osm_edges_path = snakemake.input["edges"] # type: ignore - osm_nodes_path = snakemake.input["nodes"] # type: ignore - administrative_data_path = snakemake.input["admin"] # type: ignore - nodes_output_path = snakemake.output["nodes"] # type: ignore - edges_output_path = snakemake.output["edges"] # type: ignore - slice_number = int(snakemake.params["slice_number"]) # type: ignore + osm_edges_path = snakemake.input["edges"] + osm_nodes_path = snakemake.input["nodes"] + administrative_data_path = snakemake.input["admin"] + dataset_name = snakemake.wildcards.DATASET + nodes_output_path = snakemake.output["nodes"] + edges_output_path = snakemake.output["edges"] + slice_number = int(snakemake.params["slice_number"]) osm_epsg = 4326 @@ -178,7 +179,7 @@ def annotate_condition(network: snkit.network.Network) -> snkit.network.Network: # for roads we do not currently use any nodes extracted from OSM (osm_nodes_path) logging.info("Creating road network") - network = create_network(edges=clean_edges(edges), nodes=None, id_prefix=f"{slice_number}") + network = create_network(edges=clean_edges(edges), nodes=None, id_prefix=f"{dataset_name}_{slice_number}") logging.info( f"Network contains {len(network.edges)} edges and {len(network.nodes)} nodes" ) From f452b393f555715650c02e0ffa4799749253610b Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Fri, 15 Mar 2024 16:53:13 +0000 Subject: [PATCH 05/10] Update test input/output --- .../processed/slice-0_edges.geoparquet | Bin 17550 -> 17884 bytes .../processed/slice-0_nodes.geoparquet | Bin 10376 -> 10485 bytes .../processed/slice-0_edges.geoparquet | Bin 94430 -> 94915 bytes .../processed/slice-0_nodes.geoparquet | Bin 8286 -> 8441 bytes .../processed/slice-0_edges.geoparquet | Bin 106798 -> 106687 bytes .../processed/slice-0_nodes.geoparquet | Bin 8274 -> 8241 bytes .../processed/slice-1_edges.geoparquet | Bin 53154 -> 53033 bytes .../processed/slice-1_nodes.geoparquet | Bin 6284 -> 6261 bytes .../processed/slice-2_edges.geoparquet | Bin 163058 -> 162928 bytes .../processed/slice-2_nodes.geoparquet | Bin 14990 -> 14955 bytes .../processed/slice-3_edges.geoparquet | Bin 45687 -> 45565 bytes .../processed/slice-3_nodes.geoparquet | Bin 6826 -> 6784 bytes .../djibouti-latest_filter-road/edges.gpq | Bin 267715 -> 278946 bytes .../djibouti-latest_filter-road/nodes.gpq | Bin 14872 -> 18882 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/integration/create_rail_network/expected/results/geoparquet/djibouti-latest_filter-rail/processed/slice-0_edges.geoparquet b/tests/integration/create_rail_network/expected/results/geoparquet/djibouti-latest_filter-rail/processed/slice-0_edges.geoparquet index 758cc46b6aa00558addfe19f2d7b13a312cb103e..4a4da4075092c72a2ace92b36ee9b41c8bcc62b4 100644 GIT binary patch delta 3054 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 diff --git a/tests/integration/create_road_network/expected/results/geoparquet/djibouti-latest_filter-road/processed/slice-0_edges.geoparquet b/tests/integration/create_road_network/expected/results/geoparquet/djibouti-latest_filter-road/processed/slice-0_edges.geoparquet index be069fd378d5deaf58f2954388b049bbb84ab677..3b638b558c23db172cb30b354a055f0ff895afbc 100644 GIT binary patch delta 4756 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 delta 4294 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 ZQqp&zHUfsT>?32!J!?6o5n973|1ZDli3R`w delta 1165 zcmbV}UvJV-7{=SJG_6KMd32k93D~x1Aw%yeD z0hYyj;e{8*_yJ6~^I|bxnD`aU+!t7~dvAz}l5rj4E^HjbPDjXL48wwzpxug501boy24DdW2m=wjmEehy1VIIzHjDyjAOtV~ z3vfUfh&XM|9H>{LT^2%MybcWbt^*6cf1sU<92l>F;JAA){u07qybclY4M0Q~`@!Ib zS(Ao?zhIgV5#|rjn|9Jc1S>p44#V%z-&y3~>wwoa=3z0*O%G{pZOXNZBD;p%hq(Kf z)BVX7*q;u3pY(Fr>{*}w%%Kc@oz=fNCP$8E0`F(^6GzTf6J@ow+O#0M*0?!EM$;P*QsT~JH3x{*@4YpJHt7K%F?C7N9qi_6MW1u0^a z-w;;#wh+^OcUJY)sc}uB`FeRNt7KwG5t^zhCJS}3nb;N*& zz)Hz}q+Dd%Wg21^Q(NHg$VIAKTj7JXQdCVfHen22sWw*{a?I4Xg;HT1GJ<6zKgn7t zF}cH+7Inhw*Q5n?U23JD%e$tR7E0;8YLV}lIgL1#X`oIvmgbFFFJ=)`sr95S(v10u zS%v9l8d;^DN5=EmSj6)R#f@?+2N&3dBEM|9lEx;=>yti@)-p7{0ZRn-;t8`Mx@H*6 z(kKv;fav*kqwJF5&!cD_#Snrxsef>Epedg>&q|s7{o#xf{Lmq*B2B6CLi!eKyu&c) RPp|&PH)lI_VOS0osNXzx8BhQK diff --git a/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-0_edges.geoparquet b/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-0_edges.geoparquet index afff1f2dbda829dee7fb2a2f7f4a3f6b65478cd8..c86810e247b277b1ed2adaf2f5485536bfa34c85 100644 GIT binary patch delta 7139 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 bCh6~whhk9;wxVx52Y$)ocKnQq|JVC(1C#EB delta 7148 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 CyX~+5 diff --git a/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-0_nodes.geoparquet b/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-0_nodes.geoparquet index 19f15a7a99d16ebaa58eefc9bde5fc6f3db5b69b..aafd2eb7013c510d851d4bee413628dd03751831 100644 GIT binary patch delta 1429 zcmb7ETWBLy7@kR!bdqhdy-l2?NgJ|my49u4q)ED|Et^R?NoU&hl5BHZikoTDblSA< z`IWuF-zAXLO?CO$`wxD5d5sOd^>DWG-QCIe!K*r_#^D8@>TckjU_*bS4byi5b9 zBQ+R_k)3eCFo^EX3G%AGg$`V9ub45fY2hCMIAH@Pi4G__FhmT15J7-NBBav>0z+58 zi^P;pd(LOr2VW8-ctD(j%`Aqx{hHfOc3Azer4zr#`DaYpl8^%+( z23#{fc{K48$0FSS51RWpiu3;og=K#X&g&*DcTV?Wn012EZ{_7ezC!ICetbg4d&Pq5 ztkbnB7Nx?|a=u)2jXPZ+Y5GY+`@y8S@1%FwGd$|r!Kk)Uag+K5l+4fKV~5|HFKSH{ z7<@bVAr+&+b-~-9g|vU0Ti-0DM=N69E7ful*gC>DvuVGaOL7%x*Rp9^ zLNS7zst6G!UgG3APd3AQ&}KZMsJ<}Di1Q-jpG&s-DP(kR#~D7nc^%k@`N2Y9f~jBVxp)ZGjH1#bMkgiVtq@LVXUNuu+vmVKt#eFO;P| zdw44ctp-YHFbw1ylb&Q=S!hL*0a-Fx8;u ePGXc33^;8z+K+w_)(Ja?wZ7O#B!;2?;y(dRorVJd delta 1598 zcmb_dTWs4@7`78PO}eEMZ5@){6}Gf!Q|dUE*4rxLq)zHA?HYHD6C)JjTpBlyQf>#6B81efIgsc6B1~GCnnBudSM789F;?1rw14_+aIcPF{vd28|d>(-I< z?adR0pKvGD{oNC$w->nJtxtYFyzYL@Kovf0KIcwz!J)UlJ~8a3F~AcId>h;(E?9aV zzWe;A&t4qZ0`qNC4^iBYzy5x?#0B5IAFpk@)pqbk+puBs9{8y33QmBs>57rSOrWz} z=p#r2Mq-eb0mIOC=K%Slsl^VQZ?7F9=zt}N(bl=vdci!{MtH|9DKKarZ6|yamK5d# zbLJ6HGxv330cf|kz^m~39Ww#8%!deU!a4`;m?vO(($Yx09Fg|f&KtCN>CZbXE#zA3UeHT{Ql0jpB#>(Yw(3-5Muvkc{H*$ zx{qyAYSm2E+k(D~+pglSZ$?~KM-a4;J2P!JPR00tLN%Lvo)ovAuEsD=k_|+F}rcGP__R6W;>t8eVZS5 zK2CHX^;}iaR-C}wJ#D1iKJZNU#E=JJL5G8^AeY!hA} zxseO=0e-6N*^$+j9AQ%P2xKRi$}GzjK`lg+YbcQDttoOPvLekx->BasN1HW19IIr- zWKD`N;FrE`ur-j_fUJ}CG|iMDL#e zVpdG(=2Asf<)~2H%OxDE%e0`T=*^o00eoXt@ipU1tWrd^&_b}duzntfmQt~`tjN@L znoC@LHtbvDH462VWuxe&pHPEYHa-O>X#yU&h(0qRz2U8KLV8wj_;QYBis>_`;cIC0 z(r|5zL2W1`>{+z{b&;J$n_OYaQj%Gg*eMQqLDU5_q%a25>qHX!P8_F4h4TcTzYsu# sLYgEpD^f~WEhKjJ)?MGpNz6V3{ut_Y=pUcsWIu+re%LmNVdziePa$r(K>z>% diff --git a/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-1_edges.geoparquet b/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-1_edges.geoparquet index d679a79e4a2d443852416a84a349e86bc86af5a3..4f37210e6fa85d09f1b46dc880c0ff3e80524fb6 100644 GIT binary patch delta 6676 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 QdzHzfUhAeP@{geZ0vLIcr2qf` delta 6650 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 diff --git a/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-1_nodes.geoparquet b/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-1_nodes.geoparquet index 4a9a09a4ac25a7044bdae4aff8ca4719a0279fc5..79ea12ac85bbffebe245bb0204f36bfe07954d3b 100644 GIT binary patch delta 1346 zcmbtUO>Y}T7@l1xPD2yn;_P;fTw%7z^pGar^+)O`RXcWUXIbdj&C|WotdH|@ zUi=0lpZ@N9e3jiSCJ+A6NV~e@L`0(e9 znE!Ncni>#TWO6L;<9}uNADQrX-tgnuU;5CB>(~& zg16VO%*H_Y`0S~t!z>|FTn>qQsM$7mtwyIQu7^Z?fA+U!DZUa}iHHw~*Ui`+H~RzB zwP=J)d{OZM5In7BS9pdWdhau9XNz<9W)=s;e^1=*B5NqVhx-@H9%&_lf4F$V6I+om zv*4fqMp&g|0`ZlFTZxteABRSSb%(}`O!a6`NW&9kL@WCSA$S)-n;7VMY@`YK&DKCk=a0=? z)uup2O){y!CMO4`DvdPREne4N6dl!6sZC>bt2)rrv|zngSC0-g`Co;Rk;@YD_*?!? zertg0YWzT#D?PnqP$sBat>g;tw$R?Ws_wN8$)isZA*##Ov94AlhINQfc>&irAAXZx znnO*k(l#de3BT?yr0I42lhaVkBsOsNI-g)pGE(6HlE&nd&ILHcvd3Dq-ZrdKPnTm3 zr6P*ig@Yp6E7QKv=BK*T9fZ`Fj!+3vN2)?SkhYC>bUJc$)6hy|P0k#X_!fF1V6J@#;bw*=5FPGNW2yzWT>X*iFRElRj!ua{$Z#d>Y^kJDR$WaF z>sn>fbShDQ8QyYpZ{7q#sMqL!Flr938@=B3M!(;+L(gBZko)QdHi7`SKk$Tn59x>V EZ#@`i7XSbN delta 1407 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 E0gZWrD*ylh diff --git a/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-2_nodes.geoparquet b/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-2_nodes.geoparquet index 5de4d200b0e886639ad8c56189c8531abb1f39f0..856cf599621af35be4621b564f60ba42eae817d4 100644 GIT binary patch delta 1257 zcmah}O>7%Q6y9|l!=a@X$+~MhO*SS8sT%+6+D^QoEsULbW!G-}(|9)2m>IZ$9JJGHw{QU_{=+I3LGXCn)4(%HY_enAcq4kyfbi(Z1V5fni= z(L@jk|4D@UoIZs2zw}-o8n$zs{}uRj{4C@qqG%QIKfcE-!}^2(pHE!!*g4+ZCb(Pw zj_|E*dpLCZ3CuCluszJZzY9NQt|2et{~G?zM36WC=ojQI-J5j6yOWV~W@wJ%_+dnV zyTOHdMCT6&^_OD~lXmuhocxYF_iT?GqfWV_h_;)y=_+M&?K)g9-f-g=2`B|4r^bj^F>_AF>eT zJAW+d`r>;Mai4kF^>~jQB?$LL+EFiCYPmt*?f*GlBS&@BH^=xkbj?t2SY=c5Eiyj% z?(4tW*eI;ede3lyP$2BPL(oH2twukCAI;t-7y4({tLawLcOBmLryMK- zhkWqOSr7c#?;Vc>Sl=CV^b{x*R>Z|dWm7ZD^g}v`e;qg;cxxV{007Hq08m9ET}>i8 zSZlfMV6crhK^7a(Mng~yr5$g<`+)~!w|_Z!F#Kwzo0?B08~Uoi*A*+TOGW63mhGL) z7Jxg^D?9mCwwUHO@&F_TH|6n+v*Ht6!7= delta 1332 zcmb_cPi)&%9JZS*tI(7Qh9gIbS~qlACfdYt;-uamF*~%G(?;? zIjN}H1JXF4O6bAF86gBml*_gY+>kho3ld0Nd)omCP6#ydp3@)-S1iBh-+S+S@B6;r z@5#>xC&Medd_GLriQ`8&@k~h*#}2~&)s?s#w@bYkF-!FMUWSIp{D)5g+g5Q^K!|}@?M@is5wFJJV1hBKRad9ycqg~%E zf;U#)_dYlcFx&-rFjHY79HjZxLHy}hv&2kKSAM|vPET+zammd>Id1Zz(NXFZRUsB! z#}3zvo30Ni|ECXe|4)WDh6U_Qh2uyYQ=u{U8dUmkT1X`DXoSs zpNB4hk5^xF%*eo#)z{~_kk7&V|CcoXqYwY~2%wtl=V)Ayf5xF(|Dx;j6Z};SbKfEz z-KwEf`{XCnU#@oWm9wPy)+k>?t!qlfsOoj!4azrP0EhlNAam^%@a?sa@EEuk@LUcD zqrr&p5F>5PdWU=t9tPgUqf`6!x9u;Xox2^?82Es;F52i|6g*zvSPBPe-yz&^iO=VE zq#ONOtFBkcZ^#gOCcqiI6Kje*&u_xU^G(=Nxh>dRzXDf^9@0Y441vXsbQCJq zWIa17C!r&BSRz#@Y?cN)C^P3t50EP<(pSO#xaYQBl?wgx7B?(OVa@Ujy~<2jQ|_i% z%d;Us|IlKXqw7WC43lD&WZ?i%8{2`Q%;dEqqqS!lDtF7$xLsuCMtD`$xpuk0P5+3; z@uLzfR@4*?D-UM{$u<p4)^EntMOmw|qAP9N1 z!lMeK;?JKX3aZ8IsK{&{Kzt4188G1}r*+3zn5zOTKo0!Ky>rvrg^|nMYVX0YK3K1H jyX)0nuVYf9dati`3@R3+gS7jW7sF;R_8Wm==vVm{yH|8( diff --git a/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-3_edges.geoparquet b/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-3_edges.geoparquet index 757e9cc03478dbec8da903f53f1ed5f57d8799c4..8efea8d2b6968222875650eaf112455e8b5ba776 100644 GIT binary patch delta 6650 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 ac>#R*(o!-trT);H{HX!|DGvX;=l=lNWUQzF delta 6865 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 diff --git a/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-3_nodes.geoparquet b/tests/integration/join_network/data/results/geoparquet/djibouti-latest_filter-road/processed/slice-3_nodes.geoparquet index 3a26c6a93e2e7c01ae4df4316b721420c56412f9..fdabcb85f157ee4158de6706350250198150afed 100644 GIT binary patch delta 1048 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 delta 4868 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 delta 1246 zcma)6%a7Yc7`NLrT0wXmx{ar?1RUvlPTU@eIC*C~9Y_c1NjUOCP#(6ohy~{e! z6(~{@jxK6lKkwHzszx|f)GDy2c32(d>NxZ=KrL(n!v7zzG`AiDpqpUY|ND-oiTv^V$L?1@)Y5A~rtnwQ?a=wIPw_A~ED11F_A4 z=PV$;JO)B90@%Lik&50UetB#+A+92eq%vdcM1q!)npDOGE=O4fK!1&5y}f5PI8 ze7JOWgj@GlqWKXoYrJnOKJCMRtOfL;}#NCPxH=FdtH z66UuSj^s^=%S^`e-Qhu0#!#nFng}HttVOKdvFN;-jqjA$_MvHf^;Rj`CQ;nk4vK Date: Fri, 15 Mar 2024 16:54:02 +0000 Subject: [PATCH 06/10] Add wildcard constraint for OUTPUT_DIR --- workflow/Snakefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/workflow/Snakefile b/workflow/Snakefile index c52ea9e5..30c76f5b 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -76,6 +76,11 @@ if not config["best_estimate_windspeed_failure_threshold"] in config["transmissi # Constrain wildcards to NOT use _ or / wildcard_constraints: + # the output dir must end in 'results' + # e.g. '/data/open-gira/results', './results', '/my-results', etc. + # this prevents us matching past it into other folders for an incorrect OUTPUT_DIR, + # but is more flexible than reading a value from, for example, config.yaml + OUTPUT_DIR="^.*results", DATASET="[^_/]+", SLICE_SLUG="slice-[0-9]+", FILTER_SLUG="filter-[^_/]+", From 6a98036b089843af88626ab88ba3e53c884a9e71 Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Fri, 15 Mar 2024 17:13:24 +0000 Subject: [PATCH 07/10] Split config --- config/config.yaml | 50 ++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index f552dfa4..b03bd1fa 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -1,24 +1,13 @@ -##################################### -### FLOODING / TRANSPORT WORKFLOW ### -##################################### - -## Aqueduct Analysis ## -# This should be a named list of files that specify hazard raster files -# to retrieve using wget -i -hazard_datasets: - aqueduct-coast: 'https://raw.githubusercontent.com/mjaquiery/aqueduct/main/tiffs.txt' - #aqueduct-coast: 'config/hazard_resource_locations/aqueduct-coast_wtsub_perc95.txt' - #aqueduct-river: 'config/hazard_resource_locations/aqueduct-river_rcp4p5_MIROC-ESM-CHEM_2030_tifs.txt' # subset of aqueduct_tifs.txt - aqueduct-river: 'config/hazard_resource_locations/aqueduct-river.txt' - jba-event: 'config/hazard_resource_locations/jba-events.txt' - -hazard_types: - aqueduct-coast: 'flood' - aqueduct-river: 'flood' - jba-event: 'flood' +########################## +### TRANSPORT WORKFLOW ### +########################## # OSM datasets in PBF format, principally from: https://download.geofabrik.de/ # infrastructure_datasets: + # note that there is a JSON index with country ISO-A2 codes here: + # https://download.geofabrik.de/index-v1-nogeom.json + # we could do lookup from ISO code to URL using this file, to avoid registering URLs here + # # whole planet file planet-latest: 'https://planet.osm.org/pbf/planet-latest.osm.pbf' # 'continent' extracts @@ -30,14 +19,21 @@ infrastructure_datasets: north-america-latest: 'http://download.geofabrik.de/north-america-latest.osm.pbf' south-america-latest: 'http://download.geofabrik.de/south-america-latest.osm.pbf' # country extracts + bangladesh-latest: 'https://download.geofabrik.de/asia/bangladesh-latest.osm.pbf' + cambodia-latest: 'https://download.geofabrik.de/asia/cambodia-latest.osm.pbf' + china-latest: 'https://download.geofabrik.de/asia/china-latest.osm.pbf' djibouti-latest: 'https://download.geofabrik.de/africa/djibouti-latest.osm.pbf' egypt-latest: 'http://download.geofabrik.de/africa/egypt-latest.osm.pbf' great-britain-latest: 'http://download.geofabrik.de/europe/great-britain-latest.osm.pbf' + india-latest: 'https://download.geofabrik.de/asia/india-latest.osm.pbf' jamaica-latest: 'http://download.geofabrik.de/central-america/jamaica-latest.osm.pbf' kenya-latest: 'http://download.geofabrik.de/africa/kenya-latest.osm.pbf' + laos-latest: 'https://download.geofabrik.de/asia/laos-latest.osm.pbf' + myanmar-latest: 'https://download.geofabrik.de/asia/myanmar-latest.osm.pbf' tanzania-latest: 'https://download.geofabrik.de/africa/tanzania-latest.osm.pbf' thailand-latest: 'https://download.geofabrik.de/asia/thailand-latest.osm.pbf' wales-latest: 'https://download.geofabrik.de/europe/great-britain/wales-latest.osm.pbf' + vietnam-latest: 'https://download.geofabrik.de/asia/vietnam-latest.osm.pbf' # small extract for testing purposes tanzania-mini: 'https://raw.githubusercontent.com/mjaquiery/aqueduct/main/tanzania-mini.osm.pbf' @@ -57,7 +53,23 @@ keep_tags: rail: ['railway', 'bridge', 'name', 'gauge', 'usage'] # Number of slices to cut dataset into -- must be a square number -slice_count: 4 +slice_count: 64 + + +######################### +### FLOODING WORKFLOW ### +######################### + +hazard_datasets: + # hazard rasters to retrieve + aqueduct-coast: 'config/hazard_resource_locations/aqueduct-coast_wtsub_perc95.txt' + aqueduct-river: 'config/hazard_resource_locations/aqueduct-river.txt' + jba-event: 'config/hazard_resource_locations/jba-events.txt' + +hazard_types: + aqueduct-coast: 'flood' + aqueduct-river: 'flood' + jba-event: 'flood' direct_damages: # assets to calculate direct damages for From d13ae70161ec7e296420255b9c5c3072cae4fefd Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Fri, 15 Mar 2024 17:14:35 +0000 Subject: [PATCH 08/10] Composite (multi-OSM dataset) road/rail networks --- .../south-east-asia-rail.csv | 5 ++ .../south-east-asia-road.csv | 5 ++ config/config.yaml | 11 +++ workflow/transport/create_network.smk | 72 +++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 config/composite_network/south-east-asia-rail.csv create mode 100644 config/composite_network/south-east-asia-road.csv diff --git a/config/composite_network/south-east-asia-rail.csv b/config/composite_network/south-east-asia-rail.csv new file mode 100644 index 00000000..848030f2 --- /dev/null +++ b/config/composite_network/south-east-asia-rail.csv @@ -0,0 +1,5 @@ +infrastructure_dataset,network_filter +thailand-latest,rail +laos-latest,rail +cambodia-latest,rail +myanmar-latest,rail diff --git a/config/composite_network/south-east-asia-road.csv b/config/composite_network/south-east-asia-road.csv new file mode 100644 index 00000000..952531b0 --- /dev/null +++ b/config/composite_network/south-east-asia-road.csv @@ -0,0 +1,5 @@ +infrastructure_dataset,network_filter +thailand-latest,road-secondary +laos-latest,road-primary +cambodia-latest,road-primary +myanmar-latest,road-primary diff --git a/config/config.yaml b/config/config.yaml index b03bd1fa..c61cc2d2 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -46,6 +46,17 @@ network_filters: road-primary: 'config/osm_filters/road-primary.txt' rail: 'config/osm_filters/rail.txt' +# define a set of partial transport networks to create and interconnect +# file should be a CSV with `infrastructure_dataset` and `network_filters` columns (with header) +# e.g. +# infrastructure_dataset,network_filter +# thailand-latest,road-secondary +# cambodia-latest,road-primary +# laos-latest,road-primary +composite_network: + south-east-asia-road: 'config/composite_network/south-east-asia-road.csv' + south-east-asia-rail: 'config/composite_network/south-east-asia-rail.csv' + # OSM tag data to retain on selected features, typically for usage in network annotation/analysis # N.B. feature SELECTION is done with the expressions pointed to from network_filters keep_tags: diff --git a/workflow/transport/create_network.smk b/workflow/transport/create_network.smk index 0174cc34..422b9fad 100644 --- a/workflow/transport/create_network.smk +++ b/workflow/transport/create_network.smk @@ -1,3 +1,14 @@ +""" +Generic network creation rules. +""" + + +import logging + +import geopandas as gpd +import pandas as pd + +import snkit rule create_transport_network: @@ -26,3 +37,64 @@ rule create_transport_network: Test with: snakemake --cores all results/geoparquet/tanzania-mini_filter-road/processed/slice-0_edges.geoparquet """ + + +def transport_network_paths_from_file(wildcards) -> list[str]: + """ + Lookup composite network components from file and return list of paths to + their edge files. + """ + df = pd.read_csv( + config["composite_network"][wildcards.COMPOSITE], + comment="#", + ) + edge_paths = df.apply( + lambda row: + f"{wildcards.OUTPUT_DIR}/{row.infrastructure_dataset}_filter-{row.network_filter}/edges.gpq", + axis=1 + ) + node_paths = [path.replace("edges.gpq", "nodes.gpq") for path in edge_paths] + return {"component_nodes": node_paths, "component_edges": edge_paths} + + +rule create_composite_transport_network: + """ + Stitch together a set of transport networks into one file. These should be + the same transport mode. May be used for creating networks of spatially + varying density. + """ + input: + unpack(transport_network_paths_from_file) + output: + composite_nodes = "{OUTPUT_DIR}/composite_network/{COMPOSITE}/nodes.gpq", + composite_edges = "{OUTPUT_DIR}/composite_network/{COMPOSITE}/edges.gpq" + run: + logging.basicConfig(format="%(asctime)s %(process)d %(filename)s %(message)s", level=logging.INFO) + + logging.info("Concatenate nodes and edges") + nodes = [] + for node_path in input.component_nodes: + nodes.append(gpd.read_parquet(node_path)) + edges = [] + for edge_path in input.component_edges: + edges.append(gpd.read_parquet(edge_path)) + + network = snkit.network.Network( + nodes=pd.concat(nodes).reset_index(drop=True), + edges=pd.concat(edges).reset_index(drop=True), + ) + + logging.info("Labelling edge ends with from/to node ids") + network = snkit.network.add_topology(network) + + logging.info("Labelling edges and nodes with network component ids") + network = snkit.network.add_component_ids(network) + + logging.info("Writing network to disk") + network.nodes.to_parquet(output.composite_nodes) + network.edges.to_parquet(output.composite_edges) + +""" +Test with: +snakemake -c1 -- results/composite_network/south-east-asia-road/edges.gpq +""" From 28c4358b6daf502e50c5ee47260a1a1e5442710f Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Fri, 15 Mar 2024 17:23:19 +0000 Subject: [PATCH 09/10] Add explicit dask requirement --- environment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/environment.yml b/environment.yml index bd24fa3e..3996b818 100644 --- a/environment.yml +++ b/environment.yml @@ -19,6 +19,7 @@ dependencies: - cython==0.29.28 # c--python interface - contextily # basemaps for plots - datashader # plotting large datasets + - dask # larger-than-memory computing - flake8 # linter - gdal>=3.3 # command-line tools for spatial data - geopandas==0.14.1 # geospatial dataframes From e51684ea91482a081537e9a01283975d2a1ffa53 Mon Sep 17 00:00:00 2001 From: Fred Thomas Date: Fri, 15 Mar 2024 17:59:41 +0000 Subject: [PATCH 10/10] Restrict dask version test_exposure_by_admin_by_admin_region.py fails as dask dataframe index will not volunteer in-memory values where previously it would. The most recent dask version, https://docs.dask.org/en/stable/changelog.html#v2024-3-0 has resulted in internal changes to dataframe queries. Suspect this is the culprit. --- environment.yml | 3 ++- .../power-tc/grid_exposure_by_admin_region.py | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/environment.yml b/environment.yml index 3996b818..f6539593 100644 --- a/environment.yml +++ b/environment.yml @@ -19,7 +19,8 @@ dependencies: - cython==0.29.28 # c--python interface - contextily # basemaps for plots - datashader # plotting large datasets - - dask # larger-than-memory computing + # test_grid_exposure_by_admin_region.py fails with 2024.3.0 + - dask<2024.3.0 # larger-than-memory computing - flake8 # linter - gdal>=3.3 # command-line tools for spatial data - geopandas==0.14.1 # geospatial dataframes diff --git a/workflow/power-tc/grid_exposure_by_admin_region.py b/workflow/power-tc/grid_exposure_by_admin_region.py index 92ccb05b..18eed20b 100644 --- a/workflow/power-tc/grid_exposure_by_admin_region.py +++ b/workflow/power-tc/grid_exposure_by_admin_region.py @@ -62,6 +62,21 @@ exposure_by_event = dask.dataframe.read_parquet(snakemake.input.exposure_by_event) # calculate number of years between first and last storm event, necessary for expected annual exposure + + # N.B. dask==2024.3.0 breaks the line assigning to event_ids -- the index will not resolve to values + + # pytest -s tests/integration/test_exposure_by_admin_region.py + + # the following seems to know about the index values, look at the repr str..! + # (Pdb) exposure_by_event.index.compute() + # Empty DataFrame + # Columns: [] + # Index: [2007345N18298, ..., 2022255N15324] + + # but actually try and access those values ... + # (Pdb) exposure_by_event.index.compute().values + # array([], shape=(10, 0), dtype=float64) + event_ids: list[str] = list(set(exposure_by_event.index)) years: set[int] = set(track_year.loc[event_ids, "year"]) span_years: int = max([1, max(years) - min(years)]) # with a minimum of one @@ -102,4 +117,4 @@ # write out to disk logging.info("Writing out with region geometry") - gpd.GeoDataFrame(exposure_with_length).to_parquet(snakemake.output.expected_annual_exposure) \ No newline at end of file + gpd.GeoDataFrame(exposure_with_length).to_parquet(snakemake.output.expected_annual_exposure)