Postgis - екструдування багатокутника


11

Я хочу видавити форму багатокутника в постгітах, щоб створити псевдо 3D ефект. З цією метою я написав грубу функцію для її досягнення. Це дуже багато тестового коду, і він створює нову вершину Y для кожної точки на полігоні, а потім закриває її, повертаючись до початкової точки: -

CREATE OR REPLACE FUNCTION public.extrude_polygon(wkb_geometry_param geometry, height integer, simplify boolean DEFAULT false)
  RETURNS geometry AS
 $BODY$
DECLARE
f int;
ret_geom geometry;
wkb_geometry geometry;
BEGIN

--convert polygon to linestring
IF ST_GeometryType(wkb_geometry_param) != 'ST_Polygon' THEN 
    RETURN NULL;
END IF;

IF simplify THEN
    wkb_geometry =         ST_Simplify(ST_Transform(ST_Exteriorring(wkb_geometry_param), 27700), 0.5);
ELSE
wkb_geometry = ST_Transform(ST_Exteriorring(wkb_geometry_param), 27700);
END IF;

--initialise output geometry
ret_geom =ST_MakeLine(ST_PointN(wkb_geometry,1),ST_PointN(wkb_geometry,1));

--Move first point to up

SELECT ST_AddPoint(ret_geom,
      ST_MakePoint(ST_X(ST_PointN(wkb_geometry, 1)), 
                   ST_Y(ST_PointN(wkb_geometry, 1)) + height)
) into ret_geom;

FOR f IN 1..ST_NPoints(wkb_geometry) LOOP
    IF f < ST_NPoints(wkb_geometry) THEN
    --across to next high point
    SELECT ST_AddPoint(ret_geom,
               ST_MakePoint(ST_X(ST_PointN(wkb_geometry, f + 1)), 
               ST_Y(ST_PointN(wkb_geometry, f + 1)) + height)
    ) into ret_geom;
    --down to next point
    SELECT ST_AddPoint(ret_geom, ST_PointN(wkb_geometry,f + 1)) into ret_geom;
    --back to last point
    SELECT  ST_AddPoint(ret_geom, ST_PointN(wkb_geometry,f)) into ret_geom;
    --back then up again
    SELECT ST_AddPoint(ret_geom, ST_PointN(wkb_geometry,f + 1)) into ret_geom;
    SELECT ST_AddPoint(ret_geom,
               ST_MakePoint(ST_X(ST_PointN(wkb_geometry, f + 1)), 
               ST_Y(ST_PointN(wkb_geometry, f + 1)) + height)
    ) into ret_geom;
ELSE
    --across to first high point
    SELECT ST_AddPoint(ret_geom,
               ST_MakePoint(ST_X(ST_PointN(wkb_geometry, 1)), 
               ST_Y(ST_PointN(wkb_geometry, 1)) + height)
           ) into ret_geom;

    SELECT ST_AddPoint(ret_geom, ST_PointN(wkb_geometry,1)) into ret_geom;

END IF;
END LOOP;

RETURN ST_Buffer(ST_Buffer(ST_MakePolygon(ret_geom),10), -10);


END;

$BODY$
  LANGUAGE plpgsql

Він працює з простими багатокутниками, але має проблеми з внутрішніми кільцями, але головне питання в тому, що це дійсно повільно. Мені потрібно вивести отриману форму у вигляді багатокутника, який можна заштрихувати та винести на картографічний сервер. Отже, операції з буфером в кінці, що є єдиним способом, який я знаю, щоб зменшити форму до її контуру.

Кінцевим результатом стане екструдована форма, що представляє оригінальний багатокутник. Тоді я можу змістити оригінальний багатокутник на ту саму відстань екструзії і розмістити його зверху, щоб зробити дах. введіть тут опис зображення

Я розглядав можливість використання функції ST_Extrude в postgis-2.1.1, Але це створює тип ST_PolyteadSurface, і я не в змозі відобразити його в Mapserver. Наскільки я можу сказати, немає ніякого способу створити контур цього, оскільки ST_Buffer не працює з ST_polyhedsurface.

Отже, моє запитання: чи можна покращити мою функцію? Або є кращий підхід. Вихід повинен виглядати відповідно до діаграми, яку я створив, розмістивши зміщений багатокутник на мою екструдовану форму.


Чудове запитання! Можливо, ви могли б вивести свої дані у вигляді KML для більшої зручності та гнучкості за допомогою екструзії? Ось кілька вихідних моментів: postgis.net/docs/ST_AsKML.html , code.google.com/p/postexperiment/wiki/… , gdal.org/drv_libkml.html
Brent Edwards

Відповіді:


3

Швидке рішення для дуже простих багатокутників, таких як кола. Результати у двох різних таблицях, які мають бути відображені в правильному напрямку.

-Таблиця polyз вхідними багатокутниками

-Таблиця poly_prjз багатокутником від проектованих точок

WITH points AS (
  SELECT (ST_DumpPoints(geom)).geom AS geom 
FROM poly
  SELECT 
    ST_MakePolygon(
      ST_MakeLine(
        ST_Project(geom, 5000, radians(0.0))::geometry)) AS geom 
  FROM points;

-Таблиця cvxз опуклим корпусом з 2-х ознак.

Стіл poly_prjповинен бути зверху cvx.

Після цього ви можете грати з новими параметрами заповнення в QGIS 2.10!

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.