2012年2月22日 星期三

pgRouting

自從在上個公司玩起PostgreSQL..免費的~ 又可以外掛PostGIS做地理資訊運算~
對於沒什麼數學概念的偶還真是一大救星...

在現在的公司裡~ 還是碰到導航的問題~ 還好當時有記得幾個關鍵字..有跟幾個做這方面的人套好交情可以問問題XD..就把這open source project給建出來了~~

底下分享一下偶在Windows版本的安裝方式..

1. 先安裝PostgreSQL..因之前專案使用8.4版就一直延用下來

2. 安裝PostGIS 1.5, 可以在安裝PostgreSQL時就選擇plugin一路安裝..或是另外找postgis的安裝檔..裝完後主要就是會多了一個templete_postgis database, 內有780左右的function, 2個table..跟geom相關的形態..之後有需要postgis功能只要在建資料庫時使用這個做樣版建立就有了~ 很方便..

3. 接下來要安裝pgRouting這個project..因為沒有找到win包裝的~ 所以就手動來裝了..先下載檔案..記得要找符合pg版本的~ 我是用1.03_pg_8.4.2..(最後的.2好像沒差~ 只要8.4的都可以裝起來)..

3.a 將lib下的DLL檔(有三個)~ copy到pg安裝路徑下..PostgreSQL/8.4/lib..重起pg DB Server把dll讀進去

3.b create database for pgrouting..使用templet_postgis建立新db..我這邊database name是叫pgrouting2, owner若有需要變更建議在create db前就先建好直接assign~ 以免後面要改一堆owner很麻煩..

3.c 至cmd 模式下依序執行Share/Contrib裡面的三隻sql檔..必須使用管理者權限的user執行~ 不然會有權限問題..另外需指定db
psql --host localhost --username postgres --dbname pgrouting2 -f [dir]\Share\Contrib\routing_core.sql
psql --host localhost --username postgres --dbname pgrouting2 -f [dir]\Share\Contrib\routing_core_wrappers.sql
psql --host localhost --username postgres --dbname pgrouting2 -f [dir]\Share\Contrib\routing_topology.sql

3.d 若上述出現plpgsql未啟用..執行底下這一行(可於pgAdminIII/phppgadmin連線至該database的sql語法欄執行即可)
CREATE LANGUAGE 'plpgsql'

到上面應該就把pgrouting的function裝好了~ 至該database下看應該看到function會增加到800+..不過~ 裝了很多次~ 裝出來是820左右..但是到後面用db用備份回存時又不一樣了~ 不過總之有用到的function能動就好了~ 不管他了Orz..

4. 創建Table 額外演算 資訊
ALTER TABLE edges ADD COLUMN source integer;
ALTER TABLE edges ADD COLUMN target integer;

計算source/target (要等時間)
SELECT assign_vertex_id('edges', 0.0001, 'the_geom', 'gid');

//dijsktra演算法----
5. 設定權重length
ALTER TABLE edges ADD COLUMN length double precision;

計算要等
UPDATE edges SET length = st_length(the_geom::geography);

設定Index
CREATE INDEX source_idx ON edges(source);
CREATE INDEX target_idx ON edges(target);
CREATE INDEX geom_idx ON edges USING GIST(the_geom GIST_GEOMETRY_OPS);

測試Dijsktra演算法
SELECT * FROM dijkstra_sp('edges', 52, 35);

//astar
6. 設定點資料
ALTER TABLE edges ADD COLUMN x1 double precision;
ALTER TABLE edges ADD COLUMN y1 double precision;
ALTER TABLE edges ADD COLUMN x2 double precision;
ALTER TABLE edges ADD COLUMN y2 double precision;

計算要等
UPDATE edges SET x1 = x(startpoint(the_geom));
UPDATE edges SET y1 = y(startpoint(the_geom));
UPDATE edges SET x2 = x(endpoint(the_geom));
UPDATE edges SET y2 = y(endpoint(the_geom));

NOTE:“endpoint()” function fails for some versions of PostgreSQL (ie. 8.2.5, 8.1.9). A workaround for that problem is using the “PointN()” function instead:
UPDATE edges SET x1 = x(PointN(the_geom, 1));
UPDATE edges SET y1 = y(PointN(the_geom, 1));
UPDATE edges SET x2 = x(PointN(the_geom, NumPoints(the_geom)));
UPDATE edges SET y2 = y(PointN(the_geom, NumPoints(the_geom)));

測試astar
select * from astar_sp_delta('edges', 52, 35, 0.1);

以上建置方法是從網路上爬出來的~ 另外有做一些小修改..

the_geom存的是WGS84坐標系..算長度要轉成geography~ 資料才會是正確的路段長..
TWD97/TWD67時就不需要轉換了

道路節點範圍assign_vertex_id, 裡面的第二個參數也是看情況做調整~

沒有留言: