Присвоение атрибуту точки значения в зависимости от района

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
Sviazist
Новоприбывший
Сообщения: 14
Зарегистрирован: 11 мар 2015, 07:41
Репутация: 0

Присвоение атрибуту точки значения в зависимости от района

Сообщение Sviazist » 29 май 2015, 06:21

Всем доброго дня. Ещё один чайниковский вопрос по qgis. На карте города имеется слой полигонов - районы. Не административные, а понятные для внутреннего пользования - микрорайоны, жилмассивы и т.п., т.е. нанесённые вручную. У каждого района есть свой "gid" - поле-идентификатор для определения в базе данных, а также различные произвольные данные - название, примечание. Требуется, чтобы при нанесении на карту точки - узла связи или муфты, для этого точечного объекта атрибуту "location" автоматически присваивалось значение идентификатора gid того района, в который эта точка попадает. На данный момент это значение приходится вводить руками. Это программа-минимум. Совсем хорошо было бы, если бы это значение менялось автоматически при перемещении точечного объекта (узла или муфты) в другой район либо при изменении границ самого района, разбиении района на несколько, добавлении нового района и т.д., т.е. чтобы редактирование слоя районов влекло за собой автоматическое переопределение принадлежности узлов и муфт к тому или иному району. Данные слоёв хранятся в базе данных PostGIS, так что если есть возможность реализовать это через триггеры и функции PostGIS, то это будет тоже удовлетворительным решением поставленной задачи. То есть по сути задача сводится к определению принадлежности точки полигону, но как это сделать средствами qgis или postgis так, чтобы автоматически изменялось значение атрибута для рассматриваемой точки, я как-то не нашёл. Заранее спасибо.

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

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение trir » 29 май 2015, 06:47

ST_Contains, CREATE TRIGGER
А если вы хотите, что бы вам просто написали эти триггерры и функции, то вам скорее сюда...

Sviazist
Новоприбывший
Сообщения: 14
Зарегистрирован: 11 мар 2015, 07:41
Репутация: 0

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение Sviazist » 29 май 2015, 07:41

Большое спасибо. Так и знал, что всё просто до безобразия, мне нужна именно эта функция. Но гугл по моему вопросу выдавал только какие-то трёхэтажные замудрённые инструкции, и все совершенно не по теме. Мне нужно было знать, как сложить два плюс два, а вместо этого я получал лекции по дифференциальным уравнениям второго порядка. Или ссылки на модули к кугису, которые выполняли какие угодно замудрённые топологические вычисления, но не то простое, которое требовалось мне.

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

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение trir » 29 май 2015, 07:58

Почитайте, в PostGIS только названия команд немножко отличается...

Sviazist
Новоприбывший
Сообщения: 14
Зарегистрирован: 11 мар 2015, 07:41
Репутация: 0

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение Sviazist » 01 июн 2015, 06:14

У меня заработало, как требуется, с функцией, которую указал trir. Я включил этот признак в триггер postgresql, и получил желаемый результат. Ещё раз спасибо.

kirill_62
Участник
Сообщения: 90
Зарегистрирован: 08 авг 2013, 11:12
Репутация: 2

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение kirill_62 » 01 июн 2015, 09:51

Подскажите, как Вы решили проблему, а то что то я совсем дурачек в том. Может пример пришлете, что бы как "костыль" использовать

Sviazist
Новоприбывший
Сообщения: 14
Зарегистрирован: 11 мар 2015, 07:41
Репутация: 0

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение Sviazist » 02 июн 2015, 07:34

Хм, не думал, что кто-то будет обращаться за советом ко мне, чайнику чайниковскому. Всё реализовал через триггеры БД PostgreSQL, ибо она есть ядро всей разрабатываемой системы, к которому уже обращаются пользователи различными средствами - через qgis и через веб-интерфейс на php. Поэтому по возможности все глобальные вычисления и зависимости объектов друг от друга нужно засунуть в базу. Создаём триггер: при редактировании района (изменение границ, как правило) либо при добавлении нового района на карту всем узлам, попадающим в этот район, заносится номер этого района в соответствующее поле. Код функции:

BEGIN
UPDATE qgis.nodes
SET location = NEW.gid
WHERE ST_Contains(NEW.geom, nodes.geom);
RETURN NULL;
END;

Аналогично, если мы добавляем на карту новый узел, либо если мы перемещаем узел по карте, требуется проверить, в какой район он попадёт в итоге, и в соответствующее поле точечного объекта "узел" занести номер района, в котором этот узел окажется после редактирования. Создаём триггер на редактирование или добавление для таблицы узлов. Код функции:

BEGIN
if NEW.location <> (SELECT gid
FROM qgis.locations
WHERE ST_Contains(locations.geom, NEW.geom))
then
UPDATE qgis.nodes
SET location = (SELECT gid
FROM qgis.locations
WHERE ST_Contains(locations.geom, NEW.geom))
WHERE gid = NEW.gid;
end if;
RETURN NULL;
END;

Условие после if проверяет, не имеет ли поле "район" уже правильного значения, и если это так, то дальнейшего редактирования этого поля не происходит. Без этой проверки триггер срабатывал бесконечное количество раз вне зависимости от того, создавал я его с условием AFTER или с условием BEFORE.

Триггеры работают корректно: при изменении границ районов все вновь попавшие внутрь узлы получают нужное значение района, при добавлении нового района аналогично. Удаление района с оставлением пустого места не тестил, т.к. данная операция не должна использоваться в принципе: вся площадь карты, не попадающая в какой-либо район, занята районом с названием "район не указан", на слой районов установлено предотвращение пересечения полигонов и топологическое редактирование, и таким образом площади, не занятой никаким районом, равно как и площади, занятой несколькими районами сразу, на карте нет. За не появлением белых пятен можно следить вручную, т.к. слой районов редактировать буду только я и очень редко.

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

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение trir » 02 июн 2015, 09:13

Хм, не думал, что кто-то будет обращаться за советом ко мне, чайнику чайниковскому.
Я же отвечаю, а в PostGIS не работаю (делал подобное в MS SQL Server)

Sviazist
Новоприбывший
Сообщения: 14
Зарегистрирован: 11 мар 2015, 07:41
Репутация: 0

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение Sviazist » 02 июн 2015, 12:19

Вам спасибо, а решение я расписал Кириллу, его вопрос выше.

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

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение trir » 02 июн 2015, 12:41

Молодец, Sviazist, теперь можешь статью написать :wink:
Просто, что бы развёрнуто ответить на этот вопрос, нужно проделать довольно много подготовительной работы (тот же пример изготовить) и этот объём тянет на статью, а у тебя уже всё "под рукой"...
вот и молчат профи - лень...

Sviazist
Новоприбывший
Сообщения: 14
Зарегистрирован: 11 мар 2015, 07:41
Репутация: 0

Re: Присвоение атрибуту точки значения в зависимости от райо

Сообщение Sviazist » 03 июн 2015, 05:27

Если это окажется кому-нибудь полезным, то почему бы и нет. Всяких инструкций на замудрённые темы пруд пруди, а разжёвывания простых функций и задач для новичков днём с огнём не сыщешь.

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя