Страница 1 из 1
Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 13:03
Анна Горева
Есть задача: найти пересечение трассы и муниципального образования, из полученного пересечения вырезать пересечение с кадастровыми земельными участками.
Я попробовала реализовать такую задачу с помощью 1 запроса:
1 вариант - Сначала из муниципального образования вырезаются кадастровые земельные участки. Потом ищется пересечение полученного результата с трассой.
Код: Выделить всё
SELECT
ST_PolygonFromText(ST_AsText(st_intersection(st_difference(bb.geom_local, cc.geom_local), aa.geom_buff_local)))
FROM
obj_contour as aa,
munic_obr as bb,
rosreestr_obj as cc;
2 вариант - Сначала ищется пересечение трассы и муниципального образования. Потом из результата вырезаются кадастровые земельные участки.
Код: Выделить всё
SELECT
ST_PolygonFromText(ST_AsText(st_difference(st_intersection(aa.geom_buff_local, bb.geom_local), cc.geom_local)))
FROM
obj_contour as aa,
munic_obr as bb,
rosreestr_obj as cc;
Ошибки в синтаксисе отсутствуют. Запускаю запрос.... и жду больше часа, когда запрос выполниться. В результате не дождалась и принудительно прекратила работу (даже если запрос бы сработал рано или поздно, такая скорость его обработки меня не устраивает). Возможность создания временной/промежуточной таблицы не рассматривается.
Продвинутые юзеры помогите решить такую, казалось бы, не сложную задачу!!!
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 13:06
Александр Мурый
Индексы для таблиц с полигонами построены?
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 13:16
trir
а сколько выполняются запросы по отдельности?
может стоит сделать вложеные запросы?
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 13:20
Анна Горева
Индексы для таблиц с полигонами построены?
"Точно не знаю. Не моя БД. Уточню" - Уточнила! у полей geom нет индексов
а сколько выполняются запросы по отдельности?
По отдельности можно сказать мгновенно (6 секунд).
может стоит сделать вложеные запросы?
Подскажите как? Именно поэтому и задала вопрос на форуме
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 13:33
trir
как то так
Код: Выделить всё
SELECT st_intersection(tbl1.geom, aa.geom_buff_local)
from
(SELECT st_difference(bb.geom_local, cc.geom_local) as geom from munic_obr as bb, rosreestr_obj as cc) as tbl1,
obj_contour as aa
ST_PolygonFromText(ST_AsText - это зачем?
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 13:47
Анна Горева
ST_PolygonFromText(ST_AsText - это зачем?
И правда незачем)) чтобы "наверняка" написала
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 14:03
Ariki
А сколько строк в каждой из таблиц? CROSS JOIN трёх таблиц без дополнительных условий выглядит очень подозрительно, и мало шансов, что он выполнится за разумное время. Тут нужно ограничивать выборки объектов, участвующих в геометрических операциях, а не пытаться пересечь объекты во всех комбинациях.
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 14:13
Анна Горева
munic_obr - 2 контура
rosreestr_obj - порядка 100 тысяч контуров
obj_contour - 1 контур (пока один контур хранится. Если будет два и больше контуров, то WHERE obj_contour.id=1)
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 22 ноя 2017, 16:29
Анна Горева
Александр Мурый писал(а): ↑22 ноя 2017, 13:06
Индексы для таблиц с полигонами построены?
Пытаюсь создать индекс для геометрических полей...
Код: Выделить всё
CREATE INDEX rosreestr_GEOM_INDEX ON rosreestr_obj USING GIST ( geom_local );
Выдает ошибку "[Err] ОШИБКА: ошибка синтаксиса (примерное положение: "INDEX")"
Я ошибку проигнорировала и вроде индексы создались. Но быстрее от этого не стало..
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 23 ноя 2017, 01:18
Ariki
Если выдал синтаксическую ошибку, то запрос не был выполнен. Хотя синтаксис вроде верный. Попытайтесь ещё раз: может, от предыдущей команды в консоли мусор остался?
Для решения вашей задачи попробуйте такой запрос:
Код: Выделить всё
SELECT ST_Difference(
ST_Intersection(
m.geom_local,
(
SELECT ST_Union(c.geom_buff_local)
FROM obj_contour c
WHERE ST_Intersects(c.geom_buff_local, m.geom_local)
)
),
(
SELECT ST_Union(r.geom_local)
FROM rosreestr_obj r
WHERE ST_Intersects(r.geom_local, m.geom_local)
)
) geom_diff
FROM munic_obr m;
Re: Пространственные запросы в PostgreSQL с помощью встроенных функций PostGIS
Добавлено: 23 ноя 2017, 10:56
Анна Горева

Получила адекватный результат!
Перелагаемые вами выше запросы скорее всего рабочие, но скорость та же... не дождалась результата.
Но вот за идею использования ST_UNION спасибо!
В итоге реализация такая:
1. Найти пересечение трассы и кадастровых земельных участков. Записать результат в БД в таблицу "intersection_obj".
2. Найти пересечение трассы и МО, и уже из этого вырезать контура из таблицы "intersection_obj" (предварительно их объединить) - скорость запроса 0.2 с!!! Записать результат в БД в таблицу "intersection_obj".
Код: Выделить всё
SELECT
st_intersection(aa.geom_buff_local, st_difference(bb.geom_local, tbl1.geom_inter)) as geom
FROM
obj_contour as aa,
munic_obr as bb,
(SELECT
st_union(cc.geom_local) as geom_inter
FROM
intersection_obj as cc
WHERE
cc.obj_contour_id='1') as tbl1
WHERE
aa."id" = '1';