如何遍历表并使用列属性在postGIS中创建一行

问题描述 投票:2回答:2

说我有一张桌子:

ID    X    Y   TIME
---------------------
A     1    2     0
B     9    5     0
A     2    3     1
C     0    0     3
B     9    6     1
B     10   6     2
C     1    0     5
A     2    9     11
...

我希望能够制作出这样的线条:

ID    LINE
A     (1,2) -> (2,9)
B     (9,5) -> (10, 6)
C     (0,0) -> (1, 0)

因此,我们为每个ID从最早的开始时间到最晚的结束时间进行分数。

我怎么能写PostGIS SQL来做这个操作?

postgresql algorithm postgis
2个回答
0
投票

我在PostGIS SQL中没有雄辩,所以我可能在这里错了,但在SQL中你通常需要这样做:

insert into SecondTable(ID, LINE)
select ID, as LINE 
from FirstTable l
join FirstTable r
on l.ID = r.ID
where
not exists (select ID
            from FirstTable aux
            where aux.TIME < l.TIME or aux.TIME > r.TIME) and
not exists (select ID
            from SecondTable
            where l.ID = SecondTable.ID);

0
投票

如果我正确理解你想在每个id的第一个和最后一个点之间创建一条直线。如果是正确的话:

with pr as(select id, x, y, 
                  row_number() over (partition by id order by time, (x,y)) rnk_asc, 
                  row_number() over (partition by id order by time desc,(x,y)) rnk_desc
             from points)

select pr.id, st_makeline(st_point(pr.x, pr.y) , st_point(pr2.x, pr2.y))
  from pr, pr pr2
 where pr.id=pr2.id
   and pr.rnk_asc=1
   and pr2.rnk_desc=1

一点代码说明:

  • 我叫你的桌子“点”
  • 我使用“with”语句使代码更清晰,并且比在普通选择的“from”部分中执行两次要快一些
  • row_number()是一个窗口函数,你可以在postgres文档中阅读更多关于它的内容。我只是用它来排序行,找到第一个和最后一个
  • st_point是postgis函数,用于从x和y(lat和long)创建postgis点对象
  • st_makeline是用于在两点之间创建线的postgis函数

我希望它会对你有所帮助。如果你有大量的数据要转换给我一个标志,我可以给你一些提示,使它比这个简单的SQL快得多。

© www.soinside.com 2019 - 2024. All rights reserved.