= 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 }}} === 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 - das danach für RP 12GB an XML-Files): {{{ #!/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" -append PG:"dbname=$dbname user=$dbuser host=localhost port=$dbport password=$dbpassword" $folder/$nasfile 2>> postnas_error.log } done }}} === 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'); }}} ==== Erzeugen von Indizes auf der Tabelle alkis_beziehungen ==== Erzeugung der Indizes exterm langsam, für ATKIS RP ca 6-7h! (TODO: Ursache klären) {{{ CREATE INDEX alkis_beziehungen_von_idx ON alkis_beziehungen (beziehung_von); CREATE INDEX alkis_beziehungen_zu_idx ON alkis_beziehungen (beziehung_zu); vacuum analyze; }}} ==== 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" -append 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 ' || $1 || ' WHERE gml_id = ''' || $2 || ''''; EXECUTE query; query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || $2 || ''' OR beziehung_zu = ''' || $2 || ''''; 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; }}} 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" -append PG:"dbname=$dbname user=$dbuser host=localhost port=$dbport password=$dbpassword" -a_srs EPSG:25832 $folder/$nasfile 2>> $logfile } done }}}