재미있는 질문! 그것은 내가 직접 시도하고 싶었던 일이므로 갈 수 있습니다.
PostGRES / POSTGIS에서 다각형 세트를 생성하는 함수를 사용하여이 작업을 수행 할 수 있습니다.
필자의 경우 철도를 나타내는 하나의 기능 (MULTILINESTRING)이있는 테이블이 있습니다. 미터 단위로 CRS를 사용해야하며 osgb (27700)를 사용하고 있습니다. 4km x 2km '페이지'를 수행했습니다.
여기에서 결과를 볼 수 있습니다 ... 녹색 물건은 도로 네트워크이며, 철도 주변의 1km 버퍼에 클리핑되어 다각형의 높이에 잘 맞습니다.
기능은 다음과 같습니다.
CREATE OR REPLACE FUNCTION getAllPages(wid float, hite float, srid integer, overlap float) RETURNS SETOF geometry AS
$BODY$
DECLARE
page geometry; -- holds each page as it is generated
myline geometry; -- holds the line geometry
startpoint geometry;
endpoint geometry;
azimuth float; -- angle of rotation
curs float := 0.0 ; -- how far along line left edge is
step float;
stepnudge float;
currpoly geometry; -- used to make pages
currline geometry;
currangle float;
numpages float;
BEGIN
-- drop ST_LineMerge call if using LineString
-- replace this with your table.
SELECT ST_LineMerge(geom) INTO myline from traced_osgb;
numpages := ST_Length(myline)/wid;
step := 1.0/numpages;
stepnudge := (1.0-overlap) * step;
FOR r in 1..cast (numpages as integer)
LOOP
-- work out current line segment
startpoint := ST_SetSRID(ST_Line_Interpolate_Point(myline,curs),srid);
endpoint := ST_SetSRID(ST_Line_Interpolate_Point(myline,curs+step),srid);
currline := ST_SetSRID(ST_MakeLine(startpoint,endpoint),srid);
-- make a polygon of appropriate size at origin of CRS
currpoly := ST_SetSRID(ST_Extent(ST_MakeLine(ST_MakePoint(0.0,0.0),ST_MakePoint(wid,hite))),srid);
-- then nudge downwards so the midline matches the current line segment
currpoly := ST_Translate(currpoly,0.0,-hite/2.0);
-- Rotate to match angle
-- I have absolutely no idea how this bit works.
currangle := -ST_Azimuth(startpoint,endpoint) - (PI()/2.0) + PI();
currpoly := ST_Rotate(currpoly, currangle);
-- then move to start of current segment
currpoly := ST_Translate(currpoly,ST_X(startpoint),ST_Y(startpoint));
page := currpoly;
RETURN NEXT page as geom; -- yield next result
curs := curs + stepnudge;
END LOOP;
RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;
이 기능 사용
다음은 예입니다. 4km x 2km 페이지, epsg : 27700 및 10 % 겹침
select st_asEwkt(getallpages) from getAllPages(4000.0, 2000.0, 27700, 0.1);
이것을 실행 한 후 PgAdminIII에서 csv 파일로 내보낼 수 있습니다. 이것을 QGIS로 가져올 수 있지만 레이어에 대해 CRS를 수동으로 설정해야 할 수도 있습니다. QGIS는 EWKT의 SRID를 사용하여 레이어 CRS를 설정하지 않습니다.
베어링 속성 추가
이것은 postgis에서 더 쉬울 것입니다. QGIS 표현식으로 수행 할 수 있지만 코드를 작성해야합니다. 이 같은...
create table pages as (
select getallpages from getAllPages(4000.0, 2000.0, 27700, 0.1)
);
alter table pages add column bearing float;
update pages set bearing=ST_Azimuth(ST_PointN(getallpages,1),ST_PointN(getallpages,2));
경고
그것은 약간 해킹되었으며 하나의 데이터 세트에서만 테스트 할 수있는 기회를 가졌습니다.
베어링 속성 업데이트에서 어떤 두 정점을 선택해야하는지 100 % 확실하지 않습니다 query
. 실험해야 할 수도 있습니다.
왜 현재 선분과 일치하도록 다각형을 회전시키기 위해 그러한 복잡한 공식을 수행해야하는지 모르겠다. ST_Rotate ()에서 ST_Azimuth ()의 출력을 사용할 수 있다고 생각했지만 그렇지 않은 것 같습니다.