-- ALKIS PostNAS 0.8 -- ====================================================== -- Zusammenfassung der Tabellen der tatsächlichen Nutzung -- ====================================================== -- Um bei einer Feature.Info (Welche Nutzung an dieser Stelle?) -- oder einer Verschneidung (Welche Nutzungen auf dem Flurstück?) -- nicht 26 verschiedene Tabellen abfragen zu müssen, werden die wichtigsten -- Felder dieser Tabellen zusammen gefasst. -- Teil 1: Anlegen der Tabellen -- Variable für das Koordinatensystem übergeben mit "psql .. -v alkis_epsg="25832" -- Stand -- 2012-02-10 PostNAS 0.7, Umbenennung -- 2013-11-15 In nutzung_class.class können NULL-Werte auftreten. -- 2013-11-26 NULL wird durch Zahl "0" ersetzt, "NOT NULL" wieder aktivieren -- 2014-08-26 erweiterte gml_id (wie in den primären Tabellen) -- 2014-11-25 Version geaendert auf 0.8, EPSG Übergabe in Tabelle Nutzung -- 2015-03-10 Massenhaft "ST_CurvePolygon" in "nutzung". -- Quick 'n dirty: Einschränkung des geometry-Typ löschen. SET client_encoding = 'UTF-8'; -- Alles auf Anfang! /* DROP TABLE nutzung; DROP TABLE nutzung_class; DROP TABLE nutzung_meta; */ -- Meta-Informationen ueber die Zusammenfassung und Gruppierung -- ------------------------------------------------------------ CREATE TABLE nutzung_meta ( nutz_id integer NOT NULL, gruppe character varying(30), source_table character varying(50), title character varying(50), fldclass character varying(30), fldinfo character varying(30), CONSTRAINT nutzung_meta_pk PRIMARY KEY (nutz_id) ); COMMENT ON TABLE nutzung_meta IS 'Gruppierung und Indizierung der zusammen gefassten Nutzungsarten in der Tabelle "nutzung".'; COMMENT ON COLUMN nutzung_meta.nutz_id IS 'Index fuer die Quell-Tabelle bei der Zusammenfassung in der Tabelle "nutzung".'; COMMENT ON COLUMN nutzung_meta.source_table IS 'Name der importierten Tabelle aus PostNAS.'; COMMENT ON COLUMN nutzung_meta.gruppe IS 'Objektartengruppe, Gruppierung der Nutzungsart.'; COMMENT ON COLUMN nutzung_meta.title IS 'Vorzeigbare Bezeichnung der Nutzungsartentabelle.'; COMMENT ON COLUMN nutzung_meta.fldclass IS 'Name des Feldes aus "source_table", das in Feld "nutzung.class" kopiert wird.'; COMMENT ON COLUMN nutzung_meta.fldinfo IS 'Name des Feldes aus "source_table", das in Feld "nutzung.info" kopiert wird.'; -- Alle Abschnitte der "tatsächlichen Nutzung" vereinigt in einer Tabelle -- Sie sind dann mit einem gemeinsamen Geometrie-Index mit einer SQL-Abfrage auffindbar. -- Dies ist die förderlich für eine performante Auskunft. CREATE TABLE nutzung ( gml_id character varying NOT NULL, beginnt character(20), -- mehrfache gml_id eindeutig machen -- endet character(20), -- nur "ended IS NULL" kopieren nutz_id integer, class integer NOT NULL, -- NULL-Werte der Quelltabelle durch den num. Wert 0 ersetzen info integer, zustand integer, "name" character varying, bezeichnung character varying, CONSTRAINT nutzung_pk PRIMARY KEY (gml_id, beginnt), CONSTRAINT nutzung_meta_id FOREIGN KEY (nutz_id) REFERENCES nutzung_meta (nutz_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE ) WITH (OIDS=FALSE); SELECT AddGeometryColumn('nutzung','wkb_geometry',:alkis_epsg,'POLYGON',2); -- Vereinzelt auch vorkommende MULTIPOLYGON -- 2015-03-10: Massenhaft "ST_CurvePolygon" --ALTER TABLE nutzung DROP CONSTRAINT enforce_geotype_wkb_geometry; -- 2015-03-16 diese wieder rückgängig, statt dessen Parameter beim Konverter-Aufruf. -- 'class' ist nur innerhalb einer Gruppe ein sinvoller Index CREATE INDEX idx_nutz_cls ON nutzung USING btree (nutz_id, class); -- Geometrischer Index für die räumliche Suche CREATE INDEX nutzung_geom_idx ON nutzung USING gist (wkb_geometry); COMMENT ON TABLE nutzung IS 'Zusammenfassung von 26 Tabellen des Objektbereiches "Tatsächliche Nutzung".'; COMMENT ON COLUMN nutzung.gml_id IS 'Identifikator, global eindeutig'; COMMENT ON COLUMN nutzung.nutz_id IS 'Index fuer die Quell-Tabelle bei der Zusammenfassung in der Tabelle "nutzung".'; COMMENT ON COLUMN nutzung.class IS 'Klassifizierung innerhalb der Nutzung. Aus verschiedenen Feldern importiert. Siehe "nutzung_meta.fldclass".'; COMMENT ON COLUMN nutzung.info IS 'Weitere verschlüsselte Information zur Nutzung. Aus verschiedenen Feldern importiert. Siehe "nutzung_meta.fldinfo".'; COMMENT ON COLUMN nutzung.name IS 'NAM Eigenname'; COMMENT ON COLUMN nutzung.bezeichnung IS 'weitere unverschlüsselte Information wie Zweitname, Bezeichnung, fachliche Nummerierung usw.'; COMMENT ON COLUMN nutzung.zustand IS 'ZUS "Zustand" beschreibt, ob der Abschnitt ungenutzt ist.'; -- Schluesseltabelle: classes innerhalb einer Nutzungsart. -- Wird nicht aus NAS geladen sondern durch das manuell zu pflegende Script "nutzungsart_metadaten.sql" CREATE TABLE nutzung_class ( nutz_id integer NOT NULL, class integer, -- NOT NULL, label character varying(100), blabla character varying(1000), CONSTRAINT nutzung_class_pk PRIMARY KEY (nutz_id, class), CONSTRAINT nutzung_class_id FOREIGN KEY (nutz_id) REFERENCES nutzung_meta (nutz_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE ); COMMENT ON TABLE nutzung_class IS 'Schlüsseltabelle. Feinere Klassifizierung der zusammen gefassten Nutzungsarten.'; COMMENT ON COLUMN nutzung_class.nutz_id IS 'Index fuer die Quell-Tabelle bei der Zusammenfassung in der Tabelle nutzung.'; COMMENT ON COLUMN nutzung_class.class IS 'Key, Schlüsselwert oder NULL'; COMMENT ON COLUMN nutzung_class.label IS 'Entschlüsselung. Art der Nutzung, Dies Feld soll in der Auskunft angezeigt werden.'; COMMENT ON COLUMN nutzung_class.blabla IS 'Weitere Erläuterungen und Definitionen dazu.'; -- Fehlersuche nach GDAL Patch #5444: -- Da nun gml_id nicht mehr PRIMARY KEY der Ausgangstabellen ist , kommt es auch zu Doppelbelegungen der Zusammenfassung. -- Diese Fälle suchen. CREATE OR REPLACE VIEW nutzung_mehrfache_gml AS SELECT a.gml_id, a.nutz_id, a.beginnt as beginnt1, b.beginnt as beginnt2 FROM nutzung a JOIN nutzung b ON a.gml_id = b.gml_id WHERE a.beginnt < b.beginnt --LIMIT 100 ; -- Vorkommende Geometry-Typen -- SELECT a.gml_id, st_geometrytype(a.wkb_geometry) as geomtype ,a.artderbebauung, a.zustand, a.name, a.beginnt -- FROM ax_wohnbauflaeche a WHERE geometrytype(wkb_geometry) <> 'POLYGON'; -- SELECT a.gml_id, st_geometrytype(a.wkb_geometry) as geomtype ,a.artderbebauung, a.zustand, a.name, a.beginnt -- FROM ax_wohnbauflaeche a WHERE geometrytype(wkb_geometry) <> 'POLYGON'; -- Ergebnis: Ein MULTIPOLYGON -- Konsequenz: nur Polygone kopieren. -- END --