有趣的问题!这是我想尝试的东西,因此尝试一下。
您可以在PostGRES / POSTGIS中使用生成一组多边形的函数来执行此操作。
就我而言,我有一张表,其中包含一个代表铁路线的要素(MULTILINESTRING)。它需要以米为单位使用CRS,我正在使用osgb(27700)。我已经完成了4公里x 2公里的“页面”。
在这里,您可以看到结果...绿色的东西是公路网,被修剪到铁路周围1公里的缓冲区内,与多边形的高度非常吻合。
这是功能...
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' ;
使用此功能
这是一个例子。4公里x 2公里页面,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()的输出,但似乎不能。