wiki:ATKIS
Last modified 4 years ago Last modified on 01/07/14 13:13:40

Präsentation

Screenshot von A.Retterath

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/branches/0.6/data/konvert/postnas_0.6/atkis_rp_PostNAS_0.6_schema.sql 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" -append  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"  -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 ' || 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"  -append 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.

Erneutes Löschen der delete Tabelle

TRUNCATE table "delete";

Vacuum analyze

vacuum analze;

Dauer ca 130s

Attachments