Passed
Push — dev ( 854d9c...2ebbae )
by Stephan
01:34 queued 11s
created

vg250   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 273
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 126
dl 0
loc 273
rs 10
c 0
b 0
f 0
wmc 8

3 Functions

Rating   Name   Duplication   Size   Complexity  
B add_metadata() 0 163 2
A download_vg250_files() 0 11 2
B to_postgres() 0 69 4
1
"""The central module containing all code dealing with importing VG250 data.
2
3
This module either directly contains the code dealing with importing VG250
4
data, or it re-exports everything needed to handle it. Please refrain
5
from importing code from any modules below this one, because it might
6
lead to unwanted behaviour.
7
8
If you have to import code from a module below this one because the code
9
isn't exported from this module, please file a bug, so we can fix this.
10
"""
11
12
from urllib.request import urlretrieve
13
import json
14
import os
15
16
from geoalchemy2 import Geometry
17
import geopandas as gpd
18
19
from egon.data import db
20
from egon.data.config import settings
21
import egon.data.config
22
23
24
def download_vg250_files():
25
    """Download VG250 (Verwaltungsgebiete) shape files."""
26
    data_config = egon.data.config.datasets()
27
    vg250_config = data_config["vg250"]["original_data"]
28
29
    target_file = os.path.join(
30
        os.path.dirname(__file__), vg250_config["target"]["path"]
31
    )
32
33
    if not os.path.isfile(target_file):
34
        urlretrieve(vg250_config["source"]["url"], target_file)
35
36
37
def to_postgres():
38
39
    # Get information from data configuraiton file
40
    data_config = egon.data.config.datasets()
41
    vg250_orig = data_config["vg250"]["original_data"]
42
    vg250_processed = data_config["vg250"]["processed"]
43
44
    # Create target schema
45
    db.execute_sql(f"CREATE SCHEMA IF NOT EXISTS {vg250_processed['schema']};")
46
47
    zip_file = os.path.join(
48
        os.path.dirname(__file__), vg250_orig["target"]["path"]
49
    )
50
    engine_local_db = db.engine()
51
52
    # Extract shapefiles from zip archive and send it to postgres db
53
    for filename, table in vg250_processed["file_table_map"].items():
54
        # Open files and read .shp (within .zip) with geopandas
55
        data = gpd.read_file(
56
            f"zip://{zip_file}!vg250_01-01.geo84.shape.ebenen/"
57
            f"vg250_ebenen_0101/{filename}"
58
        )
59
60
        boundary = settings()['egon-data']['--dataset-boundary']
61
        if boundary != "Everything":
62
            # read-in borders of federal state Schleswig-Holstein
63
            data_sta = gpd.read_file(
64
                f"zip://{zip_file}!vg250_01-01.geo84.shape.ebenen/"
65
                f"vg250_ebenen_0101/VG250_LAN.shp"
66
            ).query(f"GEN == '{boundary}'")
67
            data_sta.BEZ = "Bundesrepublik"
68
            data_sta.NUTS = "DE"
69
            # import borders of Schleswig-Holstein as borders of state
70
            if table == "vg250_sta":
71
                data = data_sta
72
            # choose only areas in Schleswig-Holstein
73
            else:
74
                data = data[
75
                    data.within(data_sta.dissolve(by="GEN").geometry.values[0])
76
                ]
77
78
        # Set index column and format column headings
79
        data.index.set_names("gid", inplace=True)
80
        data.columns = [x.lower() for x in data.columns]
81
82
        # Drop table before inserting data
83
        db.execute_sql(
84
            f"DROP TABLE IF EXISTS "
85
            f"{vg250_processed['schema']}.{table} CASCADE;"
86
        )
87
88
        # create database table from geopandas dataframe
89
        data.to_postgis(
90
            table,
91
            engine_local_db,
92
            schema=vg250_processed["schema"],
93
            index=True,
94
            if_exists="replace",
95
            dtype={"geometry": Geometry()},
96
        )
97
98
        db.execute_sql(
99
            f"ALTER TABLE {vg250_processed['schema']}.{table} "
100
            f"ADD PRIMARY KEY (gid);"
101
        )
102
103
        # Add index on geometry column
104
        db.execute_sql(
105
            f"CREATE INDEX {table}_geometry_idx ON "
106
            f"{vg250_processed['schema']}.{table} USING gist (geometry);"
107
        )
108
109
110
def add_metadata():
111
    """Writes metadata JSON string into table comment."""
112
    # Prepare variables
113
    vg250_config = egon.data.config.datasets()["vg250"]
114
115
    title_and_description = {
116
        "vg250_sta": {
117
            "title": "BKG - Verwaltungsgebiete 1:250.000 - Staat (STA)",
118
            "description": "Staatsgrenzen der Bundesrepublik Deutschland",
119
        },
120
        "vg250_lan": {
121
            "title": "BKG - Verwaltungsgebiete 1:250.000 - Länder (LAN)",
122
            "description": "Landesgrenzen der Bundesländer in der "
123
            "Bundesrepublik Deutschland",
124
        },
125
        "vg250_rbz": {
126
            "title": "BKG - Verwaltungsgebiete 1:250.000 - Regierungsbezirke "
127
            "(RBZ)",
128
            "description": "Grenzen der Regierungsbezirke in der "
129
            "Bundesrepublik Deutschland",
130
        },
131
        "vg250_krs": {
132
            "title": "BKG - Verwaltungsgebiete 1:250.000 - Kreise (KRS)",
133
            "description": "Grenzen der Landkreise in der "
134
            "Bundesrepublik Deutschland",
135
        },
136
        "vg250_vwg": {
137
            "title": "BKG - Verwaltungsgebiete 1:250.000 - "
138
            "Verwaltungsgemeinschaften (VWG)",
139
            "description": "Grenzen der Verwaltungsgemeinschaften in der "
140
            "Bundesrepublik Deutschland",
141
        },
142
        "vg250_gem": {
143
            "title": "BKG - Verwaltungsgebiete 1:250.000 - Gemeinden (GEM)",
144
            "description": "Grenzen der Gemeinden in der "
145
            "Bundesrepublik Deutschland",
146
        },
147
    }
148
149
    url = vg250_config["original_data"]["source"]["url"]
150
151
    # Insert metadata for each table
152
    licenses = [
153
        {
154
            "title": "Datenlizenz Deutschland – Namensnennung – Version 2.0",
155
            "path": "www.govdata.de/dl-de/by-2-0",
156
            "instruction": (
157
                "Jede Nutzung ist unter den Bedingungen dieser „Datenlizenz "
158
                "Deutschland - Namensnennung - Version 2.0 zulässig.\nDie "
159
                "bereitgestellten Daten und Metadaten dürfen für die "
160
                "kommerzielle und nicht kommerzielle Nutzung insbesondere:"
161
                "(1) vervielfältigt, ausgedruckt, präsentiert, verändert, "
162
                "bearbeitet sowie an Dritte übermittelt werden;\n "
163
                "(2) mit eigenen Daten und Daten Anderer zusammengeführt und "
164
                "zu selbständigen neuen Datensätzen verbunden werden;\n "
165
                "(3) in interne und externe Geschäftsprozesse, Produkte und "
166
                "Anwendungen in öffentlichen und nicht öffentlichen "
167
                "elektronischen Netzwerken eingebunden werden."
168
            ),
169
            "attribution": "© Bundesamt für Kartographie und Geodäsie",
170
        }
171
    ]
172
    for table in vg250_config["processed"]["file_table_map"].values():
173
        meta = {
174
            "title": title_and_description[table]["title"],
175
            "description": title_and_description[table]["title"],
176
            "language": ["DE"],
177
            "spatial": {
178
                "location": "",
179
                "extent": "Germany",
180
                "resolution": "vector",
181
            },
182
            "temporal": {
183
                "referenceDate": "2020-01-01",
184
                "timeseries": {
185
                    "start": "",
186
                    "end": "",
187
                    "resolution": "",
188
                    "alignment": "",
189
                    "aggregationType": "",
190
                },
191
            },
192
            "sources": [
193
                {
194
                    "title": "Dienstleistungszentrum des Bundes für "
195
                    "Geoinformation und Geodäsie - Open Data",
196
                    "description": "Dieser Datenbestand steht über "
197
                    "Geodatendienste gemäß "
198
                    "Geodatenzugangsgesetz (GeoZG) "
199
                    "(http://www.geodatenzentrum.de/auftrag/pdf"
200
                    "/geodatenzugangsgesetz.pdf) für die "
201
                    "kommerzielle und nicht kommerzielle "
202
                    "Nutzung geldleistungsfrei zum Download "
203
                    "und zur Online-Nutzung zur Verfügung. Die "
204
                    "Nutzung der Geodaten und Geodatendienste "
205
                    "wird durch die Verordnung zur Festlegung "
206
                    "der Nutzungsbestimmungen für die "
207
                    "Bereitstellung von Geodaten des Bundes "
208
                    "(GeoNutzV) (http://www.geodatenzentrum.de"
209
                    "/auftrag/pdf/geonutz.pdf) geregelt. "
210
                    "Insbesondere hat jeder Nutzer den "
211
                    "Quellenvermerk zu allen Geodaten, "
212
                    "Metadaten und Geodatendiensten erkennbar "
213
                    "und in optischem Zusammenhang zu "
214
                    "platzieren. Veränderungen, Bearbeitungen, "
215
                    "neue Gestaltungen oder sonstige "
216
                    "Abwandlungen sind mit einem "
217
                    "Veränderungshinweis im Quellenvermerk zu "
218
                    "versehen. Quellenvermerk und "
219
                    "Veränderungshinweis sind wie folgt zu "
220
                    "gestalten. Bei der Darstellung auf einer "
221
                    "Webseite ist der Quellenvermerk mit der "
222
                    "URL http://www.bkg.bund.de zu verlinken. "
223
                    "© GeoBasis-DE / BKG <Jahr des letzten "
224
                    "Datenbezugs> © GeoBasis-DE / BKG "
225
                    "<Jahr des letzten Datenbezugs> "
226
                    "(Daten verändert) Beispiel: "
227
                    "© GeoBasis-DE / BKG 2013",
228
                    "path": url,
229
                    "licenses": "Geodatenzugangsgesetz (GeoZG)",
230
                    "copyright": "© GeoBasis-DE / BKG 2016 (Daten verändert)",
231
                },
232
                {
233
                    "title": "BKG - Verwaltungsgebiete 1:250.000 (vg250)",
234
                    "description": "Der Datenbestand umfasst sämtliche "
235
                    "Verwaltungseinheiten aller hierarchischen "
236
                    "Verwaltungsebenen vom Staat bis zu den "
237
                    "Gemeinden mit ihren Verwaltungsgrenzen, "
238
                    "statistischen Schlüsselzahlen und dem "
239
                    "Namen der Verwaltungseinheit sowie der "
240
                    "spezifischen Bezeichnung der "
241
                    "Verwaltungsebene des jeweiligen "
242
                    "Bundeslandes.",
243
                    "path": "http://www.bkg.bund.de",
244
                    "licenses": licenses,
245
                },
246
            ],
247
            "licenses": licenses,
248
            "contributors": [
249
                {
250
                    "title": "Guido Pleßmann",
251
                    "email": "http://github.com/gplssm",
252
                    "date": "2020-12-04",
253
                    "object": "",
254
                    "comment": "Imported data",
255
                }
256
            ],
257
            "metaMetadata": {
258
                "metadataVersion": "OEP-1.4.0",
259
                "metadataLicense": {
260
                    "name": "CC0-1.0",
261
                    "title": "Creative Commons Zero v1.0 Universal",
262
                    "path": (
263
                        "https://creativecommons.org/publicdomain/zero/1.0/"
264
                    ),
265
                },
266
            },
267
        }
268
269
        meta_json = "'" + json.dumps(meta) + "'"
270
271
        db.submit_comment(
272
            meta_json, vg250_config["processed"]["schema"], table
273
        )
274