SQL Server 2005 Analysis Servicesを使用しており、MDX クエリ内で距離を計算しようとしています。これにより、現在の場所の近くにあるアイテムの数を取得できます。緯度と経度でディメンションを作成し、計算を行うための .NET アセンブリも作成しましたが、クエリですべてを解決するのに苦労しています。
半径 100 マイルのアイテムを検索するクエリは次のようになります。
select FILTER([DimProducts].[Product].[Product],
ZipCalculatorLib.GetDistance(43.474208, [Zip].[Latitude], 96.687689, [Zip].[Longitude]) < 100) on rows,
[Measures].[RowCount] on columns
from MyCube;
そして、.NET の距離コードは次のようになります。
public static double GetDistance(double startLat, double endLat,
double startLong, double endLong)
{
return Math.Sqrt(Math.Pow(69.1 * (startLat - endLat), 2) + Math.Pow(Math.Cos(endLat / 57.3) * 69.1 * (startLong - endLong), 2));
}
ただし、そのクエリを実行すると、レコードがゼロになります。距離を 100 から 10000 に変更すると、半径 100 マイルの場合と同様のカウントが得られます。.NET クラスが平方根を実行していないように見えますが、そのコードを何度もテストしたところ、正しいように見えます。
問題を解決するためにどこを見ればよいかについて、誰か提案がありますか?
編集: 緯度と経度が GetDistance 関数に正しく渡されていないのではないかと思い始めたので、そこにコード行を追加して例外をスローし、それらが何であるかを示しました。以下を追加しました。
throw new ArgumentException("endLat", string.Format("endLat: {0}, endLong: {1}", endLat, endLong));
そして今、クエリを実行すると、次のエラーが表示されます。
マネージド ストアド プロシージャ GetDistance の実行が次のエラーで失敗しました: 呼び出しのターゲットによって例外がスローされました。endLat パラメータ名: endLat: 1033、endLong: 1033。
ここで問題は次のようになります: 実際の緯度の値を取得して、フィルター内のその関数を通過させるにはどうすればよいでしょうか? 現在、言語コードのみが渡されているようです。