今年還有令一個很大的好處就是不再是每一組都要上台DEMO,這樣實在太花時間。今年可能因為隊伍數較多,是由各個企業分別選出該類別前2名上台DEMO,時間上就節省很多。另外,梅竹黑客松,不像其他黑客松幾乎都是只有一個主題,全部隊伍選出前3名,以及幾組佳作,他們會先讓各組選自己適合的類別,比如我們這組覺得 Windows Azure 的題目較適合我們,那我們被分配到那組之後,就是與同樣都是那類別的人競爭,一個類別還沒有超過10組的,老實說機會很大。(雖然我們還是沒得名…)
SELECT id FROM ways_vertices_pgr ORDER BY st_distance(the_geom, st_setsrid(st_makepoint(reqPoint[i].lng + "," + reqPoint[i].lat + "), 4326)) LIMIT 1;
取得地圖上離reqPoint[i]最近的路的其中一點
WITH result AS (SELECT * FROM ways JOIN (SELECT seq, id1 AS node, id2 AS edge_id, cost, ROW_NUMBER() OVER (PARTITION BY 1) AS rank FROM pgr_dijkstra('SELECT gid AS id, source::integer, target::integer, length::double precision AS cost FROM ways'," + begin + ", " + end + ", false, false)) AS route ON ways.gid = route.edge_id ORDER BY rank) SELECT ST_AsEWKT(result.the_geom), name from result;
這段很長,我將他拆開來討論
pgr_dijkstra('SELECT gid AS id, source::integer, target::integer, length::double precision AS cost FROM ways'," + begin + ", " + end + ", false, false)
這段是利用pgr_dijkstra來取得begin和end中的最短路徑。
SELECT seq, id1 AS node, id2 AS edge_id, cost, ROW_NUMBER() OVER (PARTITION BY 1) AS rank FROM pgr_dijkstra......ORDER BY rank
本來我沒有加ROW_NUMBER() OVER (PARTITION BY 1) AS rank,但後來發現,pgrouting他所回傳的路徑並沒有按照順序,這是他的一大缺點…所以我必須額外幫他增加一個欄位來紀錄路徑順序,並按照順序排列。
SELECT * FROM ways JOIN...ON ways.gid = route.edge_id
這段是因為,pgr_dijkstra,回傳的東西裡頭並沒有路徑軌跡點,只有他的id,所以必須再跟ways做join來取得路徑軌跡點
WITH result AS...SELECT ST_AsEWKT(result.the_geom), name from result; 最後將所有得到的結果命為 result table,且因為其軌跡直為 linestring,為了再網頁中顯示,必須再將他轉為一般座標點,所以用 ST_AsEWKT 將 result 底下存linestring的欄位the_geom將其轉為一般座標點。
sudo vim /etc/postgresql/9.1/main/pg_hba.conf 更改
local all postgres trust
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
在使用 overpass api 時,我使用以下code取得資料後,使用 osm2pgrouting 將資料 load 進 postgresql,卻發現無法使用…,可能是少了某些重要資料吧,於是我就乖乖用原本 osm api 去拿圖資。