1

空間クエリを使用するために Web アプリのかなり適切なオーバーホールに着手する前に、この MySQL クエリが SQL Server 2008 で機能するかどうかを知りたいと思います。

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
        cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * 
        sin( radians( lat ) ) ) ) AS distance 
FROM markers HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

または、SQL Server 2008 でこれを行うより良い方法はありますか?

私のデータベースには現在、日本の軍事基地の近くにあるその緯度/経度のビジネスが保存されています。ただし、テーブルにクエリを実行して、指定された拠点の ID を含むビジネスを見つけています。

Biz table
----------------------
PK BizId bigint (auto increment)
Name
Address
Lat
Long
**FK BaseId int (from the MilBase table)**

中心の緯度/経度と指定された半径 (km 単位) に基づく空間クエリは、アプリにより適していて、いくつかの新しい可能性が開かれます。

どんな助けでも大歓迎です!

4

2 に答える 2

2

2 点間の距離を選択しているようです。SQL Server 2008 では、データ型のSTDistanceメソッドを使用できます。geographyこれは次のようになります。

SELECT   TOP 20
         geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p) 
FROM     markers
WHERE    geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p) < 25
ORDER BY geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p);

2 つの個別のフィールドではなくp、タイプのフィールドになります。パフォーマンスを向上させるために、フィールドに空間インデックスを作成することもできます。geographydecimalp

データ型を使用するには、次のようにgeographyフィールドを指定するだけgeographyですCREATE TABLE

CREATE TABLE markers ( 
    id     int IDENTITY (1,1),
    p      geography, 
    title  varchar(100) 
);

テーブルに値を挿入するmarkersと、次のようになります。

INSERT INTO markers (id, p, title) 
VALUES (
    1,
    geography::STGeomFromText('POINT(-122.0 37.0)', 4326),
    'My Marker'
);    

は経度-122.037.0は緯度です。

空間インデックスを作成すると、次のようになります。

CREATE SPATIAL INDEX  ix_sp_markers
                      ON markers(p)
                      USING GEOGRAPHY_GRID
                      WITH ( GRIDS = (HIGH, HIGH, HIGH, HIGH),
                             CELLS_PER_OBJECT = 2,
                             PAD_INDEX = ON);
于 2010-07-05T15:46:54.463 に答える
1

25 マイル以内のポイントを取得することにのみ関心がある場合は、距離の計算に球面または大円の計算を使用する必要はまったくありません...標準のデカルト距離式を使用するだけで十分です...

Where  Square(Delta-X) + Square(Delta-Y) < 225  

あなたがする必要があるのは、緯度の差と経度の差を、使用している単位のマイレージに変換することです(法定マイル、海里など)

海里を使用すると、緯度の各度 = 60 nm...
経度の各度は 60 * cos(Latitude) nm に等しくなり
ます ここで、両方のポイントが互いに 25 マイル以内にある場合、心配する必要はありません。ある点から別の点へのこの要因の違いについて...

于 2010-07-05T15:54:11.007 に答える