2011-09-16 5 views
12

私は、OpenStreetMap(OSM)XMLファイルを解析し、階層的な方法で町や都市のデータベースを構築するスクリプトを作成したいと考えています。私はアメリカでこのように見えるかもしれません階層を持つように結果のデータセットをしたい:OSM XML惑星ファイルから階層都市/州/国データを抽出するにはどうすればよいですか?

USA -> California -> San Francisco County -> San Francisco 

そしておそらく英国では、このように:

United Kingdom -> England -> Middlesex -> London -> Soho 

出力が記述するJSONドキュメントになります上記の例のような構造を持つOSMファイル内のすべての都市の階層。

私はPythonと "imposm"パーサライブラリを使用していますが、問題なくファイルをロードして解析できます。私の問題は、OSMのデータがどのように構造化されているかを理解していないことです。OSMのデータ内のノード間の親子関係を知る方法はわかりません。たとえば、「ソーホー」のノードを見つけたら、「City of Westminster」、「Greater London」、「Middlesex」、「England」のノードに戻すにはどうすればいいですか?

私はいくつかのノードが、この情報の一部を与えるかもしれない「is_in」タグを持っていることを知っている

が、

  • A)これは矛盾していると
  • B)が、自由形式のテキストであると思われますOSMノードへのリンクではありません(つまり、is_in: "City of Westminster"は私にWestminsterノードへのリンクを与えません)。

これらのノードを階層的にリンクする方法についてご意見がありましたらお知らせください。

答えて

14

OSMでは基本的にすべてが自由形式です。タグ付けに関する規則はありますが、人々がそれらに固執する保証はありません。したがって、一貫性のあるものを得るためには、データのクリーニングと後処理が必要になります。

親子関係については、他のOSMにハードワイヤードの関係が全く存在しないより:ノードは、ノードが1つまたは複数のメンバーである一つ以上の方法

  • によって使用さ

    • 関係
    • 方法は、関係は、1つ以上の関係

    OSMのメンバーである一つ以上の関係

  • のメンバーであります関係を使用して階層関係を定義できますが、これらの定義方法は非常に一般的です。セマンティクスは、規則に基づいています(通常、OSM Wikiページで説明されています)。

    "is_in"関係を探しているなら、幾何学的方法を使って確立する必要があると思います。残念ながら、このためにOSMタグ付けに本当に頼ることはできません。

  • +0

    ご回答ありがとうございます。それは有用な情報であり、私は必要なデータを得るためにOSMデータの構造に十分頼ることができないようです。私はgeonames.orgのような場所から自分のデータを得る方が良いと思う。 – luke

    +0

    彼は興味のあるポイントを囲んでいる境界を持つすべてのノードを検索できませんか?例えばもしあなたが通りを持っていれば、通りの緯度と経度の位置を囲んでいるので、都市、州、地区、国などのノードを見つける必要がありますか? – Tom

    関連する問題