Insert/Update und Select

Hallo!

Ich will eine automatische Flächenberechnung der Geometrien einer PostGIS-Tabelle erstellen. Ist aber an sich kein PostGIS-Thema, deswegen hab ichs mal hier rein gestellt.

Ich habe eine (postgis-)tabelle “flaechen” mit folgenden spalten:
id, area, geometry.
Nun gibt es in Postgis die Funktion Area(geometry), die mir die fläche berechnet und die man in einer SELECT-Anweisung aufruft.

testdb=# SELECT Area(geometry) FROM flaechen ORDER BY id;
       area
------------------
 3475.72464942932
 2764.45471858978
 980.085523605347
 3005.54316997528
 3867.55013656616
(5 Zeilen)

liefert mir also meine Flächenwerte. Diese will ich aber in die Spalte “area” eintragen lassen.

UPDATE flaechen
SET area = ( SELECT Area (geometry) FROM flaechen);

funktioniert nicht, da ja zuviele Werte ausgegeben werden.

INSERT INTO flaechen(area) SELECT Area(geometry) FROM flaechen ORDER BY id;

funktioniert zwar schon, aber die flächeneinträge werden nach den vorhandenen einträgen hinzugefügt.

vorher:

testdb=# select id, area from flaechen order by id;
 id | area
----+------
  0 |
  1 |
  2 |
 10 |
 11 |
(5 Zeilen)

nachher:

testdb=# select id, area from test order by id;
 id|       area
----+------------------
  0 |
  1 |
  2 |
 10 |
 11 |
 56 | 3475.72464942932
 57 | 2764.45471858978
 58 | 980.085523605347
 59 | 3005.54316997528
 60 | 3867.55013656616
(10 Zeilen)

Was gibts denn da für ne Möglichkeit, dass ich die berechneten Flächenwerte, die ja jeweils einen Bezug zur Geometrie haben müssen, eintragen lassen kann?

gruß,
Johannes

Du brauchst wohl schon ein UPDATE-Query schließlich willst du deine Tabelle ja aktualisieren, indem du in eine Spalte bestehender Einträge Werte einfügst.
Dazu brauchst du zwei “Arbeitskopien” deiner Tabelle flaechen. Da die UPDATE-Syntax kein Alias vor dem SET duldet musst du zwangsläufig für die erste Arbeitskopie den kompletten Tabellennamen nehmen. In der FROM-List sind dann Aliase zugelassen, so dass die zweite Arbeitskopie eines bekommt. Die Kopien kannst du dann anhand ihrer _id_s verknüpfen.

Hab das zwar nicht mit deinen Tabellenangaben getestet, aber vom Prinzip her müsste deine Lösung etwa so aussehen:

UPDATE flaechen SET area = (SELECT Area(f1.geometry))
  FROM flaechen f1
  WHERE flaechen.id = f1.id ;

CU
Fröstel

update [schema.tabelle] set
   area=area([geom]);

hat bei mir soeben wunderbar funktioniert. Welche PostGIS-Version benutzt du?

Gruß Uwe

[EDIT] Versuchs einfach mal ohne das Subselect :wink:

Servus ihr zwei,

Vielen Dank für die Antworten! Beide Lösungen funktionieren tadellos.

zu Gisman:
Ich wusste nicht, dass man die Funktionen in PostGIS auch ohne Select aufrufen kann. Danke!
Version: PostGIS 1.3.1

gruß,
Johannes