2012-02-14 3 views
2

Googleマップのような外部Webサービスを呼び出すことなく2ポイント間の歩行距離を計算する能力が必要です。 Google Mapsには、Distance Matrix APIというAPIがあります。これは私がする必要のあるものに最適ですが、制限があり、Webサービスを呼び出す必要があります。幸い、私の経度と緯度の点は1つの都市に限られているので、Google Maps Distance Matrix APIが提供するように世界の任意の2点を照会して歩行距離を計算できるようにする必要はありません。外部Webサービスなしで2ポイントの歩行時間

私は、これはおそらくバックエンドに道路ルートを維持するために多くのストレージを必要とし、これは完全にクレイジーな要求かどうかわかりませんが、誰かがこれを行う方法や同様の機能を提供します。

答えて

4

http://www.openstreetmap.orgから必要なデータを.osmファイル形式で入手できます。

これらは必要な道路を含むxmlファイルです。あなたはosmとそのwikiページについてもっと読むことができます。

距離だけで実際のルートを気にしないと、作業が楽になります。

.osmファイルを解析するスクリプトを作成します。関連性のあるノードやエッジ、歩行できない道路や河川など何も抽出しないでください。次に、このデータを取って、ある種のグラフデータ構造に入れます。

そこから、2点間の距離を求めたい場合は、Dijkstra's Algorithmを実行してください。すべての可能な距離を保存したい場合は、Dijkstraをグラフの各ノードから一度だけ実行し、毎回距離を保存してください。

<node id="111" lat="41" lon="-74" // more stuff here> 
    <tag k="x" v="y"/> ... // These are the various attributes of a node, optional 
</node> 
<node id='112' ..../> 
<way id='555'> 
    <nd ref='111'/> // These are the nodes that make up the way 
    <nd ref='112'/> 
    <nd ref='543'/> 
    ... 
    <tag k='highway' v='primary'/> 
    <tag k='name' v='E. 42nd Street/> 
</way> 

ご覧のとおり、ウェイには2つ以上のノードがあります。あなたは、ノードのペアのセットの中にそれぞれの道を破る必要がありますので、このファイルは、体重 111、112本 FRMのようなものになるだろう、DIST(111112)
112、111、 "
112、 543、DIST(112543)
543、112、 "
...

あなたはまた、一方通行の通り、およびその他の複雑な要因に対処する必要があると思います。すべての道が道ではないので、それを確認する必要があります。

これらのファイルは、領域の境界やその領域にどれくらいのものがあるかによっても非常に大きくなることがあります。

データをスクラップするために大量のカスタムコードを書く必要があることは間違いありません。私はそれを自分でやった。

+0

興味深いアイデア。それは私が期待していたものですが、.osmファイルについてはわかりませんでした。私は、生データを操作するために多くのカスタムコードが必要になると考えました。これは私に良いスタートを与える。ありがとう! – wlindner

0

ウェブサービスを使用せずにDistance Matrixに電話することができます。

+0

私はGoogle Maps Distance Matrix APIの使い方を知っています。私はこの計算をローカルで行う方法を見つけ出そうとしているので、APIを使ってGoogleが設定したリクエスト制限に遭遇することはありません。 – wlindner

+0

距離行列は、鳥がどのように飛ぶのかではなく、道路ごとの距離を計算することによって機能します。したがって、ローカルでこれを複製するには、すべての道路データが必要であり、その上に独自のルートサービスを実行する必要があります。 –

+0

合意。私はどこから始めるべきかわからないし、誰かがどこから始めるべきかについていくつかのアイデアがあることを望んでいた。 – wlindner

関連する問題