= Aufbau einer ATKIS Datenbank = == Erzeugen einer Postgres Datenbank == === Erstellen eines Templates === Beispiel für Debian Squeeze - Postgres 8.4/Postgis 1.5 - Cluster auf Port 5433 Als user postgres {{{ createdb -E UTF8 -T template0 -p 5433 postgisutf8 createlang plpgsql -p 5433 postgisutf8 psql -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql -p 5433 postgisutf8 psql -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql -p 5433 postgisutf8 }}} === Erzeugen der Datenbank aus Template === Als user postgres {{{ createdb -E UTF8 -T postgisutf8 -p 5433 atkis }}} === Import der initialen Tabellenstruktur === Im SVN-Repository von PostNAS finden Sie die Datei '''atkis_rp_PostNAS_0.6_schema.sql''', mit der die komplette ATKIS PostNAS-Tabellenstruktur aufgebaut werden kann: http://trac.wheregroup.com/PostNAS/browser/trunk/data/konvert/postnas_0.6/atkis_rp_PostNAS_0.6_schema.sql?format=raw Laden Sie die Datei auf Ihren Rechner und spielen Sie dieses Schema in Ihre neue Datenbank ein: {{{ psql -U postgres -d atkis -f atkis_rp_PostNAS_0.6_schema.sql }}} === Indixes erstellen === Nur notwendig wenn man ein anderes Datenodell als das im Schema verwendete nutzt und man sich den Aufruf zur Erzeugung der Indizes automatisch erstellen lassen will! {{{ Select 'CREATE INDEX ' || f_table_name || '_idx ON ' || f_table_name || '(gml_id);' from geometry_columns where f_table_name != 'alkis_beziehungen' ORDER by f_table_name; }}} === Import der Erstausstattung in die DB === Die NAS Daten liegen meist als gezippte Einzelkacheln vor. In RP sind es ca 250 einzelne Dateien. Um diese zu importieren, bietet sich ein kleines Shellscript wie das folgende an (die Daten müssen vorher entpackt werden - für RP sind das danach 12GB an XML-Files). Der Erstimport dauert ca 5h: {{{ #!/bin/sh #Do this as user #This script imports all xml files into the postgresdatabase # dbname="atkis" dbport="5433" dbuser="atkis_user" dbpassword="atkis_user" logfile="postnas_import.log" folder="/data/atkis/unzipped" cd $folder for nasfile in 1Spatial_rlp_nba_20110627T000000_*.xml do { time /data/gdal-trunk/gdal/apps/ogr2ogr -f "PostgreSQL" -update PG:"dbname=$dbname user=$dbuser host=localhost port=$dbport password=$dbpassword" $folder/$nasfile 2>> postnas_error.log } done }}} ==== Indizes initialisieren ==== {{{ vacuum analyze; }}} Dauer: 126s auf VM Single Core 2Ghz === Update der Daten über NBA === Die Updates werden ebenfalls kachelweise geliefert. Wie auch schon bei den ALKIS Daten beschrieben, geschieht der Update Prozess in mehreren Schritten: ==== Anlegen einer Löschtabelle ==== {{{ -- Table: "delete" -- DROP TABLE "delete"; CREATE TABLE "delete" ( ogc_fid serial NOT NULL, typename character(255), featureid character(255), CONSTRAINT delete_pk PRIMARY KEY (ogc_fid) ) WITH ( OIDS=FALSE ); ALTER TABLE "delete" OWNER TO atkis_user; INSERT INTO geometry_columns (f_table_catalog,f_table_schema,f_table_name,f_geometry_column,coord_dimension,srid,type) VALUES ('','public','delete','dummy',2,25832,'POINT'); }}} ==== Import der Löschdatensätze (Delete) in die Löschtabelle per Shellscript ==== {{{ #!/bin/sh #Do this as user postgres #This script imports all xml files into the postgresdatabase # dbname="atkis" dbport="5433" dbuser="atkis_user" dbpassword="atkis_user" logfile="postnas_nba_import.log" folder="/data/atkis/nba/0000064U/unzipped" cd $folder for nasfile in 1Spatial_rlp_nba_20110727T000000_*.xml do { time /data/gdal-trunk/gdal/apps/ogr2ogr -f "PostgreSQL" -update PG:"dbname=$dbname user=$dbuser host=localhost port=$dbport password=$dbpassword" $folder/$nasfile Delete 2>> $logfile } done }}} ==== Löschen der Elemente ==== Die Objekte und die Relationen lassen sich mit der Funktion, die auch für die ALKIS Daten verwendet wird, per SQL aus der Datenbank entfernen: Funktion: {{{ -- Function: deletefeature(text, text) -- DROP FUNCTION deletefeature(text, text); CREATE OR REPLACE FUNCTION deletefeature(typename text, featureid text) RETURNS text AS $BODY$ DECLARE query text; res text; BEGIN query := 'DELETE FROM ' || lower($1) || ' WHERE gml_id = ''' || substring($2 from 1 for 16) || ''''; EXECUTE query; query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || substring($2 from 1 for 16) || ''' OR beziehung_zu = ''' || substring($2 from 1 for 16) || ''''; EXECUTE query; IF FOUND THEN RAISE NOTICE 'query successfull % ', query; res := 1; ELSE RAISE NOTICE 'query no object found % ', query; res := 0; END IF; RETURN res; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; }}} SQL Aufruf: {{{ SELECT deleteFeature(typename, featureid) AS deletefeature FROM delete; TRUNCATE table "delete"; }}} Die Abfrage dauert ohne die Verwendung von Indizes unglaublich lange! ==== Import aller neuen Daten in die Datenbank ==== Shellscript: {{{ #!/bin/sh #Do this as user postgres #This script imports all xml files into the postgresdatabase # dbname="atkis" dbport="5433" dbuser="atkis_user" dbpassword="atkis_user" logfile="postnas_nba_import.log" folder="/data/atkis/nba/0000064U/unzipped" cd $folder for nasfile in 1Spatial_rlp_nba_20110727T000000_*.xml do { time /data/gdal-trunk/gdal/apps/ogr2ogr -f "PostgreSQL" -update PG:"dbname=$dbname user=$dbuser host=localhost port=$dbport password=$dbpassword" -a_srs EPSG:25832 $folder/$nasfile 2>> $logfile } done }}} Dauer je nach Menge der Änderungen. XML mit ca 20000 Änderungen braucht ca 8 s. ==== Vacuum analyze ==== {{{ vacuum analze; }}} Dauer ca 130s