首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Postgis查询或Leaflet(geojson)上沿固定长度的线创建多边形?

如何在Postgis查询或Leaflet(geojson)上沿固定长度的线创建多边形?
EN

Stack Overflow用户
提问于 2013-04-04 15:22:57
回答 1查看 642关注 0票数 0

我在Postgis中有很多行(在Geoserver中有import )。我需要创建(在新表中)多边形(或缓冲区中的计数值固定颜色的缓冲区)为每个固定长度(1公里,100米)没有步骤的线。如何使用query Postgis或可能使用Leaflet(来自geoserver的geojson)创建?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-06 02:30:12

要减少这一行,您必须使用ST_LINE_Substring

代码语言:javascript
复制
SELECT id,ST_Line_Substring(line,
  CASE WHEN i=0 THEN 0 ELSE (i*100)/ST_Length(line) END,
  CASE WHEN (i+1)*100<ST_Length(line) THEN ((i+1)*100)/ST_Length(line) ELSE 1 END),50,'endcap=flat')
FROM line, 
  (SELECT generate_series(0,floor(ST_Length(line)/100)::int) as i FROM line) as q

如果你想让它两端都是平坦的,那么把ST_Buffer去掉很容易,如果你想要的东西不是在原始行的两端平坦,那就复杂多了。然后,我们必须使用下一个/上一个元素的缓冲区进行缓冲,并且不要忘记只有一个片段时的情况

代码语言:javascript
复制
WITH
line_frags AS
(
SELECT l.id,i, ST_Line_Substring(l.line,
CASE WHEN i=0 THEN 0 ELSE (i*100)/ST_Length(l.line) END,
CASE WHEN (i+1)*100<ST_Length(l.line) THEN ((i+1)*100)/ST_Length(l.line) ELSE 1 END) as frag,
CASE WHEN (i+1)*100>ST_Length(l.line) THEN true ELSE false END as the_end
FROM line AS l JOIN (SELECT id,generate_series(0,floor(ST_Length(l.line)/100)::int) as i FROM line AS l) as q ON q.id=l.id)

SELECT 
CASE 
  WHEN f1.i=0 AND f2.i IS NULL 
    THEN ST_Buffer(f1.frag,50,'endcap=round')
  WHEN f2.i IS NOT NULL 
    THEN ST_DIFFERENCE(ST_Buffer(f1.frag,50,'endcap=round'),ST_BUFFER(f2.frag,50,'endcap=flat')) 
  ELSE 
    ST_Buffer(f1.frag,50,'endcap=flat') END as buf 
  FROM line_frags AS f1 
  LEFT JOIN line_frags AS f2 
    ON f1.id=f2.id AND (f1.i=0 and f2.i=1 OR f1.the_end AND f2.i=f1.i-1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15804939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档