0

ユーザーが場所を選択して、いくつかの関心のあるポイント (POI) からの距離を表示できるアプリケーションがあります。

これらの距離を取得するときに、各 POI から次に近い場所と次に遠い場所の ID も取得したいと考えています。例えば。10 か所の場所があり、それぞれが特定の POI から 1 マイル離れているとします。POI の名前、その POI からの距離、次に近い場所の ID、次の場所の ID を返します。最も遠い場所。結果セットの行の例: 'Football Ground', '1.5', 24, 784 (表示している場所はサッカー場から 1.5 マイルで、場所 24 が次に近く、784 が次に遠いため) .

注: 表示している場所が POI に最も近いか、POI から最も離れている可能性があります。その場合、次に近いまたは最も遠い場所の ID として -1 を返す必要があります。近づいたり遠ざかったりしないでください。

できれば一文で済ませたい。2 点間の距離を計算する関数を作成し、アプリケーションで使用しています。

 create FUNCTION [dbo].[fnc_calc_distance]
(
    @lat1 as float,
    @lng1 as float,
    @lat2 as float,
    @lng2 as float
)
RETURNS float
AS
BEGIN
    declare @result as float    
    select @result = (3959*acos(cos(radians(@lat2))*cos(radians(@lat1))*cos(radians(@lng1)-radians(@lng2))+sin(radians(@lat2))*sin(radians(@lat1))))
    RETURN @result
END

サンプルのテーブル構造/データは次のとおりです。

CREATE TABLE tbl_locations(
    [houseID] [int] NOT NULL,
    [lat] [decimal](14, 10) not NULL,
    [lng] [decimal](14, 10) not NULL) 

insert into tbl_locations
    values (1, 54.9834400000, -1.6314250000)
insert into tbl_locations
    values (2, 54.9860420000, -1.5912680000)
insert into tbl_locations
    values (3, 54.9882050000, -1.5707710000)

CREATE TABLE tbl_poi(
    [ID] [int] NOT NULL,
    [name] [varchar](32) NOT NULL,
    [lat] [decimal](14, 10) NOT NULL,
    [lng] [decimal](14, 10) NOT NULL)

insert into tbl_poi
    values (1, 'Football Ground', 54.9752430000, -1.6219210000)
insert into tbl_poi
    values (1, 'Train Station', 54.9898610000, -1.6047600000)

SQL Server 2008 を使用しています。

前もって感謝します。

クリス

4

1 に答える 1

1

これを処理する方法は、POI に関連する位置の順序付けられたセットを返すことです。アプリケーションによっては、これを最初の N 個のアイテムまたは X の距離内に制限することができます。特定の数に制限する場合、より多くのアイテムが利用可能であることを示す必要があるかどうかを知るために、アイテムがいくつあるかを知ると便利です. 残念ながら、これらすべてを 1 つのクエリで行う方法がわかりません。

私のやり方は、ユーザーが選択したページ (1 つのクエリ) で、選択した関心のあるポイントの名前、ID、緯度、および経度を保存することです。次に、これらをサーバーに戻し、2 番目のクエリで使用します (順序付きリストを取得するため)。必要に応じて、3 番目のクエリを実行して合計アイテム数 (count(*)) を調べ、「その他のアイテム」リンクを提供する必要があるかどうかを確認します。

2 番目のクエリは次のようになります。

 select TOP 10 t.id, t.name, t.lat, t.long, t.distance
 from (select id, name, lat, long, fnc_calc_distance(lat,@house_lat,long,@house_long) as distance
       from tbl_poi) t
 order by t.distance desc

ここで、ユーザーの選択から選択したパラメーターを渡します。

于 2010-01-10T13:18:51.397 に答える