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

VorSer
Интересующийся
Сообщения: 15
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

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

Сообщение VorSer » 18 июл 2017, 12:49

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

trir
Гуру
Сообщения: 3013
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 479
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 18 июл 2017, 13:06

ST_Area только геометрия должна быть в МСК69 ну и записовать ничего не нужно - просто сделайте представление

VorSer
Интересующийся
Сообщения: 15
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

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

Сообщение VorSer » 18 июл 2017, 13:51

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

trir
Гуру
Сообщения: 3013
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 479
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 18 июл 2017, 13:56

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

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

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

VorSer
Интересующийся
Сообщения: 15
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

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

Сообщение VorSer » 18 июл 2017, 14:21

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

trir
Гуру
Сообщения: 3013
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 479
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 18 июл 2017, 14:26

Мне нужны площади в гектарах

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

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

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

VorSer
Интересующийся
Сообщения: 15
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

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

Сообщение VorSer » 18 июл 2017, 16:15

Представление создано, значения площадей в нем похожи на правду

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

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

trir
Гуру
Сообщения: 3013
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 479
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 18 июл 2017, 18:41

Как сослаться в основной таблице на представление?
зачем?

VorSer
Интересующийся
Сообщения: 15
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

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

Сообщение VorSer » 18 июл 2017, 18:48

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

trir
Гуру
Сообщения: 3013
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 479
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 18 июл 2017, 19:01

Как сделать так, чтоб в поле map_area таблицы oopt_pgn_all_wgs84 оказалось значение из представления oopt_areas?
триггеры, но я не уверен, что это нужно

VorSer
Интересующийся
Сообщения: 15
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

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

Сообщение VorSer » 18 июл 2017, 19:36

Попробовал

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

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

trir
Гуру
Сообщения: 3013
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 479
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 18 июл 2017, 19:53

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

Александр Мурый
Гуру
Сообщения: 5014
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 707
Ваше звание: званий не имею
Откуда: Москва

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();

Имена таблиц и полей надо заменить соответственно.
Редактор материалов, модератор форума

VorSer
Интересующийся
Сообщения: 15
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

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

Сообщение VorSer » 18 июл 2017, 20:55

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

trir
Гуру
Сообщения: 3013
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 479
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 18 июл 2017, 21:01

да как бы в пол пинка делается... при знании основ

Ответить

Вернуться в «PostGIS/PostgreSQL»