Пространственный запрос

Разрабатывая некоторое программное обеспечение, сделали следующее решение в обработке пространственных запросов, а точнее создали 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

Функция не может делать «бублики«.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.