forked from calliope-project/euro-calliope
-
Notifications
You must be signed in to change notification settings - Fork 0
/
shapes.smk
149 lines (127 loc) · 6.12 KB
/
shapes.smk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
"""Snakemake rules to create shapes of administrative regions and exclusive economic zones."""
import pycountry
SCHEMA_UNITS = {
"properties": {
"country_code": "str", # id of the country to which the unit belongs
"id": "str", # a unique id of this unit
"name": "str", # the name of the unit, not necessarily unqique
"type": "str", # the type of the unit
"proper": "bool" # flag indicating proper administrative unit (not the case for water bodies e.g.)
},
"geometry": "MultiPolygon"
}
configfile: "config/default.yaml"
localrules: download_raw_gadm_administrative_borders, raw_gadm_administrative_borders, download_raw_nuts_units
localrules: download_eez
root_dir = config["root-directory"] + "/" if config["root-directory"] not in ["", "."] else ""
script_dir = f"{root_dir}scripts/"
rule download_raw_gadm_administrative_borders:
message: "Download administrative borders for {wildcards.country_code} as zip."
params: url = lambda wildcards: config["data-sources"]["gadm"].format(country_code=wildcards.country_code)
output: protected("data/automatic/raw-gadm/{country_code}.zip")
conda: "../envs/shell.yaml"
shell: "curl -sLo {output} '{params.url}'"
rule raw_gadm_administrative_borders:
message: "Unzip administrative borders of {wildcards.country_code} as zip."
input: rules.download_raw_gadm_administrative_borders.output[0]
output: temp("build/data/raw-gadm/gadm36_{country_code}.gpkg")
conda: "../envs/shell.yaml"
shell: "unzip -o {input} -d build/data/raw-gadm"
rule administrative_borders_gadm:
message: "Merge administrative borders of all countries up to layer {params.max_layer_depth}."
input:
script = script_dir + "shapes/gadm.py",
countries = [f"build/data/raw-gadm/gadm36_{country_code}.gpkg"
for country_code in [pycountry.countries.lookup(country).alpha_3
for country in config["scope"]["spatial"]["countries"]]
]
params:
max_layer_depth = 2,
crs = config["crs"],
schema = SCHEMA_UNITS,
x_min = config["scope"]["spatial"]["bounds"]["x_min"],
x_max = config["scope"]["spatial"]["bounds"]["x_max"],
y_min = config["scope"]["spatial"]["bounds"]["y_min"],
y_max = config["scope"]["spatial"]["bounds"]["y_max"]
output: "build/data/administrative-borders-gadm.gpkg"
conda: "../envs/geo.yaml"
script: "../scripts/shapes/gadm.py"
print(config["data-sources"]["nuts"])
rule download_raw_nuts_units:
message: "Download NUTS {wildcards.nuts_year} units as geojson."
params: url = lambda wildcards: config["data-sources"]["nuts"].format(nuts_year=wildcards.nuts_year)
output: protected("data/automatic/raw-nuts-units-{nuts_year}.geojson")
conda: "../envs/shell.yaml"
shell: "curl -sLo {output} '{params.url}'"
rule administrative_borders_nuts:
message: "Normalise NUTS administrative borders."
input:
script = script_dir + "shapes/nuts.py",
units_geojson = "data/automatic/raw-nuts-units-{}.geojson".format(config["parameters"]["nuts-year"])
params:
crs = config["crs"],
schema = SCHEMA_UNITS,
x_min = config["scope"]["spatial"]["bounds"]["x_min"],
x_max = config["scope"]["spatial"]["bounds"]["x_max"],
y_min = config["scope"]["spatial"]["bounds"]["y_min"],
y_max = config["scope"]["spatial"]["bounds"]["y_max"],
all_countries = config["scope"]["spatial"]["countries"],
nuts_year=config["parameters"]["nuts-year"]
output: "build/data/administrative-borders-nuts.gpkg"
shadow: "minimal"
conda: "../envs/geo.yaml"
script: "../scripts/shapes/nuts.py"
rule units:
message: "Form units of resolution {wildcards.resolution} by remixing NUTS and GADM."
input:
script = script_dir + "shapes/units.py",
nuts = rules.administrative_borders_nuts.output[0],
gadm = rules.administrative_borders_gadm.output[0]
params:
all_countries = config["scope"]["spatial"]["countries"],
layer_configs = config["shapes"]
wildcard_constraints:
resolution = "continental|national|regional|.+_disaggregated"
output: "build/data/{resolution}/units.geojson"
conda: "../envs/geo.yaml"
script: "../scripts/shapes/units.py"
rule custom_units:
message: "Form units of resolution {wildcards.resolution} by remixing NUTS and GADM."
input:
script = script_dir + "shapes/aggregate_statistical_units_to_custom_regions.py",
disaggregated_units = "build/data/{resolution}_disaggregated/units.geojson",
nuts_to_regions = lambda wildcards: config["data-sources"]["statistical-units-to-custom-regions"][wildcards.resolution]
params:
nuts_year = config["parameters"]["nuts-year"]
output: "build/data/{resolution}/units.geojson"
conda: "../envs/geo.yaml"
script: "../scripts/shapes/aggregate_statistical_units_to_custom_regions.py"
rule units_without_shape:
message: "Dataset of units on resolution {wildcards.resolution} without geo information."
input:
script = script_dir + "shapes/nogeo.py",
units = "build/data/{resolution}/units.geojson"
output: "build/data/{resolution}/units.csv"
conda: "../envs/geo.yaml"
script: "../scripts/shapes/nogeo.py"
rule download_eez:
message: "Download Exclusive Economic Zones as zip"
output: protected("data/automatic/eez.zip")
params: url = config["data-sources"]["eez"]
conda: "../envs/shell.yaml"
shell: "curl -sLo {output} '{params.url}'"
rule eez:
message: "Clip exclusive economic zones to study area."
input: rules.download_eez.output[0]
output: "build/data/eez.geojson"
params:
bounds="{x_min},{y_min},{x_max},{y_max}".format(**config["scope"]["spatial"]["bounds"]),
countries=",".join(["'{}'".format(country) for country in config["scope"]["spatial"]["countries"]]),
conda: "../envs/geo.yaml"
shadow: "minimal"
shell:
"""
fio cat --bbox {params.bounds} "zip://{input}"\
| fio filter "f.properties.territory1 in [{params.countries}]"\
| fio collect > {output}
"""