1

このシナリオを考えると:

  1. 経度と緯度で指定された、世界中の 1,000,000 ポイントのオーダーがあります。
  2. 点 pc (経度と緯度で指定) と半径 rc に基づく円 c があります。
  3. どの点が円内にあるかを効率的に判断したい

私は C# と SQL サーバー 2008 に格納されている場所で開発しています。

したがって、私が見ているように、次の3つのオプションがあります。

  1. 位置を経度緯度浮動小数点数として保存し、C# で計算を実行します。

  2. 場所を地理データ型として保存し、次のように SQL Server 2008 で計算を実行します。

    CREATE TABLE UserLocations
    [UserId] [bigint] NOT NULL,
    [CurrentLocation] [geography] NOT NULL
    
    ALTER PROCEDURE sp_GetCurrentUsersInRange
    @userPoint geography, 
    @RangeInMeters int
    AS
    BEGIN
    
    select  UserId from UserLocations
    where @userPoint.STDistance(CurrentLocation) <= @RangeInMeters
    and UserId <> @userId
    
    END
    

    短所: LinqToSQL および LinqToEntities で地理データを使用する際の問題。

    利点: 大規模なデータに対して dbms 処理能力を使用し、SQL Server 空間インデックスを使用します。

3.Google の地理位置情報や計算サービスなどの Web サービスの使用。これまでのところ、そのような Web サービスは見つかりませんでした。

あなたの意見では、どれが最も効率的ですか? あなたの答えを正当化してください。

ありがとうございました

4

2 に答える 2

1

私の素朴なアプローチは、ポイント pc の周りに緯度/経度の境界ボックスを定義し、BETWEENそれらのボックス座標を使用してデータベースから選択することです。統計的には、そのテストに合格したポイントの約 79% が円内にあります。コードを簡単にチェックすると、円の外側にあるものを取り除くことができます。

私は SQL Server のジオメトリ機能に慣れていないので、ナイーブと言います。

于 2012-04-18T15:53:23.037 に答える
0

幾何学的な円を使用する代わりに、円の中心から (STDistance を使用して) 特定の距離内にあるすべてのレコードを選択できます。しかし、あなたがリストした交差ソリューションよりも速いか遅いかはわかりません。

100,000 ポイントが静的である場合、リストをメモリにロードし、バウンディング ボックスを使用して距離計算 (Haversine など) の使用を最小限に抑えるなど、おそらく C# で何かをコーディングできます。I / Oを最小限に抑えているため、おそらく高速になります。

ただし、ポイントが静的でない場合 (または SQL Server に格納されている場合) は、SQL Server を使用することを選択します。はるかに簡単です。適切な空間インデックスを作成することは間違いありません。SQL Server の空間インデックス作成は非常に優れており、上記のインメモリ ソリューションよりもパフォーマンスが優れていることに気付くかもしれません。

私はこの種の作業に LINQ を使用したことはありません。通常は、SqlConnection と Reader を使用して昔ながらの方法で使用します。Spatials と混合した LINQ が問題であることを読みました。

Google については知りませんが、そのような Web サービスはありますか?

于 2012-04-18T15:28:10.283 に答える