计算器。
这可能是一个挑战性问题,因为它包含了PostGIS功能,可根据我们的旧数据计算每个资产的缺失数据(the_geom)。无论您是否了解PostGIS,您都可以解决这个问题。
让我解释一下这个问题的一些细节。 首先,考虑一下街上的自行车道(资产)。自行车道本身是一个线串,位于一个或多个子街道( 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脚本完成这些步骤。
答案 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)
我不明白你问题的第二部分。你能详细说明吗?