Postgis - bir çokgeni ekstrüde edin


11

Sahte bir 3D efekti oluşturmak için postgis bir çokgen şekli ekstrüde etmek istiyorum. Bu amaçla, bunu başarmak için kaba bir işlev yazdım. Bu çok fazla test kodudur ve çokgendeki her nokta için yeni bir Y köşesi oluşturur ve ardından orijinal noktaya dönerek kapatır:

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

Basit çokgenlerle çalışır, ancak iç halkalarla ilgili problemleri vardır, ancak asıl mesele gerçekten yavaş olmasıdır. Ortaya çıkan şekli gölgeli ve mapserver içinde render edilebilir bir çokgen olarak çıktı gerekiyor. Bu yüzden sonunda tampon işlemi, şeklini ana hatlarına indirgemenin tek yoludur.

Sonuç, orijinal çokgeni temsil eden ekstrüde edilmiş bir şekil olacaktır. Daha sonra orijinal çokgeni aynı ekstrüzyon mesafesiyle dengeleyebilir ve çatıyı yapmak için üstüne yerleştirebilirim. resim açıklamasını buraya girin

Postgis-2.1.1 ST_Extrude işlevini kullanarak düşündüm ama bu bir ST_PolyhedralSurface türü oluşturur ve ben mapserver içinde render mümkün değil. Anlayabildiğim kadarıyla ST_Buffer ST_polyhedralsurfaces ile çalışmadığı için bunun bir anahat oluşturmak için bir yolu yoktur.

Benim sorum şu, fonksiyonum geliştirilebilir mi? Yoksa daha iyi bir yaklaşım var mı? Çıktı, ofset poligonu ekstrüde şeklim üzerine yerleştirerek oluşturduğum şemaya göre görünmelidir.


Harika bir soru! Belki ekstrüzyonunuzda daha fazla kolaylık ve esneklik için verilerinizi KML olarak çıkarabilirsiniz? İşte bazı başlangıç ​​noktaları: postgis.net/docs/ST_AsKML.html , code.google.com/p/postexperiments/wiki/… , gdal.org/drv_libkml.html
Brent Edwards

Yanıtlar:


3

Daireler gibi çok basit çokgenler için hızlı bir çözüm. Sonuç, doğru yönde görüntülenmesi gereken 2 farklı tablodur.

poly-Giriş çokgen (ler) i ile tablo

poly_prjYansıtılan noktalardan çokgen ile -Tablo

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;

cvx2 özellik dışbükey bir gövde ile -Tablo .

Masa poly_prjtablonun üstünde olmalıdır cvx.

Bundan sonra QGIS 2.10'daki yeni doldurma seçenekleriyle oynayabilirsiniz!

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.