nlextract / NLExtract

Convert (ETL) and visualize free Dutch geo-datasets.
https://nlextract.nl
GNU General Public License v3.0
152 stars 83 forks source link

BAGv2 provincie_gemeente bevat geen historie #311

Closed sebastic closed 2 years ago

sebastic commented 3 years ago

De provincie_gemeente tabel voor BAGv2 bevat geen historie zoals voor v1.

Op basis van gemeentelijke-indeling.xml wordt voor v1 de tabel met historie gevuld.

Zie ook de discussie op de mailinglist

justb4 commented 3 years ago

Even apart houden/niet in deze issue mee: de gemeente en de provincie tabel: die is ontstaan uit een experiment: om gemeente en provinciegrenzen, die er toen niet waren als publieke dataset, te genereren uit de gemeenteprovincieactueelbestaand VIEW en de woonplaatsactueelbestaandview. Door "geo-aggregatie" via deze laatste zou je zo gemeente en provinciegrenzen krijgen. Wel meegenomen in BAG v2 voor v1 compat:

https://github.com/nlextract/NLExtract/blob/master/bagv2/etl/sql/create-gemprov.sql

Echter werkt(e) dit niet waterdicht. Ik kan ook afraden deze geometrieën te gebruiken. Maar is steeds meegekomen met NLExtract en de dumps. gemeente en de provincie spelen ook geen rol bij bijv de adres-verrijkings-SQL. Er zijn inmiddels, ook via PDOK, CBS "bestuurlijke grenzen" datasets.

sebastic commented 3 years ago

Mede daarom wordt alleen provincie_gemeente tabel gebruik in de actueelbestaand views bij de implementatie voor BAGv1 (#158).

justb4 commented 3 years ago

Ja!

Ter gedachte: de provincie-gemeentekoppeling: in feite willen we deze in een BAG-achtige tabel, dwz met begin/eindtijd per object-versie, denk per gemeente(code). In theorie kan een gemeente bijv van naam veranderen (hoewel die dan nieuwe code lijkt te krijgen, viz "Fryske Marren") of naar andere provincie verhuizen. Als we deze "BAG-achtige" set al hebben als XML (JSON) hoeven we elk jaar alleen maar die paar wijzigingen toe te voegen. Ook de volgorde maakt dan niet uit. Mijn voorstel is om deze dataset als een Simple Feature GML of GeoJSON te onderhouden in GitHub. Dan kan deze direct met ogr2ogr (en dus Stetl) en andere tooling als QGIS, verwerkt, zonder custom XML processing. De geometrie kan centroïde gemeente zijn, maar is niet echt van belang.

De eerste/begin versie kan gemaakt worden door een ogr2ogr export uit PostGIS. Dan hoeft ieder jaar maar een paar regels gewijzigd. Kan m.i. met de hand in GitHub. Ook kan dan ruimtelijke selectie gemaakt. De tooling voor gemeentelijke-indeling.sh en .py in BAG v1 is mooi opgezet maar ook wel complex en door weinigen begrepen/gebruikt m.i.

Als voorbeeld, een eerste versie kan snel gemaakt:

ogr2ogr -f "GeoJSON" provincie-gemeente.json PG:"host=localhost dbname=bag user=*** password=*** port=5432 active_schema=bagactueel" "provincie_gemeente" De geometrie is zelfs niet significant.

Dan ontstaat het GeoJSON-bestand als hier deels te zien:

{
"type": "FeatureCollection",
"name": "provincie_gemeente",
"features": [
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0010", "gemeentenaam": "Delfzijl", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2021-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0014", "gemeentenaam": "Groningen", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0015", "gemeentenaam": "Grootegast", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2019-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "1651", "gemeentenaam": "Eemsmond", "begindatum": "1992-01-01T00:00:00+01:00", "einddatum": "2019-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "1661", "gemeentenaam": "Reiderland", "begindatum": "1992-01-01T00:00:00+01:00", "einddatum": "2010-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "1663", "gemeentenaam": "De Marne", "begindatum": "1992-01-01T00:00:00+01:00", "einddatum": "2019-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0017", "gemeentenaam": "Haren", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2019-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0018", "gemeentenaam": "Hoogezand-Sappemeer", "begindatum": "1949-04-01T00:00:00+01:00", "einddatum": "2018-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "1895", "gemeentenaam": "Oldambt", "begindatum": "2010-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0019", "gemeentenaam": "Hefshuizen", "begindatum": "1979-01-01T00:00:00+01:00", "einddatum": "1992-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0037", "gemeentenaam": "Stadskanaal", "begindatum": "1969-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0039", "gemeentenaam": "Scheemda", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2010-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0040", "gemeentenaam": "Slochteren", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2018-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0045", "gemeentenaam": "Ulrum", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "1992-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0047", "gemeentenaam": "Veendam", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0048", "gemeentenaam": "Vlagtwedde", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2018-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0005", "gemeentenaam": "Bedum", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2019-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0052", "gemeentenaam": "Winschoten", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2010-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0053", "gemeentenaam": "Winsum", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2019-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0056", "gemeentenaam": "Zuidhorn", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2019-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0006", "gemeentenaam": "Beerta", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "1992-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0007", "gemeentenaam": "Bellingwedde", "begindatum": "1968-01-01T00:00:00+01:00", "einddatum": "2018-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0765", "gemeentenaam": "Pekela", "begindatum": "1990-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 20, "provincienaam": "Groningen", "gemeentecode": "0009", "gemeentenaam": "Ten Boer", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2019-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 21, "provincienaam": "Friesland", "gemeentecode": "0104", "gemeentenaam": "Nijefurd", "begindatum": "1984-01-01T00:00:00+01:00", "einddatum": "2011-01-01T00:00:00+01:00" }, "geometry": null },
.
.

{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0971", "gemeentenaam": "Stein", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0972", "gemeentenaam": "Stevensweert", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "1991-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0973", "gemeentenaam": "Stramproy", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "1998-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0974", "gemeentenaam": "Susteren", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2003-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0975", "gemeentenaam": "Swalmen", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2007-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0976", "gemeentenaam": "Tegelen", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2001-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0977", "gemeentenaam": "Thorn", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2007-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0981", "gemeentenaam": "Vaals", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0983", "gemeentenaam": "Venlo", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0984", "gemeentenaam": "Venray", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0985", "gemeentenaam": "Vlodrop", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "1991-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0986", "gemeentenaam": "Voerendaal", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0988", "gemeentenaam": "Weert", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0989", "gemeentenaam": "Wessem", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "1991-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0990", "gemeentenaam": "Wittem", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "1999-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0993", "gemeentenaam": "Meerlo-Wanssum", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": "2010-01-01T00:00:00+01:00" }, "geometry": null },
{ "type": "Feature", "properties": { "provinciecode": 31, "provincienaam": "Limburg", "gemeentecode": "0994", "gemeentenaam": "Valkenburg aan de Geul", "begindatum": "1970-01-01T00:00:00+01:00", "einddatum": null }, "geometry": null }
]
}
sebastic commented 3 years ago

M.i. moet eerst de gemeentelijk-indeling zoals aanwezig in BAGv1 in BAGv2 geimplementeerd worden. De provincie_gemeente tabel blijft daarmee gelijk tussen beide.

Daarna kan daar op verder geitereerd worden met iets als het GeoJSON voorstel.

sebastic commented 3 years ago

De gemeentelijke-indeling.xml kan eenvoudig naar CSV geconverteerd worden, e.g.:

$ head data/cbs/gemeentelijke-indeling.csv
provinciecode;provincienaam;gemeentecode;gemeentenaam;begindatum;einddatum
20;Groningen;3;Appingedam;1970-01-01;2021-01-01
20;Groningen;5;Bedum;1970-01-01;2019-01-01
20;Groningen;6;Beerta;1970-01-01;1992-01-01
20;Groningen;7;Bellingwedde;1968-01-01;2018-01-01
20;Groningen;9;Ten Boer;1970-01-01;2019-01-01
20;Groningen;10;Delfzijl;1970-01-01;2021-01-01
20;Groningen;14;Groningen;1970-01-01;
20;Groningen;15;Grootegast;1970-01-01;2019-01-01
20;Groningen;17;Haren;1970-01-01;2019-01-01

De csv module gebruikt door stetl.inputs.fileinput.CsvFileInput gebruikt een empty string ('') voor de records zonder einddatum, waardoor de queries falen:

2021-04-23 18:56:23,377 dboutput INFO query is INSERT INTO provincie_gemeente (provinciecode,provincienaam,gemeentecode,gemeentenaam,begindatum,einddatum) VALUES (%s,%s,%s,%s,%s,%s)
2021-04-23 18:56:23,377 dboutput INFO update query is UPDATE provincie_gemeente SET (provinciecode ,provincienaam ,gemeentecode ,gemeentenaam ,begindatum ,einddatum ) = (%s,%s,%s,%s,%s,%s) WHERE  gemeentecode = %s
2021-04-23 18:56:23,457 postgis ERROR error invalid input syntax for type timestamp with time zone: ""
LINE 1: ...= ('20','Groningen','14','Groningen','1970-01-01','') WHERE ...
                                                             ^
 in query: UPDATE provincie_gemeente SET (provinciecode ,provincienaam ,gemeentecode ,gemeentenaam ,begindatum ,einddatum ) = (%s,%s,%s,%s,%s,%s) WHERE  gemeentecode = %s with params: ['20', 'Groningen', '14', 'Groningen', '1970-01-01', '', '14']
2021-04-23 18:56:23,458 postgis ERROR error current transaction is aborted, commands ignored until end of transaction block
 in query: INSERT INTO provincie_gemeente (provinciecode,provincienaam,gemeentecode,gemeentenaam,begindatum,einddatum) VALUES (%s,%s,%s,%s,%s,%s) with params: ['20', 'Groningen', '14', 'Groningen', '1970-01-01', '']

Wanneer None voor de einddatum values was gebruikt had dit naar NULL vertaald geworden waarmee de queries wel zouden werken.

stetl.inputs.fileinput.CsvFileInput moet een optie krijgen om empty strings met None te vervangen.

Dit werkt voor mij:

--- a/bagv2/etl/conf/etl-imbag-2.1.0.cfg
+++ b/bagv2/etl/conf/etl-imbag-2.1.0.cfg
@@ -28,6 +28,7 @@
 # [GDAL_3462]
 chains = input_sql_pre|output_postgres_sql,
          input_bag_leveringsdoc_file|convert_vsi_to_etree_doc|transformer_xslt_leveringsdoc|output_ogr_postgis,
+         input_string_file|command_executor,
          input_cbs_gemeenten_csv|output_postgres_gemeenten,
          input_bag_wpl_gem_koppeling_file|convert_vsi_to_etree_doc|transformer_xslt_gem_wpl|output_ogr_postgis,
          input_bag_zip_file|extract_bag_vsizip_file|expand_zip_archive|output_ogr2ogr,
@@ -50,11 +51,19 @@ class = stetl.inputs.fileinput.StringFileInput
 file_path = sql/finalize-tables.sql,sql/fill-reltables.sql,sql/create-views.sql,sql/create-indexes.sql
 format_args = schema:{schema}

+[input_string_file]
+class = stetl.inputs.fileinput.StringFileInput
+file_path = data/cbs/gemeentelijke-indeling_command.txt
+
+[command_executor]
+class = stetl.filters.execfilter.CommandExecFilter
+
 # Input file gemeente-provincies van CBS per jaar
 [input_cbs_gemeenten_csv]
 class = stetl.inputs.fileinput.CsvFileInput
-file_path = data/cbs/gemeente/{cbs_gemeenten_jaar}.csv
+file_path = data/cbs/gemeentelijke-indeling.csv
 delimiter = ;
+empty_string_is_none = True

 # BAG Extract LV zipfile.
 # Contains the zip files for each BAG obj type
--- /dev/null
+++ b/bagv2/etl/data/cbs/gemeentelijke-indeling_command.txt
@@ -0,0 +1 @@
+../../bag/bin/gemeentelijke-indeling.sh --convert-to-csv -i ../../bag/db/data/gemeentelijke-indeling.xml -o data/cbs/gemeentelijke-indeling.csv
--- a/stetl/inputs/fileinput.py
+++ b/stetl/inputs/fileinput.py
@@ -362,6 +362,13 @@ class CsvFileInput(FileInput):
         """
         pass

+    @Config(ptype=bool, default=False, required=False)
+    def empty_string_is_none(self):
+        """
+        Should we use None instead of '' for empty fields
+        """
+        pass
+
     # Constructor
     def __init__(self, configdict, section):
         FileInput.__init__(self, configdict, section, produces=[FORMAT.record_array, FORMAT.record])
@@ -381,11 +388,26 @@ class CsvFileInput(FileInput):
         try:
             # To comply with Stetl record type: force ordinary/base dict-type.
             # Python 3.6+ returns OrderedDict which may not play nice up the Chain
-            packet.data = dict(next(self.csv_reader))
+            record = dict(next(self.csv_reader))
+
+            if self.empty_string_is_none:
+                for field in record:
+                    if record[field] == '':
+                        record[field] = None
+
+            packet.data = record
             if self._output_format == FORMAT.record_array:
                 while True:
                     self.arr.append(packet.data)
-                    packet.data = dict(next(self.csv_reader))
+
+                    record = dict(next(self.csv_reader))
+
+                    if self.empty_string_is_none:
+                        for field in record:
+                            if record[field] == '':
+                                record[field] = None
+
+                    packet.data = record

             log.info("CSV row nr %d read: %s" % (self.csv_reader.line_num - 1, packet.data))
         except Exception:
2021-04-23 19:30:19,950 chain INFO Assembling Chain: input_cbs_gemeenten_csv|output_postgres_gemeenten...
2021-04-23 19:30:19,950 input INFO cfg = {'class': 'stetl.inputs.fileinput.CsvFileInput', 'file_path': 'data/cbs/gemeentelijke-indeling.csv', 'delimiter': ';', 'empty_string_is_none': 'True'}
2021-04-23 19:30:19,950 fileinput INFO file_list=['data/cbs/gemeentelijke-indeling.csv']
2021-04-23 19:30:19,950 output INFO cfg = {'class': 'stetl.outputs.dboutput.PostgresInsertOutput', 'database': 'bagv2', 'host': 'isis', 'port': '5432', 'user': '<hidden>', 'password': '<hidden>', 'schema': 'public', 'table': 'provincie_
gemeente', 'key': 'gemeentecode', 'replace': 'true'}
2021-04-23 19:30:19,950 chain INFO Running Chain: input_cbs_gemeenten_csv|output_postgres_gemeenten
2021-04-23 19:30:19,950 fileinput INFO Open CSV file: data/cbs/gemeentelijke-indeling.csv
2021-04-23 19:30:19,951 dboutput INFO Init: connect to DB
2021-04-23 19:30:19,951 postgis INFO Connecting to dbname=bagv2 user=bas host=isis port=5432
2021-04-23 19:30:19,961 postgis DEBUG Connected to database bagv2
2021-04-23 19:30:19,964 dboutput INFO query is INSERT INTO provincie_gemeente (provinciecode,provincienaam,gemeentecode,gemeentenaam,begindatum,einddatum) VALUES (%s,%s,%s,%s,%s,%s)
2021-04-23 19:30:19,964 dboutput INFO update query is UPDATE provincie_gemeente SET (provinciecode ,provincienaam ,gemeentecode ,gemeentenaam ,begindatum ,einddatum ) = (%s,%s,%s,%s,%s,%s) WHERE  gemeentecode = %s
2021-04-23 19:30:27,109 dboutput INFO committed 785 records
2021-04-23 19:30:27,109 component INFO CsvFileInput invokes=1 time(total, min, max, avg) = 0.002 0.002 0.002 0.002
2021-04-23 19:30:27,109 dboutput INFO Exit: disconnect from DB
2021-04-23 19:30:27,110 component INFO PostgresInsertOutput invokes=1 time(total, min, max, avg) = 7.146 7.146 7.146 7.146
2021-04-23 19:30:27,110 chain INFO DONE - 1 rounds - chain=input_cbs_gemeenten_csv|output_postgres_gemeenten 
justb4 commented 2 years ago

I still have trouble understanding the necessity of this feature and its related PR #319. 99.9% of the BAG users just require the most current "gemeente-provincie koppeling". Having a CSV per-year in a data dir and a Stetl property should handle most use-cases. Even the XML or JSON may be generated out of the current year-CSVs with some smart scripting, but also the "current year" via Shell script if needed so the Stetl property is not required.

Each year some manual action is required anyway for whatever solution we choose. The custom Python code and XML as in PR #319 adds more maintenance.

But maybe @fsteggink can shine a light. That is why I was hinting at a PSC with odd number of people to have a more democratic decision process.

sebastic commented 2 years ago

See #158 for when it was introduced for BAGv1.

By adding begin/end dates to the gemeentelijk-indeling data, the data can be updated before the changes come into effect, i.e. you can merge #326 now instead of waiting for January 1st.

99.9% of the BAG users just require the most current "gemeente-provincie koppeling".

Sources are needed for these figures.

The non-zero number of users who need historic data, are not served well by introducing a regression with respect to BAGv1.

Having a CSV per-year in a data dir and a Stetl property should handle most use-cases.

But it doesn't handle historic use cases, my changes do.

Without theses changes the CSV data for every year needs to be available in the same format as expected by the database schema. The source data from CBS does not use the same column names for every year, hence the conversion of their data to a format controlled by us.

When loading the monthly data on January 6th 2022, the gemeentelijke-indeling for 2021 will still be used by the BAG data (which was last updated on 8 December 2021). Users will need to wait with pulling the recent changes in git, or they will get the 2022 data (assuming the gemeentelijk-indeling CSV and cbs_gemeenten_jaar setting in common.args changes for 2022 have been committed), while the BAG data does know about any of the new municipalities.

With these changes users only need to ensure their have updated the gemeentelijke-indeling data before processing BAG data for a new year. They don't have to worry about an different year being configured, any year (since 1991) is supported.

If you're worried about being unable to update the gemeentelijk-indeling data when I get hit by bus, let me know how the documentation should be improved to allow you do the update yourself and I will implement those changes.

justb4 commented 2 years ago

Na oplossen #338 eerste tests lijken ok:

image

Dus Weesp pas op 24 maart 2022 bij Amsterdam...

justb4 commented 2 years ago

Stel voor: deze sluiten en in maintenance mode gaan, bijv #338.

sebastic commented 2 years ago

Dit issue is opgelost met de changes in #319.

Wat bedoel je met "in maintenance mode gaan"?

justb4 commented 2 years ago

"in maintenance mode gaan" Niets bijzonders: in feite dit issue sluiten en nieuwe issues openen bij evt problemen (ipv dit issue open houden), standaard dus. Nogmaals bedankt voor geduld, over en sluiten.