私は緯度と経度が設定されたデータベースにユーザーを格納しています。私は私のサービス層にフィルターメソッドを書いてみたい。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);
}
はこれを見ると、何かが間違っています。これは通常の三角法の公式です。これは、その半径は緯度と経度はである単位と同じ測定であると仮定されて
私はこのコードには、いくつかの質問を持っている:。
- サービス層は見当がつかないなければならないのでORM、このクエリはデータベース上で実行されますか?
Math.Pow(double,double)
はデータベースに渡されますか? - データベースで実行できない場合、このデータをフィルタリングする最も効率的な方法は何でしょうか。私はすべてをプルダウンしてから、アプリで並べ替えたいとは思わない。
- 地理的な質問:距離(マイル、kmのいずれか)をLatitudeとLongitudeが使用する単位に変換する方法はありますか?これは、半径の問題の場合です。
私は地球のためのアルゴリズムを見ています、彼らは罪と余弦を持っています。私はこれらをマッピングできるように私の関数を書く必要がありますか?最初から書かれた場合の任意の計算形式はsqlに変換できますか? –