2016-10-25 8 views
0

それぞれの位置のlat値とlon値を持つジョブのmysqlとsolrデータベースがあります。入力場所のx移動時間内のlat、lon項目のデータベースを検索する方法

現在、ユーザーはxマイル以内の場所でジョブを検索できます。 x分(旅行時間)以内に、場所によって検索する機能を提供したいと考えています。

私は検索を試みましたが、可能な旅行エリアを地図上にプロットする方法に関する情報のみを見つけることができます。この例はroute360からです:http://codepen.io/route360/pen/Wrbvmg

誰かが私のSolrコア(または必要ならばmysql DB)の文書を検索する方法を知っていますか?

これとは別の方法で対処する必要がありますか?

私はちょうど平均速度を使用します。ここで、作業溶液を得た(毎時30マイルを言う)、その後、ユーザ入力(私はサンルームを使用)

$speed = 30; //mph 
$time = $_GET['time']; //say it was '30' minutes 

// time is in minutes. get what that is as fraction of 60 
// to multiply speed by to get radius 

$fraction = $time/60; // would give 30/60 = 0.5; 

$radius = $speed * $fraction; // would give 30 * 0.5 = 15 miles radius 


// lat and lon are created earlier from user input location by querying my DB of locations 
$query->createFilterQuery('distance')->setQuery(
    $helper->geofilt(
     'latlon', 
     doubleval($lat), 
     doubleval($lon), 
     doubleval($radius * 1.609344) // default is KM so multiply to get miles 
    ) 
); 

これは正常に動作しますが、その時間的要因によって複数ましたそれほど正確ではありません。また、私は歩く、公共の交通機関のような旅行タイプでフィルタリングすることができません...任意のアイデア?

+0

これを確認してくださいhttps://www.scribd.com/presentation/2569355/Geo-Distance-Search-with-MySQL – Eric

答えて

1

旅行時間は単純な計算ではありません。

まず、入力場所の境界ボックスx距離単位N、S、E、Wの最小および最大の緯度と経度を計算します。境界ボックス内の位置のID、緯度および経度を取得する

次に、各点と入力位置の間の「直線」距離を計算して、円半径x距離単位。

惑星地球は球ではありません。世界の丸みのあるモデルが存在します。この問題は、偽陰性の重要性、処理するアイテムの数、許容できるパフォーマンスの構成要素によって異なります。

最終ステップでは、移動可能な点のモデルが有向グラフとして必要です。各locationIDを有向グラフのノードにマップします。

  1. 入力場所に対応するノードから、開始点(入力場所に続く各道路の次の分岐点)からナビゲートできる移動時間を各ノードに割り当てます。
  2. visitedノード(すでに移動時間があるノード)につながるエッジがあり、その値が制限時間よりも長くなっていないノードを選択します。訪問されていないノードに複数の訪問ノードから到達できる場合は、直接リンクされた各訪問メモを介して合計時間を計算し、最小値を割り当てます。
  3. ショートリスト内の各locationIDに関連付けられたノードがすべて値を持つまで、または未訪問ノードを期限切れの値よりも小さい訪問先ノードにリンクするエッジがない場合は、2を繰り返します。

これは、コストがあまり変わらないエッジで最も効果的な幅優先の手法です。ノードの選択を微調整して、短距離の直線距離が短いノードに優先順位を付けることで最適化することができますが、後で計算されるルートが低い場合には、各訪問ノードのルートを追跡する必要があります現在の最良ルートが再訪問されたノードを通過するすべてのノードからの差分の減算を必要とする。

私は約10年前に、コンピュータサイエンスの学位モジュールにこれらのグラフ問題のアルゴリズムのいくつかを検討しました。これは新しい問題ではありません。これを自分でコーディングするのではなく、使用できる既存のソリューションが存在する可能性があります。

+0

別の最適化オプション:速度でエッジを分類します。各位置について、入力位置に向かって右方向の20度以内の高速エッジを持つ点に到達する完全なグラフのサブパスを計算します。次に、入力位置から始めて、先に見つかったサブパスの終わりを完全グラフで検索しますが、高速エッジに達したら低速エッジを無視します。あらかじめ計算されたサブルーチンの共通ルーティングノード間に余分なエッジを追加することができます。 – Emyr

関連する問題