2

私は、ユーザーの位置を定期的に追跡して、ユーザーが地図上に旅の経路をプロットできるようにするモバイルアプリに取り組んでいます。今日の通勤であれ、先月の旅行であれ、アプリの他のユーザーが見ている時間枠で同様の旅をしたことを知らせるオプション機能を追加したいと思います。これを「パスマッチング」と呼んでいます。

データは現在、iOSとAndroidのアプリのプライベートストレージディレクトリ内のファイルにバイナリ形式でログインしており、簡単かつ迅速にスキャンして場所を読み取ることができます。各ファイルには1日の場所が含まれており、通常は約80KBまで実行されます。

パスマッチング機能を実装できるようにするには、明らかに、PHPを実行しているサーバー(もちろんユーザーの許可を得て)にこれらのロケーションログのアップロードを開始する必要があります。誰かがその地理空間の腕前のためにMongoDBを提案しました-しかし、私はおそらく人々が私を助けることができるいくつかの質問があります:

  1. 代わりにBSONを使用するようにロケーションロギングを変更できるようです。最初のフィールドはデバイスまたはユーザーIDで、その後に特定の日の場所のリストが続きます。その後、ファイルをサーバーにアップロードして、MongoDBストアにプッシュすることができます。ただし、オンラインドキュメントでは、mongodumpによって作成されたBSONファイルのインポートについてのみ言及しているようです。フォーマットは十分に安定しているので、どのアプリでもMongoDBで直接読み取り可能なBSONファイルを書き込むことができますか?

  2. MongoDBは、複数の場所を含むドキュメント、または複数のドキュメントにまたがるパスを形成する場所で地理空間クエリを実行できますか?それとも、これは、PHP側で、データベースの外部に過剰なロジックを必要とするものとしてあなたを襲いますか?

4

1 に答える 1

3
  1. フォーマットは完全に安定していますが、説明したことを行うためのツールはあまりありません。通常、それをバックエンドにアップロードすると、たとえば$_POST['locations']連想配列の配列になるようなものになります。サニタイズして、次のようにデータベースに保存します。

    $locs = sanitize($_POST['locations']); $doc = array('path' => array('type' => 'LineString', 'coordinates' => $locs), 'user' => $userId); $collection->insert($doc);

    上記の例では、最新の地理情報を使用しています ( http://docs.mongodb.org/manual/release-notes/2.4/#new-geospatial-indexes-with-geojson-and-improved-spherical -geometry )、これを取得するにはナイトリー ビルドが必要ですが、約 1 か月で安定版ビルドになるはずです。それ以前に必要な場合は、古い geo API を使用できます: http://docs.mongodb.org/manual/core/geospatial-indexes/

    MongoDB は BSON ファイルを読み取りませんが、mongorestore を使用して手動で読み込むことができます。ただし、ドライバーに低レベルの作業を任せることを強くお勧めします!

  2. 線 (新しい地理情報) と点の配列 (古い地理情報) を含むドキュメントを作成できます。「複数のドキュメントにまたがるパス」の意味がわかりません。

    追加するために編集: コメントに基づいて、{path : {$near : {$geometry : userPath}}}「近くの」パスを見つけようとする場合があります。また、ユーザーのパスの周りに多角形を作成し、多角形内でドキュメントをクエリすることもできます。

于 2013-02-06T04:15:43.060 に答える