автоматический расчет площадей полигонов средствами PostGIS
-
- Интересующийся
- Сообщения: 31
- Зарегистрирован: 18 июл 2017, 12:26
- Репутация: 0
автоматический расчет площадей полигонов средствами PostGIS
Имеется служебная база данных на postgesql 9.6.3 + postgis
десяток таблиц с геометрией, WGS84 (ESPG:4326) и МСК69
в перспективе планируется добавить туда еще пару служебных таблиц + АТД
клиенты QGIS 2.18.9-10
Нужно реализовать автоматический расчет площадей полигонов (в га, с точностью не ниже 0,001 га) средствами базы данных при создании или изменении геометрии.
Другими словами, если пользователь (с соответствующими правами для данной таблицы) построил/отредактировал полигон и записал изменения в базу, сервер должен рассчитать его площадь и записать значение в соответствующее поле таблицы.
П.С. автор ничего круче екселя не знает, и весьма примерно представляет как это сделать, поэтому очень хотелось бы что-то вроде HowTo (делай раз, делай два, ..., повторить для другой таблицы). Но если подскажете что конкретно и где почитать тоже поможет.
десяток таблиц с геометрией, WGS84 (ESPG:4326) и МСК69
в перспективе планируется добавить туда еще пару служебных таблиц + АТД
клиенты QGIS 2.18.9-10
Нужно реализовать автоматический расчет площадей полигонов (в га, с точностью не ниже 0,001 га) средствами базы данных при создании или изменении геометрии.
Другими словами, если пользователь (с соответствующими правами для данной таблицы) построил/отредактировал полигон и записал изменения в базу, сервер должен рассчитать его площадь и записать значение в соответствующее поле таблицы.
П.С. автор ничего круче екселя не знает, и весьма примерно представляет как это сделать, поэтому очень хотелось бы что-то вроде HowTo (делай раз, делай два, ..., повторить для другой таблицы). Но если подскажете что конкретно и где почитать тоже поможет.
Последний раз редактировалось VorSer 21 июл 2017, 00:30, всего редактировалось 1 раз.
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: автоматический расчет площадей полигонов средствами Post
ST_Area только геометрия должна быть в МСК69 ну и записовать ничего не нужно - просто сделайте представление
-
- Интересующийся
- Сообщения: 31
- Зарегистрирован: 18 июл 2017, 12:26
- Репутация: 0
Re: автоматический расчет площадей полигонов средствами Post
Про ST_Area я догадывался, но с какими аргументами?
геометрию нужно использовать какая есть. Насколько понимаю данные можно перепроецировать, к примеру, в 32636 или 32637 для расчета площади...
про представление не совсем понял зачем, что бы не записывать? Так мне вроде наоборот, надо чтоб площадь в атрибутах появилась через UPDATE и я потом её для подписей объектов и статистики использовал, хотя может быть.
Но я дико извиняюсь, не могли бы вы показать как выглядит запрос, который создает представление с площадями?
геометрию нужно использовать какая есть. Насколько понимаю данные можно перепроецировать, к примеру, в 32636 или 32637 для расчета площади...
про представление не совсем понял зачем, что бы не записывать? Так мне вроде наоборот, надо чтоб площадь в атрибутах появилась через UPDATE и я потом её для подписей объектов и статистики использовал, хотя может быть.
Но я дико извиняюсь, не могли бы вы показать как выглядит запрос, который создает представление с площадями?
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: автоматический расчет площадей полигонов средствами Post
В ESPG:4326 никто площади не считает - это не имеет смысла
а зачем вам площади в UTM? Вам ведь явно нужны площади в МСК69в 32636 или 32637 для расчета площади
Код: Выделить всё
CREATE VIEW work_areas AS select ST_Area(ST_Transform(geom, srid)) from tbl
подключаете представление и делаете на его основе меткинадо чтоб площадь в атрибутах появилась
-
- Интересующийся
- Сообщения: 31
- Зарегистрирован: 18 июл 2017, 12:26
- Репутация: 0
Re: автоматический расчет площадей полигонов средствами Post
Мне нужны площади в гектарах, и что-бы этим цифрам можно было верить (с известной точностью). Лучше всего чтобы они оказались в таблице в поле map_area помимо желания пользователя, а пользователь мог их быстро сравнить со значение doc_area и убедиться, что они примерно равны
А слои (таблицы) у меня есть в трех зонах МСК69 и в WGS84 (большая часть).
За запрос с представлением спасибо, для МСК работает вроде бы корректно, только не совсем понимаю, что мне с ним делать: создать представление для каждой таблицы и брать значениt map_area из представления?
А слои (таблицы) у меня есть в трех зонах МСК69 и в WGS84 (большая часть).
За запрос с представлением спасибо, для МСК работает вроде бы корректно, только не совсем понимаю, что мне с ним делать: создать представление для каждой таблицы и брать значениt map_area из представления?
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: автоматический расчет площадей полигонов средствами Post
Мне нужны площади в гектарах
Код: Выделить всё
CREATE VIEW work_areas AS select ST_Area(ST_Transform(geom, srid))/10000 from tbl
дасоздать представление для каждой таблицы и брать значениt map_area из представления?
ST_TransformА слои (таблицы) у меня есть в трех зонах МСК69 и в WGS84 (большая часть).
Но если вам надо быстро, то стоит это сделать не в базе, а на стороне QGIS
-
- Интересующийся
- Сообщения: 31
- Зарегистрирован: 18 июл 2017, 12:26
- Репутация: 0
Re: автоматический расчет площадей полигонов средствами Post
Представление создано, значения площадей в нем похожи на правду
Как сослаться в основной таблице на представление?
На стороне QGIS не катит, так как в этом случае все зависит пользователя, а это не всегда оправдано
Код: Выделить всё
CREATE VIEW oopt_areas AS select ST_Area(ST_Transform(geom, 32636))/10000 from oopt_pgn_all_wgs84
На стороне QGIS не катит, так как в этом случае все зависит пользователя, а это не всегда оправдано
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: автоматический расчет площадей полигонов средствами Post
зачем?Как сослаться в основной таблице на представление?
-
- Интересующийся
- Сообщения: 31
- Зарегистрирован: 18 июл 2017, 12:26
- Репутация: 0
Re: автоматический расчет площадей полигонов средствами Post
Я же говорил, что ничего круче екселя не видал, но задача стоит... поэтому и сформулировать не могу толком.
Как сделать так, чтоб в поле map_area таблицы oopt_pgn_all_wgs84 оказалось значение из представления oopt_areas?
Как сделать так, чтоб в поле map_area таблицы oopt_pgn_all_wgs84 оказалось значение из представления oopt_areas?
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: автоматический расчет площадей полигонов средствами Post
триггеры, но я не уверен, что это нужноКак сделать так, чтоб в поле map_area таблицы oopt_pgn_all_wgs84 оказалось значение из представления oopt_areas?
-
- Интересующийся
- Сообщения: 31
- Зарегистрирован: 18 июл 2017, 12:26
- Репутация: 0
Re: автоматический расчет площадей полигонов средствами Post
Попробовал
теперь все полигоны имеют площадь 450.123219280483)))
Явно что-то не так делаю
Код: Выделить всё
UPDATE oopt_pgn_all_wgs84
SET map_area = area
FROM oopt_areas;
Явно что-то не так делаю
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: автоматический расчет площадей полигонов средствами Post
добавь в представление ключ из сходной таблицы, а потом join
и я бы советовал изучить теорию Реляционных баз данных
и я бы советовал изучить теорию Реляционных баз данных
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: автоматический расчет площадей полигонов средствами Post
Рабочий пример триггера, который использует созданную функцию для расчёта площади:
Имена таблиц и полей надо заменить соответственно.
Код: Выделить всё
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();
Редактор материалов, модератор форума
-
- Интересующийся
- Сообщения: 31
- Зарегистрирован: 18 июл 2017, 12:26
- Репутация: 0
Re: автоматический расчет площадей полигонов средствами Post
стало еще непонятнее...trir писал(а):добавь в представление ключ из сходной таблицы, а потом join
Бесспорно, знание теории помогает в практике. Только вот тут "быстренько" не получится, а это не основная моя работа, точнее обязанность, поэтому времени на обучение никто и не дает))) Надо чтоб работало!
Честно говоря, не ожидал что задача по вычислению площади окажется настолько сложной в реализации
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: автоматический расчет площадей полигонов средствами Post
да как бы в пол пинка делается... при знании основ
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость