Câu hỏi thú vị! Đó là điều mà tôi muốn thử bản thân mình, vì vậy hãy thử xem.
Bạn có thể làm điều này trong PostGRES / POSTGIS với chức năng tạo ra một tập hợp đa giác.
Trong trường hợp của tôi, tôi có một bảng với một tính năng (MULTILINESTRING) đại diện cho một tuyến đường sắt. Nó cần sử dụng CRS tính bằng mét, tôi đang sử dụng osgb (27700). Tôi đã thực hiện 4km x 2km 'trang'.
Tại đây, bạn có thể thấy kết quả ... thứ màu xanh lá cây là mạng lưới đường, được cắt vào vùng đệm 1km quanh đường sắt, tương ứng với chiều cao của đa giác độc đáo.
Đây là chức năng ...
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' ;
Sử dụng chức năng này
Đây là một ví dụ; 4km x 2km trang, epsg: 27700 và 10% trùng lặp
select st_asEwkt(getallpages) from getAllPages(4000.0, 2000.0, 27700, 0.1);
Sau khi chạy, bạn có thể xuất từ PGAdminIII sang tệp csv. Bạn có thể nhập cái này vào QGIS, nhưng bạn có thể cần phải đặt CRS theo cách thủ công cho lớp - QGIS không sử dụng SRID trong EWKT để đặt CRS lớp cho bạn: /
Thêm thuộc tính mang
Điều này có thể được thực hiện dễ dàng hơn trong postgis, nó có thể được thực hiện trong các biểu thức của QGIS nhưng bạn sẽ cần phải viết một số mã. Một cái gì đó như thế này ...
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));
Hãy cẩn thận
Đó là một chút hack-together và chỉ có cơ hội để thử nghiệm trên một tập dữ liệu.
Không chắc chắn 100% hai đỉnh bạn sẽ cần chọn trong bản cập nhật thuộc tính mang đó query
.. có thể cần thử nghiệm.
Tôi phải thú nhận rằng tôi không biết tại sao tôi cần phải thực hiện một công thức phức tạp như vậy để xoay đa giác để phù hợp với phân khúc dòng hiện tại. Tôi nghĩ rằng tôi có thể sử dụng đầu ra từ ST_Azimuth () trong ST_Rotate (), nhưng dường như không.