~jomco/straatnaam

178aab4b2f1848c9b36cd42af62873c7c96ab1e7 — Remco van 't Veer 1 year, 11 months ago 7d655c4
Import panden
A resources/migrations/20220921170000-add-pand.down.sql => resources/migrations/20220921170000-add-pand.down.sql +5 -0
@@ 0,0 1,5 @@
DROP TABLE template.pand;
--;;
ALTER TABLE template.verblijfsobject DROP COLUMN pand_ids;
--;;
DROP TABLE template.verblijfsobject_pand;

A resources/migrations/20220921170000-add-pand.up.sql => resources/migrations/20220921170000-add-pand.up.sql +15 -0
@@ 0,0 1,15 @@
CREATE TABLE template.pand (
  id NUMERIC,
  begindatum DATE,
  einddatum DATE,
  oorspronkelijk_bouwjaar INTEGER
);
--;;
CREATE INDEX pand_id ON template.pand (id, einddatum);
--;;
ALTER TABLE template.verblijfsobject ADD COLUMN pand_ids NUMERIC[];
--;;
CREATE TABLE template.verblijfsobject_pand (id NUMERIC, pand_id NUMERIC);
--;;
CREATE INDEX verblijfsobject_pand_idx ON template.verblijfsobject_pand (id);
--;;

A resources/test/lvbag/9999PND.xml => resources/test/lvbag/9999PND.xml +52 -0
@@ 0,0 1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<sl-bag-extract:bagStand xmlns:DatatypenNEN3610="www.kadaster.nl/schemas/lvbag/imbag/datatypennen3610/v20200601" xmlns:Objecten="www.kadaster.nl/schemas/lvbag/imbag/objecten/v20200601" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:Historie="www.kadaster.nl/schemas/lvbag/imbag/historie/v20200601" xmlns:Objecten-ref="www.kadaster.nl/schemas/lvbag/imbag/objecten-ref/v20200601" xmlns:nen5825="www.kadaster.nl/schemas/lvbag/imbag/nen5825/v20200601" xmlns:KenmerkInOnderzoek="www.kadaster.nl/schemas/lvbag/imbag/kenmerkinonderzoek/v20200601" xmlns:selecties-extract="http://www.kadaster.nl/schemas/lvbag/extract-selecties/v20200601" xmlns:sl-bag-extract="http://www.kadaster.nl/schemas/lvbag/extract-deelbestand-lvc/v20200601" xmlns:sl="http://www.kadaster.nl/schemas/standlevering-generiek/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.kadaster.nl/schemas/lvbag/extract-deelbestand-lvc/v20200601 https://developer.kadaster.nl/schemas/lvbag/extract-deelbestand-lvc/v20200601/BagvsExtractDeelbestandExtractLvc-2.1.0.xsd">
  <sl-bag-extract:bagInfo>
    <selecties-extract:Gebied-Registratief>
      <selecties-extract:Gebied-NLD/>
    </selecties-extract:Gebied-Registratief>
    <selecties-extract:LVC-Extract>
      <selecties-extract:StandTechnischeDatum>2022-09-08</selecties-extract:StandTechnischeDatum>
    </selecties-extract:LVC-Extract>
  </sl-bag-extract:bagInfo>
  <sl:standBestand>
    <sl:dataset>LVBAG</sl:dataset>
    <sl:inhoud>
      <sl:gebied>Nederland</sl:gebied>
      <sl:leveringsId>0000000001</sl:leveringsId>
      <sl:objectTypen>
        <sl:objectType>PND</sl:objectType>
      </sl:objectTypen>
    </sl:inhoud>
    <sl:stand>
      <sl-bag-extract:bagObject>
        <Objecten:Pand>
          <Objecten:identificatie domein="NL.IMBAG.Pand">1883100000010452</Objecten:identificatie>
          <Objecten:geometrie>
            <gml:Polygon srsName="urn:ogc:def:crs:EPSG::28992" srsDimension="3">
              <gml:exterior>
                <gml:LinearRing>
                  <gml:posList count="9">188376.995 334581.675 0.0 188370.87 334579.013 0.0 188370.285 334579.94 0.0 188361.359 334569.248 0.0 188362.136 334568.568 0.0 188398.225 334587.71 0.0 188396.595 334590.91 0.0 188387.971 334586.446 0.0 188376.995 334581.675 0.0</gml:posList>
                </gml:LinearRing>
              </gml:exterior>
            </gml:Polygon>
          </Objecten:geometrie>
          <Objecten:oorspronkelijkBouwjaar>1880</Objecten:oorspronkelijkBouwjaar>
          <Objecten:status>Pand in gebruik</Objecten:status>
          <Objecten:geconstateerd>N</Objecten:geconstateerd>
          <Objecten:documentdatum>2011-07-28</Objecten:documentdatum>
          <Objecten:documentnummer>602769</Objecten:documentnummer>
          <Objecten:voorkomen>
            <Historie:Voorkomen>
              <Historie:voorkomenidentificatie>2</Historie:voorkomenidentificatie>
              <Historie:beginGeldigheid>2011-07-28</Historie:beginGeldigheid>
              <Historie:tijdstipRegistratie>2011-08-03T15:20:51.000</Historie:tijdstipRegistratie>
              <Historie:BeschikbaarLV>
                <Historie:tijdstipRegistratieLV>2011-08-03T15:35:38.019</Historie:tijdstipRegistratieLV>
              </Historie:BeschikbaarLV>
            </Historie:Voorkomen>
          </Objecten:voorkomen>
        </Objecten:Pand>
      </sl-bag-extract:bagObject>
    </sl:stand>
  </sl:standBestand>
</sl-bag-extract:bagStand>

M src/straatnaam/lvbag.clj => src/straatnaam/lvbag.clj +42 -22
@@ 157,17 157,24 @@
(defn int-arr-val [vals]
  (str "{" (string/join "," vals) "}"))

(def parse-pand-xml
  (partial parse-bag-objects :Pand
           (fn [{:keys [oorspronkelijkBouwjaar]}]
             {:oorspronkelijk_bouwjaar (some-> oorspronkelijkBouwjaar first biginteger)})))

(def parse-verblijfsobject-xml
  (partial parse-bag-objects :Verblijfsobject
           (fn [{:keys [gebruiksdoel
                        heeftAlsHoofdadres
                        heeftAlsNevenadres
                        oppervlakte]
                        oppervlakte
                        maaktDeelUitVan]
                 :as   rec}]
             (into {:gebruiksdoel               (some-> gebruiksdoel first)
                    :nummeraanduiding_id        (some-> heeftAlsHoofdadres :NummeraanduidingRef first bigdec)
                    :neven_nummeraanduiding_ids (some->> heeftAlsNevenadres :NummeraanduidingRef (map bigdec) int-arr-val)
                    :oppervlakte                (some-> oppervlakte first biginteger)}
                    :oppervlakte                (some-> oppervlakte first biginteger)
                    :pand_ids                   (some->> maaktDeelUitVan :PandRef (map bigdec) int-arr-val)}
                   (parse-point-geometrie :geometrie rec)))))

(def parse-ligplaats-xml


@@ 219,7 226,7 @@
                   (map #(case %
                           (:geometrie) "?::gis.GEOMETRY"
                           (:begindatum :einddatum) "?::DATE"
                           (:neven_nummeraanduiding_ids) "?::NUMERIC[]"
                           (:neven_nummeraanduiding_ids :pand_ids) "?::NUMERIC[]"
                           "?"))
                   (string/join ", "))
        table (str sn "." table)]


@@ 232,32 239,44 @@
                             (str "CREATE SCHEMA " sn "")]
                            (map #(str "CREATE TABLE " sn "." %
                                       " (LIKE template." % " INCLUDING ALL)")
                                 ["nummeraanduiding"
                                  "openbareruimte"
                                  "verblijfsobject"
                                 ["bag"
                                  "ligplaats"
                                  "ligplaats_neven"
                                  "nummeraanduiding"
                                  "openbareruimte"
                                  "pand"
                                  "standplaats"
                                  "woonplaats"
                                  "verblijfsobject_neven"
                                  "standplaats_neven"
                                  "ligplaats_neven"
                                  "bag"]))))
                                  "verblijfsobject"
                                  "verblijfsobject_neven"
                                  "verblijfsobject_pand"
                                  "woonplaats"]))))

(defn- insert-links! [db sn]
  (log/debug "inserting linking data for" sn)
  (sql/db-do-commands db true
                      (map #(str "INSERT INTO " sn "." % "_neven
                                  SELECT id, a[i] FROM (
                                    SELECT
                                      x.id AS id,
                                      x.neven_nummeraanduiding_ids AS a,
                                      GENERATE_SUBSCRIPTS(x.neven_nummeraanduiding_ids, 1) AS i
                                    FROM " sn "." % " x
                                    WHERE x.einddatum IS NULL
                                  ) y")
                           ["verblijfsobject"
                            "standplaats"
                            "ligplaats"])))
                      (into [(str "INSERT INTO " sn ".verblijfsobject_pand
                                   SELECT id, a[i] FROM (
                                     SELECT
                                       x.id AS id,
                                       x.pand_ids AS a,
                                       GENERATE_SUBSCRIPTS(x.pand_ids, 1) AS i
                                     FROM " sn ".verblijfsobject x
                                     WHERE x.einddatum IS NULL
                                   ) y")]
                            (map #(str "INSERT INTO " sn "." % "_neven
                                        SELECT id, a[i] FROM (
                                          SELECT
                                            x.id AS id,
                                            x.neven_nummeraanduiding_ids AS a,
                                            GENERATE_SUBSCRIPTS(x.neven_nummeraanduiding_ids, 1) AS i
                                          FROM " sn "." % " x
                                          WHERE x.einddatum IS NULL
                                        ) y")
                                 ["verblijfsobject"
                                  "standplaats"
                                  "ligplaats"]))))

(defn- insert-bag! [db sn]
  (log/debug "inserting bag data for" sn)
  (sql/db-do-commands db true


@@ 284,6 303,7 @@
              [table
               parse] ({"9999NUM" ["nummeraanduiding" parse-nummeraanduiding-xml]
                        "9999OPR" ["openbareruimte" parse-openbare-ruimte-xml]
                        "9999PND" ["pand" parse-pand-xml]
                        "9999VBO" ["verblijfsobject" parse-verblijfsobject-xml]
                        "9999LIG" ["ligplaats" parse-ligplaats-xml]
                        "9999STA" ["standplaats" parse-standplaats-xml]

M src/straatnaam/lvbag/bag.sql => src/straatnaam/lvbag/bag.sql +1 -1
@@ 53,7 53,7 @@ JOIN openbareruimte opr
  ON opr.id = num.openbareruimte_id AND opr.einddatum IS NULL
LEFT JOIN woonplaats wpl
  ON wpl.id = num.woonplaats_id AND wpl.einddatum IS NULL
JOIN woonplaats wpl2
LEFT JOIN woonplaats wpl2
  ON wpl2.id = opr.woonplaats_id AND wpl2.einddatum IS NULL
LEFT JOIN verblijfsobject vbo
  ON vbo.nummeraanduiding_id = num.id AND vbo.einddatum IS NULL

M test/straatnaam/lvbag_test.clj => test/straatnaam/lvbag_test.clj +10 -0
@@ 87,6 87,16 @@
      (is (= "2010-04-06" (:begindatum r1)))
      (is (= "Hoogerheide" (:naam r1))))))

(deftest parse-pand-xml
  (with-open [in (io/reader (io/resource "test/lvbag/9999PND.xml"))]
    (let [result (lvbag/parse-pand-xml in)
          [r]   result]
      (is (= 1 (count result)))

      (is (= 1883100000010452M (:id r)))
      (is (= "2011-07-28" (:begindatum r)))
      (is (= 1880 (:oorspronkelijk_bouwjaar r))))))

(deftest parse-atom-feed
  (with-open [in (io/reader (io/resource "test/adressen.xml"))]
    (let [{:keys [url updated]} (lvbag/parse-atom-feed in)]