3

私はこのテーブルをsqliteに持っています

Locations
ID
Lat ( latitude)
Lon ( longitude) 
Type
Name
City

たとえば、(自分の座標を使用して) テーブル内の最も近い点を取得するために必要な 100 のレコードがあります。

私がしたことは、現在のポイントとテーブル内の各ポイントの間の最短距離を取得し、最短距離を返すことですが、より良い解決策を探しています

ありがとう

4

8 に答える 8

6

可能な解決策は、関心のあるマップ全体にグリッドを使用し、特定の行/列にポイントを事前に割り当てることです。それで:

  1. 新しいポイントのグリッド位置を計算します - このためにデータベースに列を追加します。
  2. 現在のグリッド内のすべての座標の距離を計算します - 存在する場合
  3. 次のグリッドアウトですべての距離を計算する必要があります (現在の正方形で完全に中央に配置されている可能性は低いため、最適な一致があったグリッドから 1 つのグリッド距離を常にチェックする必要があります)。

実行する必要がある計算の数を大幅に削減する必要があります。

常に X 距離内の場所を見つけることが期待される場合は、座標 +/- x KM (正方形) の範囲内にある x/y 座標をクエリし、ポイントから xKM 円内にあるかどうかを計算します。そして最短を選びます。

更新- グリッド オプション

すでに 2 点間の距離の計算を行っていると想定しており、それについては説明しません。

アトラスが手元にある場合は、インデックスで場所を検索することで例を確認できます。ページと M5 のようなグリッド位置が表示されます。そのページに移動すると、数字と文字でラベル付けされた行と列があり、行 M と列 5 が交差する四角形を見ると、そこに都市が表示されます。システムでこれを行うには、次のことが必要です。

  1. グリッドの大きさを決定します (ポイントの密度 - 大きなグリッドとすべてのポイントが 1 つの正方形に収まるのは良くありません)。
  2. 各ポイントについて、それがどのグリッドにあるかを計算します。ポリゴンが複雑な場合は、コピーするポリゴン コードに大量のポイントがあります。(私の例のように)正方形を使用するだけの場合、各ポイントがどの行/列の間にあるかを判断するだけで済みます。
  3. ユーザーの場所と最寄りのポイントの例については、地図を参照してください。

ここに画像の説明を入力

したがって、ユーザーが緑色のマーカーである場合、そのユーザーは C4 になります。C4 内の他のすべてのポイントを検索し、最も近いポイントが #2 であると判断します。次に、見つけたアイテムよりも近いアイテムがないことを確認するために、1 つのグリッドをずっとチェックする必要があるため、これには正方形が含まれます: B3、B4、B5、C3、C5、D3、D4、D5 . そうしたら、C3 から #3 を選択して終了です。

ユーザーが他のポイントがない正方形 D2 にいた場合、たとえば C2 で最初の一致を見つけたでしょう。C1、C2、C3、D1、D3、E1、E2、E3をチェックする場合。見つかったら、B0-4、C0、C4、D0、D4、E0、E4、F0-4 の別の半径をチェックアウトする必要があります。これをできるだけ効率的にするには、グリッドの選択が重要であることがわかります。

また、これは、私の手描きの例とは異なり、グリッドが等しいと仮定していることに注意してください。

オプション 2:

結果が X km 以内にあると予想し、DB ですばやく計算する必要がある場合は、次のようにします。

LatMin = currentLatCoord-radiusValInDegrees
LatMax = currentLatCoord+radiusValInDegrees
LonMin = currentLonCoord-radiusValInDegrees
LonMax = currentLonCoord+radiusValInDegrees

SELECT * 
From Locations 
WHERE Lat BETWEEN LatMin AND LatMax
  AND Lon BETWEEN LonMin AND LonMax

これで、すべての結果が正方形になります。次に、それらが実際に円の中にあることを確認することが重要です。実際には、円の端にある座標よりも近い座標がある可能性があるため、隅にあるものをドロップする必要があります。したがって、各点について、最初に円の内側にあるかどうかを確認し (点が円の内側にあるかどうかをテストするための式)、距離を計算し、最も近いものを保持します。結果が出ない場合は、輪を広げてください。

繰り返しますが、適切な半径の選択はデータによって異なります。

于 2013-08-24T16:17:13.360 に答える
4

Have you check this Site of how to count for the distance between two points on Earth?

But just keep in mind that it give the Distance based on Earth Surface not based on the actual path to reach at that position. So if you want to count distance based on the Actual Path to reach that position then you can get it by using Google MAP API.

Google Maps API gives the distance between two point based on the actual path.

Hope this information surly help you.

Enjoy Coding... :)

于 2013-08-28T10:01:44.797 に答える
2

2 点間の距離: ((x1 - x2) ^ 2 + (y1 - y2) ^ 2) ^ 0.5. ただし、これらのポイント間の距離は直線です。ほとんどの場合、最寄りの橋を見つける必要がある一方通行の道路や水路は言うまでもなく、ローカルと高速道路のような変数があります。したがって、Google および Bing マップ API を使用することをお勧めします。限られた数の検索では無料です。

于 2013-08-24T17:32:21.957 に答える
1

極の近くで正しいことをどれだけ気にするかによって異なります

ピタゴラスの距離で最も近い場合は、SQL の orderby でこれを使用できます。

例えば。SELECT * FROM locations ORDERBY (Lat-myLat)*(Lat-myLat) + (Lon-myLon)*(Lon-myLon) LIMIT 1

技術的には最も正しいとは言えませんが、データベースからすべての場所を取得してそれらをループする手間を省きます。sqlite に任せてください。

于 2013-09-01T15:03:42.720 に答える
1

これは最良の選択肢ではありませんが。固定数の場所について、半径Nマイル/km
以内の最短距離を計算しようとしています/場所テーブルのデータは定期的に変更されていません。もう 1 つの列Distance_Index (DI)を自己マルチ参照キー ArrayType に追加します。手順を実行したら、この DI からの距離に従って昇順で ID を使用して DI を更新します。さぁ次からは距離はあなたと。データベースにクエリを作成して使用するだけです。

サンプル テーブル データ

さて、あなたの問題では、場所の数がN以内ではない場合、DIはあまり長くなりません。意見として。

于 2013-09-02T09:46:46.603 に答える
1

私の php クラスのヒルベルト曲線 @ phpclasses.org を使用できます。モンスター カーブとクワッドキーを使用して最短距離を見つけます。クワッドキーを検索するには、任意の深さを使用できます。

于 2013-09-01T23:53:58.147 に答える