Данная функция насколько понимаю возвращает геометрию, то есть то что я уже получил.
Прошу прощения, но не совсем ясно, что мне с этим сделать...
в топике я процитировал фрагмент запроса, полностью представление формируется вот так:
Код: Выделить всё
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 градусов.