什么是postgresql的查询来解决这些相当复杂的步骤?

时间:2012-03-22 07:11:49

标签: php database postgresql postgis

计算器。

这可能是一个挑战性问题,因为它包含了PostGIS功能,可根据我们的旧数据计算每个资产的缺失数据(the_geom)。无论您是否了解PostGIS,您都可以解决这个问题。

  • (注意)我确切地知道我想从这个问题中得到什么,但我不知道将所有这些合并到单个查询或PHP脚本中的步骤。*

让我解释一下这个问题的一些细节。 首先,考虑一下街上的自行车道(资产)。自行车道本身是一个线串,位于一个或多个子街道( sub-ctrl-section )。

为了使这个问题可视化,这些是可能的结果。

==============|=============
x---------------------y

==============|======|==========
   x-------------------------y

==============
    x------y
  

注意:   “=======”是cid(每个 sub-ctrl-section ),“|”分开每个cid,   “-------”是援助(每个资产),“x”是km_start(起点),“y”是每个资产的km_end(终点)。

资产(表) - 包含5个资产

aid | km_start | km_end | ctrl_sec_no | the_geom
1 | 10 | 15 | 1234 | null
2 | 10 | 25 | 1234 | null
3 | 13 | 15 | 5678 | null
4 | 11 | 15 | 5678 | null
5 | 13 | 17 | 5678 | null

centerline(表) - 包含5个子控制区

 cid | km_start | km_end | ctrl_sec_no | the_geom(LINESTRING)
   1 | 10 | 12 | 1234 | xxxx...
   2 | 13 | 15 | 1234 | xxxx...
   3 | 16 | 30 | 1234 | xxxx...
   4 | 10 | 15 | 5678 | xxxx...
   5 | 16 | 20 | 5678 | xxxx...

我希望结果像

aid(1) -> cid(1) + cid(2)
aid(2) -> cid(1) + cid(2) + cid(3)
aid(3) -> cid(4)
aid(4) -> cid(4)
aid(5) -> cid(4) + cid(5)

注意:“资产(1)包含在中心线(1)和中心线(2)中,以cid为单位”

然后,在我们从上面的步骤获得每个cid(中心线)之后,我们希望通过使用“ST_Line_Substring”来查找每个援助(资产)的更新 the_geom我们得到了。

但是现在我们没有资产的thege(表),所以我们必须计算它!

例如(ctrl_sec_no:1234) - 这不是完美的比例,仅用于可视化

10======12======13======15======16======30
x-------|-------|-------y (aid:1)
x-------|-------|-------------------y (aid:2)
                x-------y (aid:3)

例如(ctrl_sec_no:5678)

10=====15/16=====20
  x-----y (aid:4)
     x--|----y (aid:5)

这意味着我们必须使用ST_Line_Substring计算每个子控制区中资产的RATIO。现在,我们将展示此功能的工作原理:)

例如:(辅助:5)占用2个子控制区

SELECT ST_Line_Substring('the_geom',13-10/15-10,1.0) FROM centerline WHERE ctrl_sec_id = 4567 and cid = 4

SELECT ST_Line_Substring('the_geom',0.0,17-16/20-16) FROM centerline WHERE ctrl_sec_id = 4567 and cid = 5

(13-10)/(15-10)= 3/5是(援助:5)占据(cid:4) - a.km_start - c的资产的第一部分的比率。 km_start / c.km_end - c.km_start

(17-16)/(20-16)= 1/4是(援助:5)在(cid:5) - a.km_start - c中占用的资产的第二部分的比率。 km_start / c.km_end - c.km_start

然后我们必须从每个部分(从ST_Line_Substring返回的the_geom)ST_Union,我们从上面的查询计算。

问题是执行所有这些步骤的查询是什么,如果需要,可以使用PHP脚本完成这些步骤。

1 个答案:

答案 0 :(得分:1)

create table asset (
    aid integer primary key, 
    km_start integer not null, 
    km_end integer not null, 
    ctrl_sec_no integer not null, 
    the_geom text default null
)
;

insert into asset (aid, km_start, km_end, ctrl_sec_no)
values
(1, 10, 15, 1234),
(2, 10, 25, 1234),
(3, 10, 12, 5678), 
(4, 11, 15, 5678),
(5, 13, 17, 5678)
;

create table centerline (
    cid integer primary key, 
    km_start integer not null, 
    km_end integer not null, 
    ctrl_sec_no integer not null, 
    the_geom text not null default 'xxxx...'
)
;

insert into centerline (cid, km_start, km_end, ctrl_sec_no)
values
(1, 10, 12, 1234),
(2, 13, 15, 1234),
(3, 16, 30, 1234),
(4, 10, 15, 5678),
(5, 16, 17, 5678)
;

select aid, cid
from asset a
inner join centerline c on 
    a.ctrl_sec_no = c.ctrl_sec_no
    and (
        a.km_start between c.km_start and c.km_end
        or
        a.km_end between c.km_start and c.km_end
        or
        a.km_start <= c.km_start and a.km_end >= c.km_end
        )
order by aid, cid
;

 aid | cid 
-----+-----
   1 |   1
   1 |   2
   2 |   1
   2 |   2
   2 |   3
   3 |   4
   4 |   4
   5 |   4
   5 |   5
(9 rows)

我不明白你问题的第二部分。你能详细说明吗?