Postgis - mengusir poligon

11

Saya ingin mengusir bentuk poligon di postgis untuk membuat efek 3D semu. Untuk tujuan ini saya telah menulis fungsi kasar untuk mencapainya. Ini adalah kode uji yang sangat banyak dan menciptakan simpul Y baru untuk setiap titik pada poligon dan kemudian menutupnya dengan kembali ke titik semula: -

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

Ini bekerja dengan poligon sederhana tetapi memiliki masalah dengan cincin interior, tetapi masalah utamanya adalah sangat lambat. Saya perlu menampilkan bentuk yang dihasilkan sebagai poligon yang dapat diarsir dan ditampilkan di mapserver. Karenanya operasi buffer pada akhirnya yang merupakan satu-satunya cara saya tahu untuk mengurangi bentuk ke garis itu.

Hasil akhirnya akan menjadi bentuk yang diekstrusi mewakili poligon asli. Saya kemudian dapat mengimbangi poligon asli dengan jarak ekstrusi yang sama dan meletakkannya di atas untuk membuat atap. masukkan deskripsi gambar di sini

Saya mempertimbangkan untuk menggunakan fungsi ST_Extrude di postgis-2.1.1 TETAPI ini menciptakan tipe ST_PolyhedralSurface dan saya tidak dapat merendernya di mapserver. Sejauh yang saya tahu tidak ada cara untuk membuat garis besar ini baik sebagai ST_Buffer tidak bekerja dengan ST_polyhedralsurfaces.

Jadi, pertanyaan saya adalah, bisakah fungsi saya ditingkatkan? Atau ada pendekatan yang lebih baik. Output perlu terlihat sesuai diagram yang saya buat dengan menempatkan poligon offset ke bentuk saya yang diekstrusi.

pengguna1331131
sumber
Pertanyaan bagus! Mungkin Anda bisa menampilkan data Anda sebagai KML untuk kemudahan dan fleksibilitas yang lebih besar dengan ekstrusi Anda? Berikut adalah beberapa poin awal: postgis.net/docs/ST_AsKML.html , code.google.com/p/postexperiments/wiki/… , gdal.org/drv_libkml.html
Brent Edwards

Jawaban:

3

Solusi cepat untuk poligon yang sangat sederhana seperti lingkaran. Hasil dalam 2 tabel berbeda yang harus dirender ke arah yang benar.

-Tabel polydengan input poligon

-Tabel poly_prjdengan poligon dari titik proyeksi

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;

-Tabel cvxdengan lambung cembung dari 2 fitur.

Meja poly_prjharus di atas meja cvx.

Setelah itu Anda dapat bermain dengan opsi isian baru di QGIS 2.10!

masukkan deskripsi gambar di sini

Stefan
sumber