Разрабатывая некоторое программное обеспечение, сделали следующее решение в обработке пространственных запросов, а точнее создали PL/PG SQL функцию, которая выполняет отсечение из полигона, всех полигонов имеющих более высокий приоритет (чем меньше значение приоритета тем он выше:) и принадлежащих одному тарифу.

Необходимо из синего полигона, вычесть зеленый, чтобы маршрут был только в одном полигоне.

CREATE OR REPLACE FUNCTION mdiff(pid UUID) RETURNS GEOGRAPHY AS $$ DECLARE mgeo GEOMETRY; mpriority REAL; mtariff UUID; pgeo GEOMETRY; BEGIN mgeo := (SELECT geo::GEOMETRY FROM pricing WHERE id = pid); mpriority := (SELECT priority FROM pricing WHERE id = pid); mtariff := (SELECT tariff FROM pricing WHERE id = pid); FOR pgeo IN ( SELECT geo::GEOMETRY FROM pricing WHERE tariff=mtariff AND priority < mpriority ORDER BY priority) LOOP mgeo := ST_Difference(mgeo,pgeo); END LOOP; RETURN mgeo::GEOGRAPHY; END $$ LANGUAGE plpgsql;
Для работы необходимы PostgreSQL и расширения к нему PostGIS и uuid-ossp
Функция не может делать "бублики".
Вы должны авторизоваться чтобы опубликовать комментарий.