Git Product home page Git Product logo

niigata-gis-graph's Introduction

道路網グラフデータ作成プログラム

背景

  • 道路網データの自治体による整備は進められており,オープンに開発者が利用することが可能である.
  • 道路網データは,座標の配列として表現されており(KML形式),地図上での表示などの目的では十分であるが,ナビゲーションなどの応用目的として利用したいときには,そのままの形式では不十分である.
  • 一方,交差点をノード,交差点を結ぶ道路をエッジとみなす,「道路網グラフデータ」は,ナビゲーションなどアプリケーションで利用するための基本データである.
  • 道路網グラフデータは,ナビゲーションサービスを提供するプラットフォーム業者や地図業者は,当然のごとく所有しているが,意外にオープンなデータとして自由に入手できるものは多くない.
  • このことは,自由なアプリケーションの発展や,研究者や学生によるグラフアルゴリズムの実験や学習を阻害している.
  • そこで,KML形式の道路データから,道路網グラフデータを作成するプログラムを作成し公開する

概要

  • 道路網データは,座標の配列となっているが,その座標が交差点となっているとは限らない.
  • よって,道路網グラフデータを作成するためには,道路網データから交差点を作成することが必要である.
  • 本プログラムでは,交差点は,道路網データから作成される道路の線分2つが交わっている点であるとみなす.
  • 出力されるグラフデータには,以下の情報が含まれる
    • ノード:道路網データの座標,交差点
    • エッジ:道路網データでの隣接する座標を結んだエッジ,交差点とそれが隣接するノードとのエッジ

制約・課題

  • 交差点の導出は,緯度・経度をx軸・y軸とみなす直交座標系として計算を行っているため,かなり粗い近似値であり,正確には球面座標(楕円体)としての計算が必要である
  • 道路の立体交差は考慮されていない,機械的に交点は作成される

計算上の工夫

  • 極めてナイーブに交差点を求めると,道路の数をm,1道路あたりの線分数をnとすると,(mn)^2のオーダーの計算が必要になり,少しデータが増えるとかなりの時間がかかる
  • しかし,実際交点が存在する場所は,それほど多くはなく,スパースに分布しているため,平面を長方形のセルに分割し,それぞれに対応する線分を対応づけるシンプルな空間インデックスを作成し,計算量の削減を行った
  • 以下の計算例では,新潟市を200x200のセルで分割し計算している(セルに含まれる線分数から判断.セル数の最適値はまだ分析できていない)
  • 交点を求める時間:Macbook Air Intel Core i5, メモリ 16GBで測定
    • ナイーブな方法:道路数 100→1分44秒,1500→234分
    • 簡易空間インデックスを使う方法:道路数 18856(新潟市内すべて)→17秒

作成されるデータ(新潟市道路網グラフデータ)

  • 交点以外のノード数: 206622
  • 交点のノード数: 184603
  • 全ノード数: 391225
  • 交点以外のエッジ数: 187766
  • 交点を端点に持つエッジ数: 369205
  • 全エッジ数: 556971

利用方法

以下の2つを実行する

python create_intersections.py
python create_graph.py
  • 入力データは,inputフォルダに置いてあるが,ファイルcreate_intersections.pyで指定する必要がある
  • 出力データは,outputに出力される(ノードとエッジのテキストファイル)

サンプルデータ

ファイルに関する説明

  • create_intersections.py : 交点の計算を行い,交点ファイル(中間生成物)を出力するプログラム(簡易空間インデックスによる方法)
  • create_intersections_naive.py : 交点の計算を行い,交点ファイル(中間生成物)を出力するプログラム(素朴に2重ループする方法)
  • create_graph.py : 交点ファイルからグラフデータを作成するプログラム
  • ./input : 入力となる道路網データ(KML)を置くフォルダ
  • ./output : 出力となる道路網グラフデータを置くフォルダ
  • ./temp : 中間結果を置くフォルダ
  • test_niigata-gis-graph.py: 単体試験に使用
  • research_road_file.py: 入力ファイル(KML)の調査に使用

niigata-gis-graph's People

Contributors

ggszk avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.