私は現在、等時性と基礎となるアルゴリズムの分野で働いています。現在問題となっているのは、等時線自体の場合の計算ではなく、結果の視覚化です。
私の等時線アルゴリズムの結果は、ポイントとエッジです。実際、私には有効なソリューションがありますが、3873エッジと1529ノードの場合、時間がかかるようです(2015 Core i7 CPUとかなり高速なSSDを含むLenovo T440sラップトップでは約2.0秒)。秒の代わりに、msec :-)のようなものがもっと欲しいです。
たぶん誰かが、到達可能な領域を視覚化するポリゴンを構築するのに必要な計算時間を短縮するのを手伝ってくれるでしょう。
しかし、待ってください...まず最初に!
これは、私の等時線の計算結果であるエッジの視覚化です。
これらのエッジはPostGISデータベーステーブルに格納され、単純な線ストリングです。
ユーザーに見せたいのは次のようなもの です。画像の最南端と最東端にある切断された領域に注意してください。これらは個別の領域として描画する必要があります(したがって、ここではマージできません:-))
現在、私はこのクエリを使用しています:
SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
SELECT ST_MakePolygon(ST_ExteriorRing(ST_GeometryN(segments, generate_series(1, ST_NumGeometries(segments))))) AS polygons FROM (
SELECT ST_Union(ST_Buffer("GEOMETRY", 20, 'quad_segs=2')) AS segments FROM my_edges AS a
) AS b
) AS c
私はすでにいくつかの実験を行っており、多くのドキュメントも読みましたが、より良い解決策を見つけることができません。
私の目には、大きな問題はST_Unionの使用です(ドキュメントで述べられているように、この関数は遅くなる可能性があります)。非常に興味深いのは、それをST_Collectで置き換えると、ST_Bufferの計算が遅くなるように見えるため、次のクエリのオールインオールがさらに長くかかりますが、エッジ間の領域は埋められません(ラインの周りにバッファーが作成されるだけです) ):
SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
SELECT ST_Buffer(ST_Collect(ST_LineMerge("GEOMETRY")), 20, 'quad_segs=2') AS polygons FROM my_edges AS a
) AS b
私のシステムでは、これに約3.8秒かかります(2倍近い時間です)。この小さなベンチマークからの最初の結論は、ST_BufferがMultiLineStringに関して予想外に遅くなるということです(各行のバッファーを作成してバッファーをマージするときよりもさらに遅くなります-私の目には奇妙です)。
また、(pgRoutingからの実装を使用して)アルファ形状を使用しようとしましたが、設定するアルファ値がないため(そして、実際には、どの値にそのような値を設定するのかは実際にはありません)、1つの優れたポリゴン(だから私は非常に南と東の地域を別々の地域として失ってしまいます。
また、ST_Polygonize(最初に頭に浮かんだこと)は使用可能な結果を生成しませんでしたが、おそらくここで何かを見落としました...
PostGISに表示されるエリアを作成するより良い方法はありますか?多分Javaコード(jts)またはクライアント側のjavascriptコード(jsts)を使用することによって?実際、結果に表示された領域が分離されたままであり、計算が(はるかに)高速になる限り、詳細を失うことで我慢できます。