2013-04-04 45 views
0

我在Postgis中有很多行(在Geoserver中导入)。我需要为每条固定长度(1公里,100米)的线创建(在新表中)多边形(或缓冲区中具有固定颜色的缓冲区中的计数点的缓冲区)。我如何创建与查询Postgis或可能与传单(geojson从geoserver)?如何在Postgis查询或传单(geojson)上沿着具有固定长度的线创建多边形?

+0

你能否提供更多的解释应该怎么样子?也许是一个样机图像? – 2013-04-04 12:51:25

+0

好吧,现在我有多边形(从线缓冲区),我需要拆分这个多边形与固定长度(多边形-10公里,我需要10公里多边形10)。 – user15445 2013-04-04 13:36:54

+0

或可能被剪切线然后创建多边形...? – user15445 2013-04-04 13:57:17

回答

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); 
相关问题