wiki:ATKIS

Version 6 (modified by armin.retterath, 8 years ago) (diff)

--

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

Attachments