source: trunk/data/konvert/postnas_0.7/pp_laden.sql @ 178

Revision 178, 7.9 KB checked in by frank.jaeger, 8 years ago (diff)

delete/replace aus GDAL Patch #5444

Line 
1
2-- ALKIS PostNAS 0.7
3
4-- Post Processing (pp_) Teil 2: Laden der Tabellen
5
6-- Stand
7
8--  2012-02-13 PostNAS 07, Umbenennung
9--  2012-02-17 Optimierung
10--  2012-04-17 Flurstuecksnummern auf Standardposition
11--  2012-04-24 Generell Filter 'endet IS NULL' um historische Objekte auszublenden
12
13
14-- ============================
15-- Tabellen des Post-Processing
16-- ============================
17
18-- Einige Informationen liegen nach der NAS-Konvertierung in der Datenbank "verstreut" vor.
19-- Die dynamische Aufbereitung über Views und Functions würde zu lange dauern und somit lange
20-- Antwortzeiten in WMS, WFS, Buchauskunft oder Navigation (Suche) verursachen.
21
22-- Im Rahmen eines "Post-Processing" werden diese Daten nach jeder Konvertierung (NBA-Aktialisierung)
23-- einmal komplett aufbereitet. Die benötigten Informationen stehen somit den Anwendungen mundgerecht zur Verfügung.
24
25-- Die per PostProcessing gefüllten Tabellen bekommen den Profix "pp_".
26
27-- Die Ausführung dieses Scriptes auf einer Datenbank für eine 80T-Einwohner-Stadt dauert ca.: 500 Sek. !
28
29
30
31-- ===========================
32-- Flurstuecksnummern-Position
33-- ===========================
34
35-- ersetzt den View "s_flurstueck_nr" für WMS-Layer "ag_t_flurstueck"
36
37  DELETE FROM pp_flurstueck_nr;
38
39  INSERT INTO pp_flurstueck_nr
40          ( fsgml, fsnum, the_geom )
41    SELECT f.gml_id,
42           f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS fsnum,
43           p.wkb_geometry  -- manuelle Position des Textes
44      FROM ap_pto             p
45      JOIN alkis_beziehungen  v  ON p.gml_id       = v.beziehung_von
46      JOIN ax_flurstueck      f  ON v.beziehung_zu = f.gml_id
47     WHERE v.beziehungsart = 'dientZurDarstellungVon'
48       AND f.endet IS NULL
49       AND p.endet IS NULL
50     --AND p."art" = 'ZAE_NEN'
51   UNION
52    SELECT f.gml_id,
53           f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS fsnum,
54           ST_PointOnSurface(f.wkb_geometry) AS wkb_geometry  -- Flaechenmitte als Position des Textes
55      FROM      ax_flurstueck     f
56      LEFT JOIN alkis_beziehungen v  ON v.beziehung_zu = f.gml_id
57     WHERE v.beziehungsart is NULL
58       AND f.endet IS NULL
59  ;
60-- Ausführung: mittlere Stadt: ca. 4 - 18 Sec.
61
62
63-- ========================================================
64-- Tabellen fuer die Zuordnung vom Gemarkungen zu Gemeinden
65-- ========================================================
66
67-- Für die Regelung der Zugriffsberechtigung einer Gemeindeverwaltung auf die
68-- Flurstücke in ihrem Gebiet braucht man die Information, in welcher Gemeinde eine Gemarkung liegt.
69-- 'ax_gemeinde' und 'ax_gemarkung' haben aber im ALKIS keinerlei Beziehung zueinander - kaum zu glauben!
70-- Nur über die Auswertung der Flurstücke kann man die Zuordnung ermitteln.
71-- Da nicht ständig mit 'SELECT DISTINCT' sämtliche Flurstücke durchsucht werden können,
72-- muss diese Information als (redundante) Tabelle nach dem Laden zwischengespeichert werden.
73
74
75SET client_encoding = 'UTF-8';
76
77
78-- Alles auf Anfang!
79  DELETE FROM pp_gemeinde;
80  DELETE FROM pp_gemarkung;
81  DELETE FROM pp_flur;
82
83
84-- Vorkommende Paarungen Gemarkung <-> Gemeinde in ax_Flurstueck
85INSERT INTO pp_gemarkung
86  (               land, regierungsbezirk, kreis, gemeinde, gemarkung       )
87  SELECT DISTINCT land, regierungsbezirk, kreis, gemeinde, gemarkungsnummer
88  FROM            ax_flurstueck
89  WHERE           endet IS NULL
90  ORDER BY        land, regierungsbezirk, kreis, gemeinde, gemarkungsnummer
91;
92
93-- daraus: Vorkommende Gemeinden
94INSERT INTO pp_gemeinde
95  (               land, regierungsbezirk, kreis, gemeinde)
96  SELECT DISTINCT land, regierungsbezirk, kreis, gemeinde
97  FROM            pp_gemarkung
98  ORDER BY        land, regierungsbezirk, kreis, gemeinde
99;
100
101-- Namen der Gemeinde dazu als Optimierung bei der Auskunft
102UPDATE pp_gemeinde a
103   SET gemeindename =
104   ( SELECT b.bezeichnung
105     FROM    ax_gemeinde b
106     WHERE a.land=b.land
107       AND a.regierungsbezirk=b.regierungsbezirk
108       AND a.kreis=b.kreis
109       AND a.gemeinde=b.gemeinde
110       AND b.endet IS NULL
111   );
112
113-- Namen der Gemarkung dazu als Optimierung bei der Auskunft
114UPDATE pp_gemarkung a
115   SET gemarkungsname =
116   ( SELECT b.bezeichnung
117     FROM    ax_gemarkung b
118     WHERE a.land=b.land
119       AND a.gemarkung=b.gemarkungsnummer
120       AND b.endet IS NULL
121   );
122
123
124-- ==============================================================================
125-- Geometrien der Flurstücke schrittweise zu groesseren Einheiten zusammen fassen
126-- ==============================================================================
127
128-- Dies macht nur Sinn, wenn der Inhalt der Datenbenk einen ganzen Katasterbezirk enthält.
129-- Wenn ein Gebiet durch geometrische Filter im NBA ausgegeben wurde, dann gibt es Randstreifen,
130-- die zu Pseudo-Fluren zusammen gefasst werden. Fachlich falsch!
131
132-- ToDo:
133--   TopologyException: found non-noded intersection between   ...
134--   Nur "geprüfte Flurstücke" verwenden?  Filter?
135
136INSERT INTO pp_flur (land, regierungsbezirk, kreis, gemarkung, flurnummer, anz_fs, the_geom )
137   SELECT  f.land, f.regierungsbezirk, f.kreis, f.gemarkungsnummer as gemarkung, f.flurnummer,
138           count(gml_id) as anz_fs,
139           multi(st_union(st_buffer(f.wkb_geometry,0))) AS the_geom
140     FROM  ax_flurstueck f
141     WHERE f.endet IS NULL
142  GROUP BY f.land, f.regierungsbezirk, f.kreis, f.gemarkungsnummer, f.flurnummer;
143
144
145-- Fluren zu Gemarkungen zusammen fassen
146-- -------------------------------------
147
148-- Flächen vereinigen
149UPDATE pp_gemarkung a
150  SET the_geom =
151   ( SELECT multi(st_union(st_buffer(b.the_geom,0))) AS the_geom
152     FROM    pp_flur b
153     WHERE a.land=b.land AND a.gemarkung=b.gemarkung
154   );
155
156-- Fluren zaehlen
157UPDATE pp_gemarkung a
158  SET anz_flur =
159   ( SELECT count(flurnummer) AS anz_flur
160     FROM    pp_flur b
161     WHERE a.land=b.land AND a.gemarkung=b.gemarkung
162   ); -- Gemarkungsnummer ist je BundesLand eindeutig
163
164-- Geometrie vereinfachen (Wirkung siehe pp_gemarkung_analyse)
165UPDATE pp_gemarkung SET simple_geom = simplify(the_geom, 8.0);
166
167
168-- Gemarkungen zu Gemeinden zusammen fassen
169-- ----------------------------------------
170
171-- Flächen vereinigen
172UPDATE pp_gemeinde a
173  SET the_geom =
174   ( SELECT multi(st_union(st_buffer(b.the_geom,0))) AS the_geom
175     FROM    pp_gemarkung b
176     WHERE a.land=b.land AND a.gemeinde=b.gemeinde
177   );
178
179-- Gemarkungen zählen
180UPDATE pp_gemeinde a
181  SET anz_gemarkg =
182   ( SELECT count(gemarkung) AS anz_gemarkg
183     FROM    pp_gemarkung b
184     WHERE a.land=b.land AND a.gemeinde=b.gemeinde
185   );
186
187-- Geometrie vereinfachen (Wirkung siehe pp_gemeinde_analyse)
188UPDATE pp_gemeinde SET simple_geom = simplify(the_geom, 20.0);
189
190
191-- =======================================================
192-- Tabelle fuer die Zuordnung vom Eigentümern zu Gemeinden
193-- =======================================================
194
195
196-- erst mal sauber machen
197DELETE FROM gemeinde_person;
198
199-- alle direkten Buchungen mit View ermitteln und in Tabelle speichern
200-- Für eine Stadt: ca. 20 Sekunden
201INSERT INTO  gemeinde_person
202       (land, regierungsbezirk, kreis, gemeinde, person, buchtyp)
203 SELECT land, regierungsbezirk, kreis, gemeinde, person, 1
204   FROM gemeinde_person_typ1;
205
206
207-- noch die komplexeren Buchungen ergänzen (Recht an ..)
208-- Mit View ermitteln und in Tabelle speichern
209-- Für eine Stadt: ca. 10 Sekunden
210INSERT INTO  gemeinde_person
211       (  land,   regierungsbezirk,   kreis,   gemeinde,   person,  buchtyp)
212 SELECT q.land, q.regierungsbezirk, q.kreis, q.gemeinde, q.person,  2
213   FROM gemeinde_person_typ2 q   -- Quelle
214   LEFT JOIN gemeinde_person z   -- Ziel
215     ON q.person   = z.person    -- Aber nur, wenn dieser Fall im Ziel
216    AND q.land     = z.land
217    AND q.regierungsbezirk = z.regierungsbezirk
218    AND q.kreis    = z.kreis
219    AND q.gemeinde = z.gemeinde
220  WHERE z.gemeinde is Null;      -- ..  noch nicht vorhanden ist
221
222
223-- ENDE --
Note: See TracBrowser for help on using the repository browser.