OSM道路を交差点で個々のセグメントに分割する方法は?


10

OpenStreetMapデータを使用してpgRoutingで使用する道路ネットワークを作成したいと思います。GeoFabrikからシェープファイルをPostgresテーブルにロードしました(PostGISを有効にした状態)。しかし、私が抱えていた問題の1つは、道路が常に交差点で終わらないということでした。そのため、すべての交差点または交差点で道路をすべて分割することにしました。

道路が交差または交差するすべての交差点を特定するために、私は次のものを使用しましたSQL前の質問と同様)。

CREATE TABLE split_points as
SELECT DISTINCT    
   ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom      
FROM
   roads as a,
   roads as b
WHERE
    ST_Touches(a.geom, b.geom)
OR
    ST_Crosses(a.geom, b.geom)    
    AND a.gid != b.gid
GROUP BY
   ST_Intersection(a.geom, b.geom);

これらのポイントを使用して道路を分割したいと思います。私は次のアプローチを使用しました:

CREATE TABLE split_roads as
SELECT     
    ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
    generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM    
    split_points as blade,
    roads as g
WHERE
    ST_Intersects(g.geom, blade.geom);

このスプリットアプローチの問題は、すべてのスプリットピースに加えて、道路全体の長さが残ることです。含まれていたこれらの分割されていない道路形状を削除するには、ST_Equals()関数を使用してそれらを識別し、削除しました。

DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)

ただし、この方法では元の分割されていないジオメトリのすべてが削除されるわけではありません(ただし、ジオメトリの一部は削除されます)。テーブルに分割されたジオメトリのみが含まれるように、削除(または全体)のためのより良いアプローチはありますか?


ドキュメントによると、ST_Splitは元の分割されていないジオメトリを返しません。SELECTステートメントの最初の行の最後の閉じ括弧にぶら下がっている余分な '.geom'は何ですか?それを削除するのと同じくらい簡単かもしれません。
12

@Scro .geomはあなたが参照していますか?見つけられない!
djq

技術的には、これはSELECTステートメントの2行目です。また、「split_roads」テーブルの作成についても言及しています。')))。geom)as geom'で終わる行です。
12

うーん、そうするとエラーが出ます。ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
djq

行全体は次のようになりましたか:ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom、blade.geom))))geomとして
Scro

回答:


6

問題の実際の解決策ではありませんが、osm2poを試してください... pgroutingでルーティングするための完璧なSQLコードを作成します:http ://osm2po.de/


提案をありがとう。試しましたosm2pgroutingが、サーバーよりも多くのメモリが必要で、終了せずに終了します。
djq 2012年

2
@djq osm2poは、osm2pgroutingよりもはるかに大きなファイルを処理できます。planet.osmをロードすることもできます
アンダーダーク

あ、もともとosm2po誤植だと思っていました。それをubuntuにインストールするのは簡単ですか?
djq 2012年

コンパイル済みのJARファイル(java)です。ウェブサイトで説明されているように実行してください。
GIS学生

11

簡単な答え:しないでください。そのようにすべきではありません。

OSM道路シェープファイルからは、交差点と高架/地下道を区別することはできません。交差しているように見える道路をすべて分割すると、現実には存在しない交差点が作成されます。

osm2pgrouting(ネットワークが十分に小さい場合)やosm2poなどの既存のツールを使用しない場合は、元のOSMファイルで手を汚す必要があります。


1
その通りです。これは、navteqとテレアトラスのデータを処理するときに犯す別の間違いでもあります。地下道/高架は苦痛ですが現実です。
Ragi Yaser Burhum、2012年

1
同意します。データが多かれ少なかれ悪い状態にあるGISへようこそ
シンプレックス

3

pgRoutingを使用した一般的な問題について:@OSCなどを使用する方法を示している@ Uffer、@ GisStudentなどが正しいと思います。「ベストプラクティス」と「標準」の手がかりに従ってください...

質問について:「交差点で道路を個々のセグメントに分割する」または「元の分割されていないジオメトリをすべて削除する方法」ここに結果をステップバイステップで表示すると、私がお手伝いできます...

最初のステップ:トポロジー分析

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.

2

別の「問題の実際の解決策ではありません」が、OSMコンバーターはOSMからSHPに変換するときに交差点で分割します。幾何学的計算を行うよりも、ノードのIDを比較できるため、この方法の方が効率的です。


1

アルゴリズムで解決する1つの方法は、道路全体の始点と終点を「交差点」のセットに追加して、すべてのセグメントが2つの交差点の間にあることを確認することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.