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.
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.
sumber
Jawaban:
Solusi cepat untuk poligon yang sangat sederhana seperti lingkaran. Hasil dalam 2 tabel berbeda yang harus dirender ke arah yang benar.
-Tabel
poly
dengan input poligon-Tabel
poly_prj
dengan poligon dari titik proyeksi-Tabel
cvx
dengan lambung cembung dari 2 fitur.Meja
poly_prj
harus di atas mejacvx
.Setelah itu Anda dapat bermain dengan opsi isian baru di QGIS 2.10!
sumber