缓冲多个线串

时间:2014-10-15 16:14:50

标签: postgresql gis postgis

我对postgresql很新,所以对我的问题可能有一个非常简单的答案,至少我希望如此。

我已经导入了一张包含数千条单线串的表格,这些线条代表了一个国家的主要道路。 我想缓冲它们中的每一个并将结果与​​另一个多边形相交(基本上只是一个圆形,但事实是,圆形的位置是动态的,取决于用户的偏好)。

但是,我不知道如何一次缓冲所有的线串。当我缓冲并只交叉一个线串时,它工作得很好,但是我缓冲所有这些线条是至关重要的。 使用SPIT将道路作为多线串输入根本不起作用。

那么......我该如何实现呢?任何提示? 我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

最好的方法是简单地添加另一列代表道路缓冲区并添加空间索引,即

alter table roads add column road_buffer geometry(POLYGON, SRID);
update table roads set road_buffer = st_buffer(roads, distance);
create index ix_spatial_road_buffer on roads using gist(road_buffer);

其中POLYGON和SRID指示列的类型和空间参考ID。尽管使用特定类型和SRID是一种好习惯,但您可以省略它。您也可以使用AddGeometryColumn作为同一目的。

现在,您可以针对缓冲道路运行查询,该索引在索引时会很快,但会返回实际道路,例如

Select road_id, road from roads where st_intersects(road_buffer, circle);

现在,如果你想以另一种方式做到这一点,而没有实际拥有预先缓冲的线串,你可以做类似的事情,

select road_id, road, road_buffer from 
  (select st_buffer(road, dist) as road_buffer, road, road_id
    from roads where 
    st_intersects(st_expand(st_envelope(road), dist), circle)
  ) road_buff 
where st_intersects(road_buffer, circle);

这里的技巧是你在子查询中计算缓冲区,但仅限于那些其包络(即最小边界矩形)与你的圆相交的线串/道路 - 比缓冲所有线串更快的计算。另请注意,st_expand的使用量与缓冲距离相同,基本上扩展了mbr并确保您不会错过任何潜在的候选者。我对50万个随机线进行了快速测试,这种方法比简单地检查所有点的缓冲区的圆形交叉点要快得多(10倍)。

答案 1 :(得分:0)

实际上我想出了一个可行的解决方案。 我只是在外部缓冲我的线串(使用qgis)并将整个东西重新上传为一个大的多边形。

但是,我仍然想知道在保持线串结构的同时如何完成它。 JohnBarça建议的两种方法都适用于我。