Присвоение атрибуту точки значения в зависимости от района
-
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 11 мар 2015, 07:41
- Репутация: 0
Присвоение атрибуту точки значения в зависимости от района
Всем доброго дня. Ещё один чайниковский вопрос по qgis. На карте города имеется слой полигонов - районы. Не административные, а понятные для внутреннего пользования - микрорайоны, жилмассивы и т.п., т.е. нанесённые вручную. У каждого района есть свой "gid" - поле-идентификатор для определения в базе данных, а также различные произвольные данные - название, примечание. Требуется, чтобы при нанесении на карту точки - узла связи или муфты, для этого точечного объекта атрибуту "location" автоматически присваивалось значение идентификатора gid того района, в который эта точка попадает. На данный момент это значение приходится вводить руками. Это программа-минимум. Совсем хорошо было бы, если бы это значение менялось автоматически при перемещении точечного объекта (узла или муфты) в другой район либо при изменении границ самого района, разбиении района на несколько, добавлении нового района и т.д., т.е. чтобы редактирование слоя районов влекло за собой автоматическое переопределение принадлежности узлов и муфт к тому или иному району. Данные слоёв хранятся в базе данных PostGIS, так что если есть возможность реализовать это через триггеры и функции PostGIS, то это будет тоже удовлетворительным решением поставленной задачи. То есть по сути задача сводится к определению принадлежности точки полигону, но как это сделать средствами qgis или postgis так, чтобы автоматически изменялось значение атрибута для рассматриваемой точки, я как-то не нашёл. Заранее спасибо.
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Присвоение атрибуту точки значения в зависимости от райо
ST_Contains, CREATE TRIGGER
А если вы хотите, что бы вам просто написали эти триггерры и функции, то вам скорее сюда...
А если вы хотите, что бы вам просто написали эти триггерры и функции, то вам скорее сюда...
-
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 11 мар 2015, 07:41
- Репутация: 0
Re: Присвоение атрибуту точки значения в зависимости от райо
Большое спасибо. Так и знал, что всё просто до безобразия, мне нужна именно эта функция. Но гугл по моему вопросу выдавал только какие-то трёхэтажные замудрённые инструкции, и все совершенно не по теме. Мне нужно было знать, как сложить два плюс два, а вместо этого я получал лекции по дифференциальным уравнениям второго порядка. Или ссылки на модули к кугису, которые выполняли какие угодно замудрённые топологические вычисления, но не то простое, которое требовалось мне.
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Присвоение атрибуту точки значения в зависимости от райо
Почитайте, в PostGIS только названия команд немножко отличается...
-
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 11 мар 2015, 07:41
- Репутация: 0
Re: Присвоение атрибуту точки значения в зависимости от райо
У меня заработало, как требуется, с функцией, которую указал trir. Я включил этот признак в триггер postgresql, и получил желаемый результат. Ещё раз спасибо.
-
- Участник
- Сообщения: 90
- Зарегистрирован: 08 авг 2013, 11:12
- Репутация: 2
Re: Присвоение атрибуту точки значения в зависимости от райо
Подскажите, как Вы решили проблему, а то что то я совсем дурачек в том. Может пример пришлете, что бы как "костыль" использовать
-
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 11 мар 2015, 07:41
- Репутация: 0
Re: Присвоение атрибуту точки значения в зависимости от райо
Хм, не думал, что кто-то будет обращаться за советом ко мне, чайнику чайниковскому. Всё реализовал через триггеры БД 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.
Триггеры работают корректно: при изменении границ районов все вновь попавшие внутрь узлы получают нужное значение района, при добавлении нового района аналогично. Удаление района с оставлением пустого места не тестил, т.к. данная операция не должна использоваться в принципе: вся площадь карты, не попадающая в какой-либо район, занята районом с названием "район не указан", на слой районов установлено предотвращение пересечения полигонов и топологическое редактирование, и таким образом площади, не занятой никаким районом, равно как и площади, занятой несколькими районами сразу, на карте нет. За не появлением белых пятен можно следить вручную, т.к. слой районов редактировать буду только я и очень редко.
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.
Триггеры работают корректно: при изменении границ районов все вновь попавшие внутрь узлы получают нужное значение района, при добавлении нового района аналогично. Удаление района с оставлением пустого места не тестил, т.к. данная операция не должна использоваться в принципе: вся площадь карты, не попадающая в какой-либо район, занята районом с названием "район не указан", на слой районов установлено предотвращение пересечения полигонов и топологическое редактирование, и таким образом площади, не занятой никаким районом, равно как и площади, занятой несколькими районами сразу, на карте нет. За не появлением белых пятен можно следить вручную, т.к. слой районов редактировать буду только я и очень редко.
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Присвоение атрибуту точки значения в зависимости от райо
Я же отвечаю, а в PostGIS не работаю (делал подобное в MS SQL Server)Хм, не думал, что кто-то будет обращаться за советом ко мне, чайнику чайниковскому.
-
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 11 мар 2015, 07:41
- Репутация: 0
Re: Присвоение атрибуту точки значения в зависимости от райо
Вам спасибо, а решение я расписал Кириллу, его вопрос выше.
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Присвоение атрибуту точки значения в зависимости от райо
Молодец, Sviazist, теперь можешь статью написать
Просто, что бы развёрнуто ответить на этот вопрос, нужно проделать довольно много подготовительной работы (тот же пример изготовить) и этот объём тянет на статью, а у тебя уже всё "под рукой"...
вот и молчат профи - лень...

Просто, что бы развёрнуто ответить на этот вопрос, нужно проделать довольно много подготовительной работы (тот же пример изготовить) и этот объём тянет на статью, а у тебя уже всё "под рукой"...
вот и молчат профи - лень...
-
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 11 мар 2015, 07:41
- Репутация: 0
Re: Присвоение атрибуту точки значения в зависимости от райо
Если это окажется кому-нибудь полезным, то почему бы и нет. Всяких инструкций на замудрённые темы пруд пруди, а разжёвывания простых функций и задач для новичков днём с огнём не сыщешь.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя