0

C#、Asp.net、.net ver 2.0、および MSSQL 2005 で「Ne​​arBy Properties」モジュールを使用しています。私の要件は、

特定Latの値を DB に渡します。渡された値と DB に既に保存されている値Lanを比較して、最も近い 35 個のプロパティをフェッチする必要があります。これは SQL 部分自体で実行できますか?Lat LanLat Lan

私はこれをAsp.net部分的に行うことができます

  1. DataTable のすべての行をループしてから、
  2. このように、DataTable に「Miles」という追加フィールドを作成し、Km 値を挿入します。

    public decimal calcDistance(decimal latA, decimal longA, decimal latB, decimal longB)
    {
            double theDistance = (Math.Sin(DegreesToRadians(latA)) *
            Math.Sin(DegreesToRadians(latB)) +
            Math.Cos(DegreesToRadians(latA)) *
            Math.Cos(DegreesToRadians(latB)) *
            Math.Cos(DegreesToRadians(longA - longB)));
    
    return Convert.ToDecimal((RadiansToDegrees(Math.Acos(theDistance)))) * 69.09M * 1.6093M;
    }
    
  3. 次に、「マイル」フィールドで DataTable を並べ替え、DataTable から上位 35 行をフェッチします。

問題は、

すべての DB 行を asp 部分にフェッチし、for ループを実行してから並べ替えを行う必要があります。これには多くの時間とリソースが必要です。これを SQL 部分自体で実行する方法はありますか?

解決

以下の@Bacon Bitsの回答を微調整しました

SELECT PM.Id AS PropertyId,PM.Address,PM.PropertyImage,  ROUND((DEGREES(ACOS(SIN(RADIANS('9.98')) * SIN(RADIANS(PM.Latitude)) + COS(RADIANS('9.98')) * COS(RADIANS(PM.Latitude)) * COS(RADIANS(76.27999999999997 - PM.Longitude)))) * 69.09 * 1.6093),0) AS Miles 
FROM Tbl_PropertyMaster PM 
INNER JOIN dbo.Tbl_PropertyApproval AS PA  
ON PA.PropertyId = PM.Id 
WHERE PM.IsDeleted='False' AND PM.Enabled='True' and PA.Action='Approved' AND ROUND((DEGREES(ACOS(SIN(RADIANS('9.98')) * SIN(RADIANS(PM.Latitude)) + COS(RADIANS('9.98')) * COS(RADIANS(PM.Latitude)) * COS(RADIANS(76.27999999999997 - PM.Longitude)))) * 69.09 * 1.6093),0) < 1000 
ORDER BY Miles DESC
4

2 に答える 2

0

指定された 2 つの lan-lat パラメータ セット間の距離を計算するスカラー関数を作成します (asp.net 側で行ったように)。例:

SELECT TOP 35 * FROM Table_1 ORDER BY dbo.calcDistance(field_latitude,field_longitude, param_lat,param_long) DESC;

指定された 2 つの言語、緯度のセットから距離を計算する方法がわかりません。関数の実装を書くのはあなた次第です。ここここで使えます

于 2013-01-25T07:24:01.820 に答える
0

次のユーザー定義関数を試してください。これは、指定した関数を TSQL に変換したものです。これは、SQL Server が可能な限り正確である必要があります。クエリは、SQL Server 2005 以降で動作するはずです。おそらく、2 つの静的値の積を評価する必要があることに注意してください。私はただ怠け者です。

CREATE FUNCTION dbo.calcDistance (
    @latA AS NUMERIC(38, 35),
    @longA AS NUMERIC(38, 35),
    @latB AS NUMERIC(38, 35),
    @longB AS NUMERIC(38, 35)
    )
RETURNS NUMERIC(38, 35)
AS
BEGIN
    RETURN (DEGREES(ACOS(SIN(RADIANS(@latA)) * SIN(RADIANS(@latB)) + COS(RADIANS(@latA)) * COS(RADIANS(@latB)) * COS(RADIANS(@longA - @longB)))) * 69.09 * 1.6093)
END

SQLフィドル。私の例では、テストの場所とマンガロールのウィキペディア座標を使用しています。

于 2013-01-25T07:54:36.883 に答える