Postgis - ขับไล่รูปหลายเหลี่ยม


11

ฉันต้องการขับไล่รูปหลายเหลี่ยมใน postgis เพื่อสร้างเอฟเฟกต์หลอก 3 มิติ ด้วยเหตุนี้ฉันได้เขียนฟังก์ชั่นน้ำมันดิบเพื่อให้บรรลุมัน นี่คือรหัสทดสอบจำนวนมากและสร้างจุดยอด 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

มันใช้งานได้กับรูปหลายเหลี่ยมอย่างง่าย แต่มีปัญหากับวงแหวนภายใน แต่ปัญหาหลักคือมันช้ามาก ฉันต้องการส่งออกรูปร่างผลลัพธ์เป็นรูปหลายเหลี่ยมที่สามารถแรเงาและแสดงผลใน mapserver ดังนั้นการทำงานของบัฟเฟอร์ในตอนท้ายซึ่งเป็นวิธีเดียวที่ฉันรู้ในการลดรูปร่างลงในโครงร่าง

ผลลัพธ์ที่ได้จะเป็นรูปทรงที่แสดงถึงรูปหลายเหลี่ยมต้นฉบับ ฉันสามารถชดเชยรูปหลายเหลี่ยมต้นฉบับด้วยระยะการอัดรีดที่เท่ากันและวางไว้บนสุดเพื่อสร้างหลังคา ป้อนคำอธิบายรูปภาพที่นี่

ฉันถือว่าใช้ฟังก์ชัน ST_Extrude ใน postgis-2.1.1 แต่สิ่งนี้สร้างประเภท ST_PolyhedralSurface และฉันไม่สามารถแสดงผลใน mapserver ได้ เท่าที่ฉันสามารถบอกได้ว่าไม่มีวิธีในการสร้างโครงร่างของเรื่องนี้เพราะ ST_Buffer ไม่ทำงานกับ ST_polyhedralsurfaces

ดังนั้นคำถามของฉันคือฟังก์ชั่นของฉันสามารถปรับปรุงได้หรือไม่? หรือมีวิธีการที่ดีกว่า ผลลัพธ์ต้องดูตามแผนภาพที่ฉันสร้างขึ้นโดยวางรูปหลายเหลี่ยมออฟเซ็ตลงบนรูปร่างที่ถูกอัด


เป็นคำถามที่ดีมาก! บางทีคุณสามารถส่งออกข้อมูลเป็น KML เพื่อความสะดวกและความยืดหยุ่นมากขึ้นในการอัดขึ้นรูปของคุณ? : ที่นี่บางจุดเริ่มต้นมีpostgis.net/docs/ST_AsKML.html , code.google.com/p/postexperiments/wiki/... , gdal.org/drv_libkml.html
เบรนท์เอ็ดเวิร์ด

คำตอบ:


3

วิธีแก้ปัญหาที่รวดเร็วสำหรับรูปหลายเหลี่ยมอย่างง่ายเช่นวงกลม ให้ผลลัพธ์ใน 2 ตารางที่แตกต่างกันซึ่งจะต้องมีการแสดงผลในทิศทางที่ถูกต้อง

- ตารางที่polyมีรูปหลายเหลี่ยมอินพุต

-Table 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_prjcvx

หลังจากนั้นคุณสามารถเล่นกับตัวเลือกการเติมใหม่ใน QGIS 2.10!

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.