|
1
|
|
|
"""The central module containing all code dealing with importing Zensus data. |
|
2
|
|
|
""" |
|
3
|
|
|
|
|
4
|
|
|
from urllib.request import urlretrieve |
|
5
|
|
|
import os |
|
6
|
|
|
import zipfile |
|
7
|
|
|
|
|
8
|
|
|
from egon.data import db, subprocess |
|
9
|
|
|
import egon.data.config |
|
10
|
|
|
|
|
11
|
|
|
|
|
12
|
|
|
def download_zensus_pop(): |
|
13
|
|
|
"""Download Zensus csv file on population per hectar grid cell.""" |
|
14
|
|
|
data_config = egon.data.config.datasets() |
|
15
|
|
|
zensus_population_config = data_config["zensus_population"][ |
|
16
|
|
|
"original_data" |
|
17
|
|
|
] |
|
18
|
|
|
|
|
19
|
|
|
target_file = os.path.join( |
|
20
|
|
|
os.path.dirname(__file__), zensus_population_config["target"]["path"] |
|
21
|
|
|
) |
|
22
|
|
|
|
|
23
|
|
|
if not os.path.isfile(target_file): |
|
24
|
|
|
urlretrieve(zensus_population_config["source"]["url"], target_file) |
|
25
|
|
|
|
|
26
|
|
|
|
|
27
|
|
|
def population_to_postgres(): |
|
28
|
|
|
"""Import Zensus population data to postgres database""" |
|
29
|
|
|
# Get information from data configuration file |
|
30
|
|
|
data_config = egon.data.config.datasets() |
|
31
|
|
|
zensus_population_orig = data_config["zensus_population"]["original_data"] |
|
32
|
|
|
zensus_population_processed = data_config["zensus_population"]["processed"] |
|
33
|
|
|
input_file = os.path.join( |
|
34
|
|
|
os.path.dirname(__file__), zensus_population_orig["target"]["path"] |
|
35
|
|
|
) |
|
36
|
|
|
|
|
37
|
|
|
# Read database configuration from docker-compose.yml |
|
38
|
|
|
docker_db_config = db.credentials() |
|
39
|
|
|
|
|
40
|
|
|
# Create target schema |
|
41
|
|
|
db.execute_sql( |
|
42
|
|
|
f"CREATE SCHEMA IF NOT EXISTS {zensus_population_processed['schema']};" |
|
43
|
|
|
) |
|
44
|
|
|
|
|
45
|
|
|
qualified_table = ( |
|
46
|
|
|
f"{zensus_population_processed['schema']}" |
|
47
|
|
|
f".{zensus_population_processed['table']}" |
|
48
|
|
|
) |
|
49
|
|
|
|
|
50
|
|
|
# Drop and create target table |
|
51
|
|
|
db.execute_sql(f"DROP TABLE IF EXISTS {qualified_table} CASCADE;") |
|
52
|
|
|
|
|
53
|
|
|
db.execute_sql( |
|
54
|
|
|
f"CREATE TABLE {qualified_table}" |
|
55
|
|
|
""" (gid SERIAL NOT NULL, |
|
56
|
|
|
grid_id character varying(254) NOT NULL, |
|
57
|
|
|
x_mp int, |
|
58
|
|
|
y_mp int, |
|
59
|
|
|
population smallint, |
|
60
|
|
|
geom_point geometry(Point,3035), |
|
61
|
|
|
geom geometry (Polygon, 3035), |
|
62
|
|
|
CONSTRAINT zensus_population_per_ha_pkey PRIMARY KEY (gid) |
|
63
|
|
|
); |
|
64
|
|
|
""" |
|
65
|
|
|
) |
|
66
|
|
|
|
|
67
|
|
|
with zipfile.ZipFile(input_file) as zf: |
|
68
|
|
|
for filename in zf.namelist(): |
|
69
|
|
|
zf.extract(filename) |
|
70
|
|
|
host = ["-h", f"{docker_db_config['HOST']}"] |
|
71
|
|
|
port = ["-p", f"{docker_db_config['PORT']}"] |
|
72
|
|
|
pgdb = ["-d", f"{docker_db_config['POSTGRES_DB']}"] |
|
73
|
|
|
user = ["-U", f"{docker_db_config['POSTGRES_USER']}"] |
|
74
|
|
|
command = [ |
|
75
|
|
|
"-c", |
|
76
|
|
|
rf"\copy {qualified_table} (grid_id, x_mp, y_mp, population)" |
|
77
|
|
|
rf" FROM '{filename}' DELIMITER ';' CSV HEADER;", |
|
78
|
|
|
] |
|
79
|
|
|
subprocess.run( |
|
80
|
|
|
["psql"] + host + port + pgdb + user + command, |
|
81
|
|
|
env={"PGPASSWORD": docker_db_config["POSTGRES_PASSWORD"]}, |
|
82
|
|
|
) |
|
83
|
|
|
|
|
84
|
|
|
os.remove(filename) |
|
|
|
|
|
|
85
|
|
|
|
|
86
|
|
|
db.execute_sql( |
|
87
|
|
|
f"UPDATE {qualified_table} zs" |
|
88
|
|
|
" SET geom_point=ST_SetSRID(ST_MakePoint(zs.x_mp, zs.y_mp), 3035);" |
|
89
|
|
|
) |
|
90
|
|
|
|
|
91
|
|
|
db.execute_sql( |
|
92
|
|
|
f"UPDATE {qualified_table} zs" |
|
93
|
|
|
""" SET geom=ST_SetSRID( |
|
94
|
|
|
(ST_MakeEnvelope(zs.x_mp-50,zs.y_mp-50,zs.x_mp+50,zs.y_mp+50)), |
|
95
|
|
|
3035 |
|
96
|
|
|
); |
|
97
|
|
|
""" |
|
98
|
|
|
) |
|
99
|
|
|
|
|
100
|
|
|
db.execute_sql( |
|
101
|
|
|
"CREATE INDEX destatis_zensus_population_per_ha_geom_idx ON" |
|
102
|
|
|
f" {qualified_table} USING gist (geom);" |
|
103
|
|
|
) |
|
104
|
|
|
|
|
105
|
|
|
db.execute_sql( |
|
106
|
|
|
"CREATE INDEX destatis_zensus_population_per_ha_geom_point_idx ON" |
|
107
|
|
|
f" {qualified_table} USING gist (geom_point);" |
|
108
|
|
|
) |
|
109
|
|
|
|