我正在使用SQL Server 2005 Analysis Services,我試圖計算一個MDX查詢內的距離 - 這樣我就可以計算出當前位置附近的物品的數量。我創建了一個緯度爲&經度的維度,並且還創建了一個.NET程序集來完成數學運算 - 但我很難在查詢中解決這一切。MDX地理距離計算
我的查詢找到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));
,現在當我跑我的查詢,我得到以下錯誤:
Execution of the managed stored procedure GetDistance failed with the following error: Exception has been thrown by the target of an invocation.endLat Parameter name: endLat: 1033, endLong: 1033.
所以,現在的問題就變成了:我怎麼得到我的實際緯度值通過在過濾器中的功能?看起來只是一個語言代碼正在被傳入。
.net代碼中的計算是以英里爲單位的近似距離。這不是確切的,但足夠接近 - 因爲我不是指導導彈,只是尋找庫存:) SQL 2008不適用於這個項目。 – 2009-10-13 21:25:23