1

シカゴのストリート ネットワークを含むテーブルと、シカゴで犯された犯罪のテーブルがあります。私は犯罪の k-means クラスターを作成しようとしています。それらを最短の道路距離であるクラスターの中心に割り当てます。

まず、すべての犯罪を最も近い道路に補間しました。ここまでは順調ですね。今私がやろうとしているのは、各道路をその上にあるすべての犯罪ポイントで分割して、pgrouting を使用してネットワーク トポロジを作成し、ある犯罪場所から別の犯罪場所にルーティングできるようにすることです。

問題は、ST_Split 関数がほとんどの道路を分割していないようで、その理由がわかりません。100 万の犯罪ポイントがあることを考えると、道路は多数のセグメントに分割されるはずですが、元の道路ネットワーク テーブルにある行数よりも約 1000 行多いだけです。これは私が使用しているコマンドです:

CREATE TABLE algorithms.crime_network AS 
    SELECT road.id AS road_id, (ST_Dump(ST_Split(road.geom, road.crime_points))).geom
    FROM (SELECT r.geom as geom, r.gid id, ST_Multi(ST_Collect(c.geom)) AS crime_points FROM public.transportation r INNER JOIN chicago_data.interpolated_crimes c ON c.road_id = r.gid GROUP BY r.gid) AS road;

私はPostgisバージョン2.2.2を使用しているので、マルチポイントで分割しているという事実は問題ではありません..

どんな助けでも大歓迎です!

4

1 に答える 1

1

コメントしたように、すべてのオーバーレイ オペレータや ST_Split などの一部の関数では、期待どおりに実行するために正確なノードが必要です。これは、ジオメトリ オーバーレイの厄介な浮動小数点の違いにより、異なるジオメトリの頂点が互いに非常に近い (<1e-12 のオーダーで) ことを意味しますが、正確ではありません。

ST_Snap を使用して、あるジオメトリの別のジオメトリの正確なノードを取得します。これにより、ST_Split などの関数が期待どおりに動作するのに役立ちます。

于 2016-04-28T21:58:04.263 に答える