Hatena::ブログ(Diary)

hogemanのコアダンプ(´皿`;)

  ∧_∧   |ここは俺の日記帳なんだ
 (´・ω・`) / チラシの裏とでも思ってくれ
 ( つ旦O   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 と_)_)  旦 ドゾー
2004 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 07 | 09 | 10 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 08 | 09 | 10 | 12 |
2013 | 01 | 02 | 03 | 10 | 11 | 12 |
2014 | 01 | 04 | 10 |
2015 | 01 | 07 |
 | 

2007-11-26 SQL Server Spatial クイックツアー(1/7)

SQL Server 2008 CTP5(E) だが、VirtualPC 2007上の XP MCE(J)にVS2008(E)といっしょに入れてぼちぼち試用中。特に落ちたりすることもなく快適に動いてます。日本語入力や表示も特に大きな問題はありません。ただ、付属のBI Development Studio が VS2005 ベースであることとだけはリリース時期を考えるとちょっとしょぼーん。

で、これからしばらくはFAQになりそうな部分を中心に実際のクエリ例など書いてみます。

テーブル作成

普通GUIで作れます。空間インデックスGUIで設定できます*1

f:id:hogeman:20071126014508p:image

基本的なデータ挿入

こんな感じでデータ入れます。非GISな人でも、例をみれば緯度経度指定方法の雰囲気はわかるかと。SRIDって何?っていう人はとりあえず4326を入れておけばおk

-- geographyでもgeometryでもコンストラクタはSTGeomFromTextである。
insert into tbl1 (pkey, name, geog, geom) values (100, 'Gym Ghingnham',
  geography::STGeomFromText('POINT(135.0 35.0)', 4326),
  geometry::STGeomFromText('POINT(135.0 35.0)', 4326))

ただしこれはエラー*2になります。

VPCMCE(sa): Msg 6522, Level 16, State 1, Line 1
A .NET Framework error occurred during execution of user defined routine or aggregate 'geography': 
System.FormatException: 24201: Latitude values must be between -90 and 90 degrees.
*** 略 ***
The statement has been terminated.

なぜならSQL ServerではWKTの座標指定順をLON, LAT ではなくLAT, LON*3として解釈するからです。PostGIS等との互換注意。

上記サンプルSQLだと緯度の範囲外エラーになりますので、緯度、経度の順で指定してみます。

-- SRIDによる範囲チェックがかかるのだ。
 insert into tbl1 (pkey, name, geog, geom) values (100, 'Harry Ord',
  geography::STGeomFromText('POINT(35.0 135.0)', 4326),
  geometry::STGeomFromText('POINT(35.0 135.0)', 4326))

これは成功。

行によって同一列に複数SRIDが混在するのはかまいません。

 insert into tbl1 (pkey, name, geog, geom) values (101, 'Kihel Heim',
  geography::STGeomFromText('POINT(35.0 135.0)', 4301),
  geometry::STGeomFromText('POINT(35.0 135.0)', 4301))

これは成功。

野良SRIDを未定義のまま使うと怒られます。

 insert into tbl1 (pkey, name, geog, geom) values (101, 'Kihel Heim',
  geography::STGeomFromText('POINT(35.0 135.0)', 123456),
  geometry::STGeomFromText('POINT(35.0 135.0)', 123456))
VPCMCE(sa): Msg 6522, Level 16, State 1, Line 2
A .NET Framework error occurred during execution of user defined routine or aggregate 'geography': 
System.ArgumentException: 24204: The spatial reference identifier (SRID) is not valid. The specified SRID must match one of 

the supported SRIDs displayed in the sys.spatial_reference_systems catalog view.
*** 略 ***
The statement has been terminated.

geographyとgeometryには自動変換などはかからない。ごっちゃにしてもよしなにはしてくれない。

 insert into tbl1 (pkey, name, geog, geom) values (102, 'Diana Soriel',
  geometry::STGeomFromText('POINT(35.0 135.0)', 4326),
  geography::STGeomFromText('POINT(35.0 135.0)', 4326))

これはCLR UDTのエラーじゃないよね。

VPCMCE(sa): Msg 206, Level 16, State 2, Line 2
Operand type clash: sys.geometry is incompatible with sys.geography

別の行の同一列にポリゴンポイント混在して入れても大丈夫

 insert into tbl1 (pkey, name, geog, geom) values (103, 'Liry Borjarno',
  geography::STGeomFromText('POLYGON((35 135, 35 136, 36 136, 36 135, 35 135))', 4326),
  geometry::STGeomFromText('POLYGON((35 135, 35 136, 36 136, 36 135, 35 135))', 4326))

これは成功。

ポリゴンが右巻きか左巻きかは重要(Geographyだと右巻きInsertはエラーになる)。

 insert into tbl1 (pkey, name, geog, geom) values (104, 'Sochie Heim',
  geography::STGeomFromText('POLYGON((35 135, 36 135, 36 136, 35 136, 35 135))', 4326),
  geometry::STGeomFromText('POINT(35.135)', 4326))
VPCMCE(sa): Msg 6522, Level 16, State 1, Line 2
A .NET Framework error occurred during execution of user defined routine or aggregate 'geography': 
Microsoft.SqlServer.Types.GLArgumentException: 24205: The specified input does not represent a valid geography instance 

because it exceeds a single hemisphere. Each geography instance must fit inside a single hemisphere. A common reason for this 

error is that a polygon has the wrong ring orientation.
*** 略 ***
The statement has been terminated.

ポリゴンが右巻きか左巻きかは重要(Geometryだと右巻きInsert可)*4

 insert into tbl1 (pkey, name, geog, geom) values (104, 'Sochie Heim',
  geography::STGeomFromText('POINT(35 135)', 4326),
  geometry::STGeomFromText('POLYGON((35 135, 36 135, 36 136, 35 136, 35 135))', 4326))

これは成功。

つづく....

*1:空間インデックスアーキテクチャについては次回以降で説明

*2.Netの例外が上がってることに注意

*3:で、いいのかについての議論は長くなるのでこちらを参照

*4:内外判定も普通の人の直感とあってます。次回以降で

トラックバック - http://d.hatena.ne.jp/hogeman/20071126
 | 
あなたは348008人目の騙されて来た人です。ごめん。
Connection: close