2010-12-29 14 views
2

私は緯度と経度が設定されたデータベースにユーザーを格納しています。私は私のサービス層にフィルターメソッドを書いてみたい。IQueryableで別の座標の半径を持つ点を見つける

私たちはリポジトリパターンでASP.NET MVCを使用しています。今のところ、SQLServerでエンティティフレームワークを使用します。 AzureまたはAmazonに後で切り替えることができます。

マイフィルタ方式は、次のようになります。

public static IQueryable<IPerson> InRadius(this IQueryable<IPerson> query, Coordinate center, double radius) 
    { 
     return (from u in query 
       where 
        (Math.Pow(u.Location.Coordinate.Latitude - center.Latitude, 2) + 
        Math.Pow(u.Location.Coordinate.Longitude - center.Longitude, 2)) < Math.Pow(radius, 2) 
       select u); 
    } 

はこれを見ると、何かが間違っています。これは通常の三角法の公式です。これは、その半径は緯度と経度はである単位と同じ測定であると仮定されて

私はこのコードには、いくつかの質問を持っている:。

  1. サービス層は見当がつかないなければならないのでORM、このクエリはデータベース上で実行されますか? Math.Pow(double,double)はデータベースに渡されますか?
  2. データベースで実行できない場合、このデータをフィルタリングする最も効率的な方法は何でしょうか。私はすべてをプルダウンしてから、アプリで並べ替えたいとは思わない。
  3. 地理的な質問:距離(マイル、kmのいずれか)をLatitudeとLongitudeが使用する単位に変換する方法はありますか?これは、半径の問題の場合です。

答えて

0
  1. それはおそらくPOWERにマッピングされていますが、あなたはそれを試してみて、確かに見つけることがあります。

  2. SQLに変換されない場合は、Math.Pow(someExpression, 2)someExpression * someExpressionに変更してください。それは間違いなくデータベース上で実行されます。

  3. 距離を経度と緯度を使って計算することはできません。物はデカルト平面とは地球の表面上では異なります。

+0

私は地球のためのアルゴリズムを見ています、彼らは罪と余弦を持っています。私はこれらをマッピングできるように私の関数を書く必要がありますか?最初から書かれた場合の任意の計算形式はsqlに変換できますか? –

0
  1. Math.Powは、SQLのappropiate方法エンティティ・フレームワークによりマッピングされなければなりません。
  2. 1.は真実ではないはずですが、データベースで実行される乗算によって電力を計算してください。
  3. 私はその質問に答えるための十分な知識がありませんが、正しく覚えていれば(参照フレームと実際の距離に依存して)地球の形のために非常に難しいでしょう。
関連する問題