SQL Server 2008キタキター!( ゜∀゜)!…っということでとりあえずGeography

っというわけでさっそくダウンロード&インストールしてみました(・∀・)
地味に嬉しい新機能の追加が多いSQL Server 2008ですが、とりあえず分かりやすいところで空間データを使って遊んでみる。


まずはテスト用のテーブル作成から。

/* テストテーブル */
CREATE TABLE [Spot] (
    [Id] [int] NOT NULL,
    [Name] [nvarchar](max) NOT NULL,
    [Place] [geography] NOT NULL,
    CONSTRAINT [PK_Spot] PRIMARY KEY CLUSTERED ( [Id] ASC )
)

/* 空間インデックス */
CREATE SPATIAL INDEX [IX_Spot_Place] ON [Spot] 
(
    [Place]
) USING GEOGRAPHY_GRID 

ID、名称、場所(地理型)からなるデータ構造。
Place列には空間インデックスも張ってみる。


っで、テストデータを投入。

/* テストデータ */
INSERT INTO Spot ( Id, Name, Place ) VALUES ( 1, '甲府駅',
  geography::STGeomFromText( 'POINT( 138.56899 35.66715 )', 4326 ) )
INSERT INTO Spot ( Id, Name, Place ) VALUES ( 2, '山梨大学',
  geography::STGeomFromText( 'POINT( 138.57271 35.67781 )', 4326 ) )
...

そしてこのデータに対して、PlaceがあるPOLYGON内のデータを検索してみる。

/* 甲府駅周辺の検索 */
DECLARE @g geography;
SET @g = geography::STGeomFromText(
  'POLYGON( ( 138.569 35.668,
              138.567 35.666,
              138.569 35.666,
              138.570 35.668,
              138.569 35.668 ) )', 4326 );

SELECT Id, Name, Place.STPointN(1).Long, Place.STPointN(1).Lat FROM Spot
WHERE @g.STIntersects(Place) = 1

ちゃんと「甲府駅」はヒットして、「山梨大学」はヒットしませんのだ(・∀・)。


で、実行プランを見ると、Clusterd Index Scanになっていますけど(・ω・)?
試しに「WITH( INDEX( IX_Spot_Place ) )」をつけてSELECTしてみたら、なんか色々やってるプランになりましたが。
まあ、この辺はOiOi学んでいきましょうか。


とりあえず、今までPostGISで遊んでいたような事がSQL Serverだけでも出来るよ〜(・∀・)♪