Postgis - đùn một đa giác


11

Tôi muốn đùn hình dạng đa giác trong postgis để tạo hiệu ứng giả 3D. Cuối cùng, tôi đã viết một hàm thô để đạt được nó. Đây là rất nhiều mã kiểm tra và nó tạo ra một đỉnh Y mới cho mỗi điểm trên đa giác và sau đó đóng nó bằng cách quay lại điểm ban đầu: -

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

Nó hoạt động với các đa giác đơn giản nhưng có vấn đề với vòng bên trong, nhưng vấn đề chính là nó thực sự chậm. Tôi cần xuất hình dạng kết quả dưới dạng đa giác có thể được tô bóng và hiển thị trong mapserver. Do đó, các hoạt động của bộ đệm ở cuối là cách duy nhất tôi biết để giảm hình dạng cho đường viền của nó.

Kết quả cuối cùng sẽ là một hình dạng đùn thể hiện đa giác ban đầu. Sau đó tôi có thể bù đa giác ban đầu bằng cùng khoảng cách đùn và đặt nó lên trên cùng để làm mái nhà. nhập mô tả hình ảnh ở đây

Tôi đã cân nhắc sử dụng hàm ST_Extrude trong postgis-2.1.1 NHƯNG điều này tạo ra một loại ST_PolyheccaSurface và tôi không thể kết xuất nó trong mapserver. Theo như tôi có thể nói, không có cách nào để tạo ra một phác thảo về điều này vì ST_Buffer không hoạt động với ST_polyhedralsurfaces.

Vì vậy, câu hỏi của tôi là, chức năng của tôi có thể được cải thiện? Hoặc là có một cách tiếp cận tốt hơn. Đầu ra cần phải nhìn theo sơ đồ mà tôi đã tạo bằng cách đặt đa giác bù vào hình dạng đùn của tôi.


Câu hỏi tuyệt vời! Có lẽ bạn có thể xuất dữ liệu của mình dưới dạng KML để dễ dàng và linh hoạt hơn với quá trình đùn của bạn? Dưới đây là một số điểm bắt đầu: postgis.net/docs/ST_AsKML.html , code.google.com/p/postexperiment/wiki/iêu , gdal.org/drv_libkml.html
Brent Edwards

Câu trả lời:


3

Một giải pháp nhanh chóng cho các đa giác rất đơn giản như vòng tròn. Kết quả trong 2 bảng khác nhau phải được hiển thị theo đúng hướng.

-Table polyvới đa giác đầu vào

-Table poly_prjvới đa giác từ các điểm được chiếu

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;

-Table cvxvới một thân lồi của 2 tính năng.

Bảng poly_prjphải ở trên cùng của bảng cvx.

Sau đó, bạn có thể chơi với các tùy chọn điền mới trong QGIS 2.10!

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.