我在 Postgis 中有很多行(在 Geoserver 中导入)。我需要为具有固定长度(1 公里,100 米)的每条线创建(在新表中)多边形(或具有固定颜色的缓冲区,用于缓冲区中的计数点),无需步进。如何使用查询 Postgis 创建或使用 Leaflet(来自 geoserver 的 geojson)?
问问题
649 次
1 回答
0
要切断你必须使用的线ST_LINE_Substring
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
它很容易,如果您想要在原始线的末端除平之外的东西,它就会变得更加复杂。然后我们必须ST_DIFFERENCE
使用下一个/上一个元素的缓冲区进行缓冲,并且不要忘记只有一个片段的情况
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);
于 2013-04-05T18:30:12.147 回答