Обобщу, ибо все заработало, благодаря старшим товарищам. А потом может пригодиться таким олухам как я, когда "некогда учиться - работать надо".
2.функция для определения зоны UTM создается SQL запросом:
Код: Выделить всё
CREATE OR REPLACE FUNCTION utmzone(geometry)
RETURNS integer AS
$BODY$
DECLARE
geomgeog geometry;
zone int;
pref int;
BEGIN
geomgeog:= ST_Transform($1,4326);
IF (ST_Y(geomgeog))>0 THEN
pref:=32600;
ELSE
pref:=32700;
END IF;
zone:=floor((ST_X(geomgeog)+180)/6)+1;
RETURN zone+pref;
END;
$BODY$ LANGUAGE 'plpgsql' IMMUTABLE
COST 100;
2.функция для расчета площади (га) в UTM с автоматическим определением зоны создается SQL запросом:
Код: Выделить всё
CREATE OR REPLACE FUNCTION calc_area()
RETURNS trigger AS
$BODY$
BEGIN
NEW.[имя_поля] := ST_Area(ST_Transform(NEW.geom, utmzone(ST_Centroid(NEW.geom))))/10000;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
3. функция для расчета площади (га) в МСК создается SQL запросом:
Код: Выделить всё
CREATE OR REPLACE FUNCTION calc_msk_area()
RETURNS trigger AS
$BODY$
BEGIN
NEW.[имя_поля] := ST_Area(NEW.geom)/10000;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
4. для расчета площади в UTM в таблице создается триггер:
Код: Выделить всё
CREATE TRIGGER area_calculate BEFORE INSERT OR UPDATE ON [имя_таблицы]
FOR EACH ROW EXECUTE PROCEDURE calc_area();
5. для расчета площади в МСК в таблице создается триггер:
Код: Выделить всё
CREATE TRIGGER area_calculate BEFORE INSERT OR UPDATE ON [имя_таблицы]
FOR EACH ROW EXECUTE PROCEDURE calc_msk_area();
6. площади существующих полигонов и мультиполигонов в UTM расcчитываются:
Код: Выделить всё
UPDATE [имя_таблицы] SET [имя_поля] = ST_Area(ST_Transform(geom, utmzone(ST_Centroid(geom))))/10000
7. площади существующих полигонов и мультиполигонов в МСК расcчитываются соответственно:
Код: Выделить всё
UPDATE [имя_таблицы] SET [имя_поля] = ST_Area(geom)/10000
Наверняка можно как-то изящнее, но это вполне работает и для небольших проектов (в моем случае из нескольких слоев, до 1000 объектов в каждом, в масштабах одной области) по-моему годится. Лучше было бы пересчитывать в МСК а не в UTM, но подозреваю, что это будет несколько сложнее - мне пока не удалось научить postGIS/Qgis воспринимать МСК как родную, а там еще и зоны определять придется как-то. Буду рад, если расскажете, но пока спасибище trir и Александр Мурый, за решение простой но важно задачки.