Страница 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
Анна Горева
:D Получила адекватный результат!
Перелагаемые вами выше запросы скорее всего рабочие, но скорость та же... не дождалась результата.
Но вот за идею использования 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';