1

私は私のものに似た多くのSOの質問を見てきましたが、私の特定のケースでは何もうまくいかないようです。郵便番号と半径を使用して問題なく動作する半径ベースの検索の実装がありますが、人々は郵便番号の端に住むことができ、アプリケーションが郵便番号のある場所にのみ到達することが制限されるため、精度はやや低くなります。私がやろうとしているのは、ユーザーの場所の緯度と経度を使用し、SQL サーバーの空間機能を使用して、ユーザー定義の半径内の緯度と経度を持つ Locations テーブルから ID のリストを返すことです。これが私がこれまでに持っているものです:

SELECT Id FROM Location WHERE (GetDistanceBetween(39.0997, 94.5783, Latitude,     
Longitude)<=5)

GetDistanceBetween は次のように定義されています。

 FUNCTION [GetDistanceBetween]
(
@Lat1 float,
@Long1 float,
@Lat2 float,
@Long2 float
)
RETURNS float
AS
BEGIN

DECLARE @RetVal float;
DECLARE @startPoint geography;
DECLARE @endPoint geography;
SET @startPoint = geography::Point(@Lat1, @Long1, 4326)
SET @endPoint = geography::Point(@Lat2, @Long2, 4326)
SET @RetVal = (SELECT @startPoint.STDistance(@endPoint) / 3959 );


RETURN @RetVal;


END

Location テーブルには、Latitude、Longitude、および Id の 3 つの列が含まれています。各 Location 行は、情報が必要な別のテーブル Address に属しています。私がストアドプロシージャでやろうとしているのはこれです:

PROCEDURE [dbo].[GetGeoObjectsInRange](
@startLat as float (10),
@startLong as float(10), 
@range  as numeric (15) 
)

AS
BEGIN


Select * from dbo.Address WHERE geolocation_id in (SELECT Id from Location          
WHERE GetDistanceBetween(@startLat, @startLong, Latitude, Longitude)<=@range)
RETURN
END

ご覧のとおり、GetDistanceBetween 呼び出しの結果を別の選択に渡そうとしています。これは現在、結果を返しませんが、他の方法では 39 の結果が返されます。誰かが私が間違っていることを見ることができますか? 私は実際にはデータベースの男ではありませんが、プロジェクトの開発者だけであるため、それらの回避方法を学ばなければなりませんでした。問題がある場合は、NHibernate を使用して C# MVC3 アプリケーションからストアド プロシージャを呼び出しています。

助けていただければ幸いです。

4

0 に答える 0