Страница 1 из 3

автоматический расчет площадей полигонов средствами PostGIS

Добавлено: 18 июл 2017, 12:49
VorSer
Имеется служебная база данных на postgesql 9.6.3 + postgis
десяток таблиц с геометрией, WGS84 (ESPG:4326) и МСК69
в перспективе планируется добавить туда еще пару служебных таблиц + АТД
клиенты QGIS 2.18.9-10
Нужно реализовать автоматический расчет площадей полигонов (в га, с точностью не ниже 0,001 га) средствами базы данных при создании или изменении геометрии.
Другими словами, если пользователь (с соответствующими правами для данной таблицы) построил/отредактировал полигон и записал изменения в базу, сервер должен рассчитать его площадь и записать значение в соответствующее поле таблицы.
П.С. автор ничего круче екселя не знает, и весьма примерно представляет как это сделать, поэтому очень хотелось бы что-то вроде HowTo (делай раз, делай два, ..., повторить для другой таблицы). Но если подскажете что конкретно и где почитать тоже поможет.

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 13:06
trir
ST_Area только геометрия должна быть в МСК69 ну и записовать ничего не нужно - просто сделайте представление

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 13:51
VorSer
Про ST_Area я догадывался, но с какими аргументами?
геометрию нужно использовать какая есть. Насколько понимаю данные можно перепроецировать, к примеру, в 32636 или 32637 для расчета площади...
про представление не совсем понял зачем, что бы не записывать? Так мне вроде наоборот, надо чтоб площадь в атрибутах появилась через UPDATE и я потом её для подписей объектов и статистики использовал, хотя может быть.
Но я дико извиняюсь, не могли бы вы показать как выглядит запрос, который создает представление с площадями?

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 13:56
trir
В ESPG:4326 никто площади не считает - это не имеет смысла
в 32636 или 32637 для расчета площади
а зачем вам площади в UTM? Вам ведь явно нужны площади в МСК69

Код: Выделить всё

CREATE VIEW work_areas AS select ST_Area(ST_Transform(geom, srid)) from tbl
надо чтоб площадь в атрибутах появилась
подключаете представление и делаете на его основе метки

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 14:21
VorSer
Мне нужны площади в гектарах, и что-бы этим цифрам можно было верить (с известной точностью). Лучше всего чтобы они оказались в таблице в поле map_area помимо желания пользователя, а пользователь мог их быстро сравнить со значение doc_area и убедиться, что они примерно равны
А слои (таблицы) у меня есть в трех зонах МСК69 и в WGS84 (большая часть).
За запрос с представлением спасибо, для МСК работает вроде бы корректно, только не совсем понимаю, что мне с ним делать: создать представление для каждой таблицы и брать значениt map_area из представления?

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 14:26
trir
Мне нужны площади в гектарах

Код: Выделить всё

CREATE VIEW work_areas AS select ST_Area(ST_Transform(geom, srid))/10000 from tbl
создать представление для каждой таблицы и брать значениt map_area из представления?
да
А слои (таблицы) у меня есть в трех зонах МСК69 и в WGS84 (большая часть).
ST_Transform

Но если вам надо быстро, то стоит это сделать не в базе, а на стороне QGIS

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 16:15
VorSer
Представление создано, значения площадей в нем похожи на правду

Код: Выделить всё

CREATE VIEW oopt_areas AS select ST_Area(ST_Transform(geom, 32636))/10000 from oopt_pgn_all_wgs84
Как сослаться в основной таблице на представление?
На стороне QGIS не катит, так как в этом случае все зависит пользователя, а это не всегда оправдано

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 18:41
trir
Как сослаться в основной таблице на представление?
зачем?

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 18:48
VorSer
Я же говорил, что ничего круче екселя не видал, но задача стоит... поэтому и сформулировать не могу толком.
Как сделать так, чтоб в поле map_area таблицы oopt_pgn_all_wgs84 оказалось значение из представления oopt_areas?

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 19:01
trir
Как сделать так, чтоб в поле map_area таблицы oopt_pgn_all_wgs84 оказалось значение из представления oopt_areas?
триггеры, но я не уверен, что это нужно

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 19:36
VorSer
Попробовал

Код: Выделить всё

UPDATE oopt_pgn_all_wgs84
SET map_area = area
FROM oopt_areas;
теперь все полигоны имеют площадь 450.123219280483)))
Явно что-то не так делаю

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 19:53
trir
добавь в представление ключ из сходной таблицы, а потом join
и я бы советовал изучить теорию Реляционных баз данных

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 20:52
Александр Мурый
Рабочий пример триггера, который использует созданную функцию для расчёта площади:

Код: Выделить всё

CREATE OR REPLACE FUNCTION calc_area()
RETURNS trigger AS
$BODY$
BEGIN
NEW.area := ST_Area(ST_Transform(NEW.geometry, 32637))/10000;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER area_calculate BEFORE INSERT OR UPDATE ON import.osm_admin
    FOR EACH ROW EXECUTE PROCEDURE calc_area();

Имена таблиц и полей надо заменить соответственно.

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 20:55
VorSer
trir писал(а):добавь в представление ключ из сходной таблицы, а потом join
стало еще непонятнее...
Бесспорно, знание теории помогает в практике. Только вот тут "быстренько" не получится, а это не основная моя работа, точнее обязанность, поэтому времени на обучение никто и не дает))) Надо чтоб работало!
Честно говоря, не ожидал что задача по вычислению площади окажется настолько сложной в реализации

Re: автоматический расчет площадей полигонов средствами Post

Добавлено: 18 июл 2017, 21:01
trir
да как бы в пол пинка делается... при знании основ