緯度と経度が設定されたデータベースにユーザーを保存しています。サービス層にフィルタ メソッドを記述したいと考えています。
リポジトリ パターンで 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) を緯度と経度で使用する単位に変換する方法はありますか? これは、半径の問題の場合です。