2012-03-22 49 views
2

stackoverflow。什麼是postgresql的查詢來解決這些相當複雜的步驟?

這可能會受到質疑,因爲它包含PostGIS函數,可根據我們擁有的舊數據計算每個資產的缺失數據(the_geom)。無論您是否瞭解PostGIS,都可以解決這個問題。

  • (注)我確切地知道我從這個問題想的,但我不知道的步驟合併這一切在一個單一的查詢或PHP腳本。*

讓我解釋一下這個問題的一些細節。首先,想一想街上的自行車道(資產)。自行車道本身是線繩,位於一個或多個小街道(子控制部分)。

要想象這個問題,這些都是一些可能的結果。

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

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

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

注: 「=======」 是CID(每個子CTRL節), 「|」分開每個cid, 「-------」是aid(每個資產),「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 

中心線(表) - 包含5 子CTRL截面

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)(2)在CID項包含在中心線(1)和中心線」

然後,當我們從上面的步驟中獲得每個cid(中心線)後,我們想通過使用「ST_Line_Substring」找到每個援助(資產)的the_geom UPDATE找到每個cid的子字符串。

但是現在我們沒有資產(表)的the_geom,所以我們必須計算它!

例如(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在每個子控制段中資產的比率。現在,我們將顯示此功能的工作原理:)

例如:(援助:5)2 子CTRL-部分佔據

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是(aid:5)在(cid:5)中佔用資產的第二部分的比率 - a.km_start - c.km_start/c .km_end - c.km_start

然後我們需要從上面的查詢計算ST_Union的每個部分(從ST_Line_Substring返回的the_geom)。

問題是要完成所有這些步驟的查詢是什麼,必要時可以用PHP腳本完成。

回答

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) 

我不明白你的問題的第二部分。你能詳細說明嗎?

+0

我已更新問題的詳細信息,請檢查,謝謝你的合作:) – 2012-03-22 23:49:09

相關問題