2

「与えられた点に重なる円」システムの最良の方法を見つける必要があります。

私はレストランなどのポイントがたくさんあり、すべてのアイテムには場所のポイントと、「食べ物を出す」などの半径があります。半径は異なり、3 kmのものもあれば、10kmのものもあります。ある点から探しています。例:「私の位置」の緯度/経度。

私の主張と重なるすべてのレストランを見つけるための最良の方法を見つける必要があります。(私に食べ物を持ってきます)。(円の点ではありませんが、どの円が私の点と重なっています。)

SQLServer2008で地理タイプとしてlat/lngを保存することを考えています。これはその方法ですか?

SQLServer上で直接クエリを実行できますか?または、コードでそれを行う必要がありますか?そして、それを行う方法は何ですか?

4

2 に答える 2

2

はい、これはまさにgeography空間的方法が得意とする種類のものです。以下に短い例を示します。

DECLARE @Restaurant TABLE (
    Name nvarchar(50),
    Location geography,
    DeliveryRadiusMetres int
);

INSERT @Restaurant
VALUES
-- long lat
('Dominos','POINT(-0.109339 51.532835)',2000 ),
('Pizza Hut','POINT(-0.102961 51.541157)',2000 );

ここでgeography値を構築するために、文字列からの暗黙的な変換を使用していることに注意してください。これは、舞台裏で を呼び出しますgeography::Parse

DECLARE @MyLocation geography = 'POINT(-0.115063 51.550231)';

SELECT
    Name
FROM
    @Restaurant R
WHERE
    R.Location.STDistance(@MyLocation) <= R.DeliveryRadiusMetres
;
于 2012-10-18T09:07:32.400 に答える
1

はい、Geography / Geometry データ型として円を点として描くことができます。その後、STWithin や STTouches などの関数を使用して、このデータに対して直接 SQL クエリを作成できます。

レストランの場所を半径のある点として設定します。次に、次のようなクエリを記述できます。

DECLARE @RestaurantCoverage Geometry
SET @RestaurantCoverage = 'Point(10 5)' --Location
SET @RestaurantCoverage = @RestaurantCoverage.STBuffer(5)     --Cover radius
DECLARE @YourLocation Geometry
SET @YourLocation = 'Point(13 5)' --Your location

SELECT @YourLocation.STWithin(@RestaurantCoverage)

http://technet.microsoft.com/en-us/library/bb933991.aspx

また、where ステートメントを使用してテーブル データに対して直接動作します。

于 2012-10-18T08:00:54.903 に答える