如何遍历表格并使用列属性在postGIS中进行划线

时间:2018-07-23 11:02:00

标签: postgresql algorithm postgis

说我有一张桌子:

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来执行此操作?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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”语句使代码更清晰,并且比在普通select的“ from”部分中执行两次的速度更快
  • row_number()是一个窗口函数,您可以在postgres文档中阅读有关它的更多信息。我只是用它对行进行排名并找到第一个和最后一个
  • st_point是postgis函数,用于根据x和y(经纬度)创建postgis点对象
  • st_makeline是postgis函数,用于在两点之间创建线

我希望它将对您有所帮助。 如果您要转换的数据量很大,请给我一个信号,我可以给您一些技巧,使它变得比简单的SQL快得多。