■2点間の距離の算出
float ST_Distance(geometry g1, geometry g2);
float ST_Distance(geography gg1, geography gg2);
============
139.46383010 35.6078055 と 139.48004430 35.58936550 の距離を求めろ
============
SELECT ST_Distance('SRID=4326;POINT(139.46383010 35.6078055)'::GEOGRAPHY,'SRID=4326;POINT(139.48004430 35.58936550)'::GEOGRAPHY);
st_distance
---------------
2518.87992511 (単位はメートル)
(1 行)
SELECT ST_Distance(ST_Transform(ST_GeomFromText('POINT(139.46383010 35.6078055)',4326),26986),ST_Transform(ST_GeomFromText('POINT(139.48004430 35.58936550)',4326),26986));
st_distance
-----------------
2534.9890933572 (単位はメートル)
(1 行)
============
点(139.46507, 35.59577)と source 608 の距離を求めろ
============
SELECT ST_Distance('SRID=4326;POINT(139.46507 35.59577)'::GEOGRAPHY, the_geom) from ways where source = 608;
st_distance
-------------
48.64958043 (単位はメートル)
(1 行)
■点と線の最短距離の算出
===================
点(139.46383010 35.6078055) と
線(139.47364070 35.59500190),(139.47500790 35.59561250),(139.47618950 35.59667510) の # 3点は繋がっている
最短距離を求めろ
===================
SELECT ST_Distance('SRID=4326;POINT(139.46383010 35.6078055)'::GEOGRAPHY,'SRID=4326;LINESTRING(139.47364070 35.59500190,139.47500790 35.59561250, 139.47618950 35.59667510)'::GEOGRAPHY);
st_distance
---------------
1667.13188667 (単位はメートル)
(1 行)
■任意の座標に近いノードを抽出
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);
===============
点(139.47500790 35.59561250)から半径300メートル以内の全部のノードを、近い順に出せ
===============
SELECT source, x1 as longitude, y1 as latitude, ST_Distance('SRID=4326;POINT(139.47500790 35.59561250)'::GEOGRAPHY, the_geom) as dist FROM ways WHERE ST_DWithin(the_geom, ST_GeographyFromText('SRID=4326;POINT(139.47500790 35.59561250)'), 300.0) ORDER BY dist;
source | longitude | latitude | dist
--------+-------------+------------+--------------
277 | 139.4742202 | 35.5952626 | 0
342 | 139.4737614 | 35.5960846 | 0
554 | 139.4750079 | 35.5956125 | 0
554 | 139.4750079 | 35.5956125 | 0
465 | 139.4756076 | 35.5956018 | 54.35238655
465 | 139.4756076 | 35.5956018 | 54.35883189
148 | 139.4753681 | 35.5942035 | 62.47683957
488 | 139.4755625 | 35.595278 | 62.47683957
277 | 139.4742202 | 35.5952626 | 78.20859781
309 | 139.4758617 | 35.5957534 | 78.9363046
309 | 139.4758617 | 35.5957534 | 78.9363046
163 | 139.4736407 | 35.5950019 | 81.2567669
597 | 139.4728928 | 35.5961536 | 81.2567669
406 | 139.4760808 | 35.5958841 | 101.79071989
211 | 139.4761077 | 35.5959027 | 104.73755527
580 | 139.4761706 | 35.5959419 | 111.52418485
201 | 139.4762056 | 35.5959637 | 115.32014973
(単位はメートル)
Login by SSH cd /home/kobore cp -r www www2 // Don't touch "www" itself tar -czvf www2.tgz www2 mv www2.tgz www.kobore.net.20181102.tgz rm -r www2 // Never delete directory "www" After that, bring "www.kobore.net.20181102.tgz" into a PC
kashiwanoha_routing=# SELECT * FROM pgr_astar('SELECT gid as id, source, target, cost_s As cost, x1, y1, x2, y2 FROM ways', 100, 159); seq | path_seq | node | edge | cost | agg_cost -----+----------+------+------+-------------------+------------------ 1 | 1 | 100 | 2168 | 8.5892500035812 | 0 2 | 2 | 1571 | 4424 | 1.10979209576821 | 8.5892500035812 3 | 3 | 3232 | 9213 | 0.440968020162748 | 9.69904209934941 4 | 4 | 6708 | 217 | 2.29065882200656 | 10.1400101195122 5 | 5 | 159 | -1 | 0 | 12.4306689415187 (5 行)
■ワーシャルフロイド法の使い方 Floydのアルゴリズムとも呼ばれるFloyd-Warshallアルゴリズムは、密集グラフのグラフのノードの各ペアの最短経路のコストの合計を計算するのに適しています。 主な特徴は次のとおりです。 ・パスを返しません。 ・グラフ内のノードの各ペアに対する最短経路のコストの合計を返します。 ・プロセスは肯定的なコストのエッジでのみ実行されます。 ・Boostは、V×V行列を返します。ここで、無限大の値です。 パスがない頂点間の距離を表します。 ・無限大以外の値のみを(start_vid、end_vid、agg_cost)のセットの形で返します。 ・戻り値がテーブルに格納されている場合は、一意のインデックスは(start_vid、end_vid)のペアになります。 ・無向グラフの場合、結果は対称です。 ・(u、v)のagg_costは(v、u)と同じです。 ・start_vid = end_vidのとき、agg_cost = 0。 ・推奨されているのは、3500エッジ以下のバウンディングボックスを使用することです。 ----- SELECT * FROM pgr_floydWarshall('SELECT gid, source, target, cost FROM ways where gid = 10' ); start_vid | end_vid | agg_cost -----------+---------+----------------------- 95 | 23 | 0.00093223435894817 23 | 95 | 0.00093223435894817 4506 | 1 | 0.000788520466807583 1 | 4506 | 0.000788520466807583 3221 | 2 | 2.70185121784218e-005 2 | 3221 | 2.70185121784218e-005 1724 | 3 | 0.00037710190931161 3 | 1724 | 0.00037710190931161 196 | 4 | 0.00036557605227385 196 | 1800 | 0.00100402907325107 4 | 196 | 0.00036557605227385 4 | 1800 | 0.000638453020977218 1800 | 196 | 0.00100402907325107 1800 | 4 | 0.000638453020977218 4099 | 5 | 0.00030819351844984 5 | 4099 | 0.00030819351844984 1458 | 6 | 0.000280440956354741 1458 | 2417 | 0.00131019044532306 6 | 1458 | 0.000280440956354741 6 | 2417 | 0.00102974948896831 2417 | 1458 | 0.00131019044532306 2417 | 6 | 0.00102974948896831 (22 行) 感想 何やっているのか、さっぱり分からん SELECT * FROM pgr_floydWarshall('SELECT gid, source, target, cost FROM ways') WHERE start_vid = 9 and end_vid = 24; start_vid | end_vid | agg_cost -----------+---------+------------------- 9 | 24 | 0.180760172336233 なんか出てきたが、酷く時間がかかった。