web-dev-qa-db-ja.com

ジオロケーションのベストプラクティス

フライト検索エンジンを書いています。モバイルユーザーの出発空港には、自分の場所に最も近い出発空港を事前に入力します。そのために、私たちの計画は

  1. 空港のリストを緯度/経度とともに検索します。
  2. HTML5 Geolocation (ユーザーに許可を求める)のようなものを使用して、ユーザーの地理位置情報を見つけます。
  3. ユーザーの位置とすべての空港の間の距離を計算して、最も近い空港を見つけます。
  4. 出発フォームに記入してください。

これは標準的な方法ですか?私はジュニアプログラマーで、この種の問題には慣れていません。ソリューションを開発する際に注意すべき障害はありますか? 1点と300か所の距離を計算するアルゴリズムが少し重くなるかもしれません。

3
Deinonychus

フライト検索エンジンを書いています。

検索エンジンを使用してください!

たとえば Apache Solr を使用すると、#3のステップが完了します。計算の詳細を知る必要はありません。必要な基本的な手順は、検索するジオコード(空港)を保存してから、ユーザーのジオコードを使用して検索を実行し、結果を含めるための最大距離を設定することです。

ジュニアであることを心配しないでください。これは、シニアがそれを行う方法です。つまり、既存のソリューションを探して、彼らが自分で解決する必要がないようにします。設定には多少時間がかかる場合がありますが、最終的には生産品質になります。

3
imel96

「最も近い」とは、近くの空港のリストを提示し、ユーザーが選択できるようにすることを意味します。リストには最大で(たとえば)10の空港が必要になる場合があります。

いいえ、計算はそれほど複雑ではありません。これには、浮動パスの計算が少し含まれますが、大きなストレスは発生しません。リストを事前にソートしたり、生の緯度/経度でフィルタリングしたりすることで、実際の計算の数を非常に簡単に減らすことができます。

緯度の1度は明らかに約111 kmです。 [なぜ?メーターの元々の基準は1000万メートル=パリを通る90度の緯度でした。]経度の1度は0からほぼ同じです。 [なぜ?明らかに極でゼロです。]

したがって、位置のプラス/マイナス10度の値を計算する最初のパスは、パフォーマンスを向上させるための有用なヒューリスティックであり、1000 km以内の範囲で何かを見つけることができます。 [オーストラリアでは、10のリストには入れません。]

大圏の距離はここにあります: http://en.wikipedia.org/wiki/Great-circle_distance しかし、あなたは知っていると確信していますそれ。

0
david.pfx

この種の空間クエリは、mysql、postgres、Oracle、sqlサーバーなどの空間対応データベースによって定期的に処理されます。私が除外している他の人がいると確信しています。

検索は、データベースに定義されているジオメトリタイプを使用したSQLクエリになります。関心のある特定のトピックは、最近傍クエリと呼ばれます。

SQLサーバー用にこのようなクエリを作成する方法の詳細については、このリンクを確認してください: http://msdn.Microsoft.com/en-us/library/ff929109.aspx 。 OGCの標準化により、多くのデータベースや空間ライブラリに非常によく似たオプションが見つかります。

このシナリオの基本的な考え方は、対象となるすべての空港の場所をポイントジオメトリタイプとして保持するテーブルを作成することです。次に、空間を分割するその列に空間インデックスを定義します。この空間インデックスは実際には特別なツリー構造です(quadtree http://en.wikipedia.org/wiki/Quadtree または http://en.wikipedia.org/wiki/のような) R-tree )これにより、大量のデータを手動の距離検索から除外できます。

これにより、5マイル以内にあるすべての空港を表示するなど、さらに興味深いクエリを簡単に実行することもできます。

0
Peter Smith