Данная функция насколько понимаю возвращает геометрию, то есть то что я уже получил.
Прошу прощения, но не совсем ясно, что мне с этим сделать...
в топике я процитировал фрагмент запроса, полностью представление формируется вот так:
Код: Выделить всё
CREATE OR REPLACE VIEW konakovskiy.crd AS
SELECT t3.id,
t3.geom,
t3.type,
t3.name,
t3.part,
t3.ring,
t3.subnum,
t3.x,
t3.y,
t2.delta,
t2.zu_kn
FROM ( SELECT ((t1.edge_id || (((t1.dp).path[2] - 1)::text)) || lpad((t1.dp).path[3]::text, 3, '0'::text))::integer AS id,
(t1.dp).geom AS geom,
t1.type,
t1.name,
t1.part,
(t1.dp).path[2] - 1 AS ring,
(t1.dp).path[3] AS subnum,
st_y((t1.dp).geom) AS x,
st_x((t1.dp).geom) AS y
FROM ( SELECT DISTINCT ON (zones_pgn.id, ((st_dumppoints(zones_pgn.geom)).geom)) zones_pgn.id AS edge_id,
zones_pgn.part,
zones_pgn.type,
zones_pgn.name,
st_dumppoints(zones_pgn.geom) AS dp
FROM konakovskiy.zones_pgn
ORDER BY zones_pgn.id, ((st_dumppoints(zones_pgn.geom)).geom), ((st_dumppoints(zones_pgn.geom)).path[3])) t1
ORDER BY (((t1.edge_id || (((t1.dp).path[2] - 1)::text)) || lpad((t1.dp).path[3]::text, 3, '0'::text))::integer)) t3
LEFT JOIN ( SELECT t1.id,
t1.geom,
round(st_y(t1.geom)::numeric, 2) AS x,
round(st_x(t1.geom)::numeric, 2) AS y,
t1.delta,
t1.zu_kn
FROM ( SELECT DISTINCT ON (pnt_from_kpt.geom) pnt_from_kpt.geom,
pnt_from_kpt.delta,
pnt_from_kpt.id,
pnt_from_kpt.kn AS zu_kn
FROM konakovskiy.pnt_from_kpt
WHERE pnt_from_kpt.delta > 0::numeric
ORDER BY pnt_from_kpt.geom, pnt_from_kpt.delta) t1
ORDER BY t1.id) t2 ON st_equals(t2.geom, t3.geom);
В результате получается вполне устраивающая меня таблица в которой есть координаты каждой точки, а в случае если эта точка присутствует в КПТ - указывается еще погрешность её определения и номер участка откуда оно взялось, плюс динамически меняется в случае, если я редактирую полигон, что важно.
Оно вроде и корявое, и вероятно его можно оптимизировать, но у меня там 8 полигонов и 600 точек... 260-280 msec в моих условиях совершенно не критично.
Была мысль для красоты определить углы в каждом из узлов и в зависимости от масштаба показывать только те, где угол отличается от 180 более чем на 30/45/60 градусов.