Postgis-다각형 돌출


11

의사 3D 효과를 만들기 위해 postgis에서 다각형 모양을 돌출시키고 싶습니다. 이를 위해 나는 그것을 달성하기 위해 조잡한 기능을 작성했습니다. 이것은 매우 많은 테스트 코드이며 다각형의 각 점에 대해 새로운 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

간단한 다각형에서는 작동하지만 내부 링에는 문제가 있지만 주된 문제는 실제로 느리다는 것입니다. 결과 모양을 맵 서버에서 음영 처리 및 렌더링 할 수있는 다각형으로 출력해야합니다. 따라서 버퍼 동작은 끝에서 모양을 윤곽선으로 줄이는 유일한 방법입니다.

최종 결과는 원래 다각형을 나타내는 돌출 된 모양입니다. 그런 다음 원래 폴리곤을 동일한 돌출 거리만큼 간격 띄우고 상단에 배치하여 지붕을 만들 수 있습니다. 여기에 이미지 설명을 입력하십시오

postgis-2.1.1에서 ST_Extrude 함수를 사용하는 것을 고려했지만 ST_PolyhedralSurface 유형을 생성하고 맵 서버에서 렌더링 할 수 없습니다. 내가 알 수있는 한 ST_Buffer가 ST_polyhedralsurfaces에서 작동하지 않기 때문에 이것의 개요를 만들 수있는 방법이 없습니다.

제 질문은 제 기능을 향상시킬 수 있습니까? 아니면 더 나은 접근 방식이 있습니까? 출력은 돌출 다각형에 오프셋 다각형을 배치하여 생성 한 다이어그램에 따라 표시되어야합니다.


좋은 질문입니다! 압출 성형의 편의성과 유연성을 위해 데이터를 KML로 출력 할 수 있습니까? 시작점은 다음과 같습니다. postgis.net/docs/ST_AsKML.html , code.google.com/p/postexperiments/wiki/… , gdal.org/drv_libkml.html
Brent Edwards

답변:


3

원과 같은 매우 간단한 다각형을위한 빠른 솔루션입니다. 올바른 방향으로 렌더링해야하는 2 개의 서로 다른 테이블이 생성됩니다.

- 테이블 poly입력 다각형과 (S)

- 테이블 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_prj은 테이블 위에 있어야합니다 cvx.

그 후 QGIS 2.10의 새로운 채우기 옵션을 사용할 수 있습니다!

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.