web-dev-qa-db-ja.com

地図データを保存するための理想的なデータ構造?

面接試験でこれを尋ねられました。テストは大丈夫でしたが、この質問に答えるのに十分な知識がありませんでした。データをすばやく照会するために使用できるデータ構造を知りたいです。

基本的には、ある種のデータ構造に道路のセクション(ポイントで構成されるライン)が格納されるという考え方です。ポイント(半径)から特定の距離内にある道路セクション(またはポイント)をすばやく照会できます。

12
Keyo

地理データを格納する一般的な方法は、Rツリー(またはR +ツリー、R *ツリーなどのバリアント)などの空間データ構造を使用することです。これは、地理データタイプが通常GIS対応で実装される方法です。 RDBMS。 (私は、MicrosoftのSQL Server 2008とPostGISの両方が地理タイプにRツリーを使用していることを知っています。)これらは、説明したすべての基本要件を満たし、交差、場所、距離、およびその他のクエリタイプを簡単にサポートします。

データのタイプによっては、kDツリー、四分木、八分木、バウンディングボリューム階層(軸に沿ったバウンディングボックスツリーを含む)などが一般的に使用されている場合もあります。オブジェクトのサイズと形状は交差クエリに関連するため、これは実際には3Dゲームでははるかに一般的です。これらは、RツリーよりもGISに使用される頻度が低くなっています。

16
greyfade

最適な結果を得るには、マップデータに対する操作の種類が異なれば、異なるストレージフォーマットが必要になります。たとえば、次の3つのタスクについて考えてみます。

  1. ポイントを指定して、そのポイントに最も近い道路を見つけます
  2. 特定のサイズの地理的エリアを前提として、そのエリア内にあるすべての道路を見つけます。
  3. 2つの道路がある場合、それらの間の最短ルートを見つけます。

要件の違いは非常に大きいため、マップへの「ライブ」変更に対応する必要がない限り、上記のタスクの1つに最適化された、データの3つの別々のコピーを保存する方が良いでしょう。 3つのタスクすべてを適切に処理できるフォーマットを考え出します。

0
supercat