第12章 空間オブジェクトを修飾する (Begining Spatial with SQL Server 2008)

 本章においては,他の既存のインスタンスの一部を修飾したり,結合したり,選択したりして geography 型や geometry 型のデータの新しいアイテムを生成するのに使われる多くのメソッドを紹介しよう.これらのメソッドは静的メソッドとは異なり,ジオメトリの座標点の表現から新しいデータのアイテムを代わりに生成することを了承いただきたい.

 本章で論ずるメソッドのいくつか,例えば STBuffer(), STConvexHull() および Reduse() は,単一のインスタンス上で動作する.他のメソッド,例えば STIntersection() および STDifference() は一つ以上のジオメトリ上で動作する.SQL Server 2008 におけるすべての空間機能性の場合のように,geometry 型および geography 型は利用可能なメソッドや,同じ方法でそれらを実装する同じセットをもつ必要はない.本章で紹介する各メソッドについて,いつどのようにそれが使われるかを見せよう.

付記 本章で論ずるメソッドは,それが呼び出された元のインスタンスにいかなる変化をも与えない.むしろ,それらはそれらのインスタンスで表現されるジオメトリの修飾により新しいインスタンスを生成する.

オブジェクトが有効であることを確保する

 geometry 型あるいは geography 型のインスタンスを静的メソッドから生成したとき,SQL Server は提供される表現をチェックして,正常なジオメトリを記述することを確保する.例えば,次のようないかなる不正なジオメトリをも静的メソッドを使って生成することはできない.

  • 2つの点より少ない LineStirng
  • 4つの点より少ない Polygon
  • 閉じていないリングを含む Polygon (リングの開始点と終了点が同一でないもの)
  • 外部リングと交差する内部リングを定義した Polygon

 これらのいかなるジオメトリをも生成しようとする試みは,SQLCLR において例外となり(SQL Server は geometry 型と geomgraphy 型の機能性を提供するために使う),問題のジオメトリによる規則違反の詳細を含むエラーメッセージを発生させることになる.

 先に列挙したような不正なジオメトリを生成することは不可能であるにも関わらず,OGC 仕様によると有効でないジオメトリの例(例えばそれ自身と重複する Polygon など)を生成することがなお可能である.geometry 型を使えばこれらの無効なジオメトリを蓄積し取得することは可能だが,それらの上で他のいかなるメソッドをも実行することはできない.このように,OGC 標準を検証しないジオメトリを識別できること,対処することは重要である.

付記 geometry 型で無効なジオメトリを蓄積し取得することは可能だが,それらに他のメソッドを使うことはできない.

 STIsValid() は geometry 型インスタンスが,問題のジオメトリの種類の OGC 仕様により有効であると要求される基準にすべて合致するか否かを検査する.geometry 型のインスタンス上でいかなるメソッドでも使うためには,STIsValid() メソッドの結果は,そのジオメトリが有効であると確認しなければならない.

サポートされるデータ型

 STIsValid() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型

付記 STIsValid() メソッドは geometry 型に対してのみ適用される.geography 型のすべてのインスタンスは”有効”と考えられている.

使用法

 STIsValid() メソッドはいかなるパラメータも要せず,geometry 型のいかなるインスタンスでもその有効性を検査するために次のように使われる.

Instace.STIsValid()

 そのインスタンスが,問題にしているジオメトリの種類の有効なインスタンスであるとの基準に合致したなら,STIsValid() メソッドは値 1 を返す.そうでないなら値 0 を返す.

 次の例は Polygon インスタンスを生成し,ついで STIsValid() メソッドを使ってその Polygon が有効であるか否かを次のように検査する.

DECLARE @Polygon geometry
SET @Polygon = geometry::STPolyFromText('POLYGON((0 0, 4 0, 4 3, 2 3, 2 4, 2 3, 0 3, 0 0))', 0)
SELECT
  @Polygon AS Shape,
  @Polygon.STIsValid() AS IsValid

 SQL Server はこのクエリを成功裏に実行し,いかなる警告やエラーも発生させない.しかし, STIsValid() メソッドの結果は,@Polygon で表現されるそのジオメトリが有効ではないことを示唆している.

0

 この場合,なぜそのジオメトリが無効であると STIsValid() は示したのだろうか.この疑問に答えるため,@Polygon ジオメトリを調べて Figure 12-1 に示そう(略).SQL Server Management Studio でこのジオメトリを視覚化するため,先述したクエリを実行後に空間結果タブをクリックしてみよう.

 Polygon のトップに,外部リングの点の間を通る線があり,自分自身を引き返さなくてはならないことに留意しよう.これは”スパイク”として知られる.外部リングの点の間に引かれた線が自身と交差するため,これはシンプルではなく,このリングで定義されるこの Polygon は無効である.

 SQL Server が @Polygon を生成するのを許しているにも関わらず,それは OGC 仕様によると有効ではない.仮に @Polygon 上で動作するいかなるメソッドでも使おうとすると,例えば STStartPoint() を使って開始点を取得しようとすると,

SELECT @Polygon.STStartPoint()

次のエラーメッセージを受け取ることになる.

System.Argumentation: 24144: This operation cannnot be completed because the instance is not valid. Use MakeValid to convert the instance to a valid instance. Note that MakeValid may cause the points of a geometry instance to shift slightly.

注意 STIsValid() が 1 を返したとしても(そのジオメトリが OGC 標準による正しいことを意味する),それはその geometry 型のインスタンスが論理的に意味を成すことを必ずしも意味しない.次のコードは有効なジオメトリを生成するが,その座標位置は EPSG 4326 空間参照系の使われる境界の外に飛び出している.

DECLARE @Point geometry = geometry::STPontFromText('POINT(300 200)', 4326)

ジオメトリを有効化する

 いかなる geometry 型インスタンスでも OGC 標準により有効化するためには,MakeValid() メソッドが適用される.これは geometry 型の新しいインスタンスを生成し,元のインスタンスで指定されたのと同じ点群を含んでおり,一つ以上の有効なジオメトリを使って表現される.いくつかのケースでは,MakeValid() は一つ以上の点群の座標値を結果のジオメトリで元の位置から少しずらす可能性がある.

サポートされるデータ型

 MakeValid() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型

使用法

 MakeValid() 関数はいかなるパラメータも要せず,geometry 型のいかなるインスタンス上でも次のように呼び出される.

Instance.MakeValid()

 結果の値は geometry 型インスタンスであり,MakeValid() メソッドが呼び出されたインスタンスと同じ SRID を使って定義され,OGC 標準に準拠している.そのジオメトリは元のインスタンスで定義された点群をすべて有しているが,その点群を表現するため,一つ以上の異なる種類のジオメトリを使う可能性がある.

注意 同じ点群を有効なジオメトリ内に含むため,MakeValid() メソッドで返るジオメトリの種類は提供される元のものとは同じとは限らない.

次の例は不正な Polyogn ジオメトリ @Invalid を生成し,外部リングにスパイクを含んでいる.ついでMakeValid() メソッドを使って,同じ点の集合を表現する有効なジオメトリに @Valid 変数を設定する.

DECALRE @Invalid geometry
SET @Invaid = geometry::STPolyFromText('POLYGON((0 0, 4 0, 4 3, 2 3, 2 4, 2 3, 0 3, 0 0))', 0)
DECALRE @Valid geometry
SET @Valid = @Invalid.MakeValid()
SELECT
  @Invalid AS Shape,
  @Invalid.STAsText() AS WKT
UNION ALL SELECT
  @Valid AS Shape,
  @Valid.STAsText() AS WKT

 MakeValid() メソッドから取得された有効なジオメトリの WKT 表現は次のようである.

GEOMETRYCOLLECTION (LINESTRING(2 4, 2 3), POLYGON ((0 0, 4 0, 4 3, 2 3, 0 3, 0 0)))

 スパイク内に含まれる点を表現するため,MakeValid() メソッドに生成された結果のジオメトリは Geometry Collection であり,Polygon と LineString の両者を含んでいる.この Geometry Collection は有効であり,STIsValid() メソッドを使って次のように確認できる.

SELECT @Valid.STIsValid()

 その結果は @Valid が有効であるというものだが,以下である.

1

空間オブジェクトを結合する

 STUnion() メソッドは2つの geometry 型あるいは geography 型インスタンスの,結合する点の集合を含む単一のジオメトリを生成するのに使われる.結果のジオメトリは両ジオメトリの含まれるすべての点群を表現できるオブジェクトで最も単純なものになる.Figure 12-2 に様々なジオメトリの組み合わせに STUnion() メソッドを使った結果を示す(略).

STUnion() およびカーソルを使ってジオメトリを集約する

 STUnion() メソッドは2つのジオメトリに含まれる点群の和から生じるジオメトリを生成する.それはプラス演算子を使うことと大雑把に等価であるとして考えることができる.言い換えると,SELECT A.STUnion(B) とは非空間データにおける SELECT A + B に似ている.geometry 型ないし geography 型データの全列に含まれるすべての要素の和を仮に得たいとしたら?言い換えるなら,SELECT SUM(A) と空間的に等価なのは何か?

 SQL Server はこのような空間的集約は一切定義していない.しかし,テーブルから空間データの各行にカーソルをフェッチして,繰り返しそれらを次のアイテムに STUnion() で結合することはできる.このアプローチを示すため,サンプルの geometry 型の3つの列を含むテーブルをまず,次のように作成する.

DECLARE @GeomTable TABLE (GeomColumn geometry)
INSERT INTO @GeomTable VALUES
  (geometry::STPointFromText('POINT(12 9)', 0)),
  (geometry::STLineFromText('LINESTRING(5 2, 9 4)', 0)),
  (geometry::STPolyFromText('POLYGON((2 0, 4 3, 5 8, 2 4, 2 0))', 0))

 @GeomTable テーブル内の各ジオメトリの和から集約を生成するため,カーソルを使って各個のジオメトリを変数 @Geom にフェッチし,一度に一個ずつ,ついで二番目の変数 @MultiGeom に次のコードのように結合される.

DECLARE @Geom geometry
DECLARE @MultiGeom geometry = geometry::STGeomFromText('GEOMETRYCOLLECTION EMPTY', 0)
DECLARE GeomCursor CURSOR FOR SELECT GeomColumn FROM @GeomTable
OPEN GeomCursor
FETCH NEXT FROM GeomCursor INTO @Geom
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @MultiGeom = @MultiGeom.STUnion(@Geom)
  FETCH NEXT FROM GeomCursor INTO @Geom
END
CLOSE GeomCursor
DEALLOGATE GeomCursor

 結果を検査するため,@MultiGeom インスタンスの WKT 表現を選択し,次の行をコードの文末に付加する.

SELECT @MultiGeom.STAsText()

 結果の集約ジオメトリは次のとおりである.

GEOMETRYCOLLECTION (
  POINT (12 9),
  LINESTRING (9 4, 5 2),
  POLYGON ((2 0, 4 3, 5 8, 2 4, 2 0))
)

サポートされるデータ型

 STUnion() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型
  • geography 型

使用法

 STUnion() メソッドは geometry 型あるいは geography 型の2つのインスタンスを和を生成するのに次のように使われる.

Instance1.STUnion(Instance2)

 結果のジオメトリの種類は両インスタンスの点の集合を表現することのできる最も単純なジオメトリになる.仮に Instance1 と Instance2 が異なる種類の場合,結果の種類は Geometry Collection となる.

 次の例はニュージーランドの北島と南島の形状の近似を表現する2つの単純な Polygon ジオメトリを生成する.ついで STUnion() メソッドを使って陸地を表現する MultiPolygon インスタンスを生成する.

DECLARE @NorthIsland geography
SET @NorthIsland = geography::STPolyFromText(
  'POLYGON((175.3 -41.5, 178.3 -37.9, 172.8 -34.6, 175.3 -41.5))',
  4326)
DECLARE @SouthIsland geography
SET @SouthIsland = geography::STPolyFromText(
  'POLYGON((169.3 -46.6, 174.3 -41.6, 172.5 -40.7, 166.3 -45.8, 169.3 -46.6))',
  4326)
DECLARE @NewZealnad geography = @NorthIsland.STUnion(@SouthIsland)
SELECT
  @NorthIsland AS Shape,
  @NorthIsland.STAsText() AS WKT
UNION ALL SELECT
  @SouthIsland AS Shape,
  @SouthIsland.STAsText() AS WKT
UNION ALL SELECT
  @NewZealand AS Shape,
  @NewZealand.STAsText() AS WKT

 STUnion() メソッドの結果の WKT 表現は次のとおりである.

NULTIPOLYGON (((174.300000083901 -41.599999939451862, 172.5 -40.7, 166.30000014074497 -45.80000004311343, 169.3 -46.6, 174.30000008390141 -41.599999939451862)), ((178.29999997944242 -37.899999916892376, 172.79999991110731 -34.59999991355131, 175.3 -41.5, 178.29999997944242 -37.899999916892376)))

 この結果に含まれる座標に驚いたなら,サイドバー”浮動小数点空間データの不確実性”を必ずチェックすること.

浮動小数点空間データの不確実性

 STUnion() メソッドの例で見たように(”空間オブジェクトを結合する”のセクションで示した),結果のジオメトリで定義された最初の点の座標値が 174.30000008390 および -41.599999939451862 であったことを見て驚いたかもしれない.STUnion() メソッドは2つのジオメトリに含まれる点の和を生成するが,この点はこのメソッドで使われたどちらのジオメトリにも含まれていない.Point(174.3, -41.6) はしかし,STUnion() の結果はなぜこれらの座標値についてエラーを起こさないのか?

 空間データ型は座標を浮動小数点値で蓄積することを思い出そう.浮動小数点の計算が実行されるとき,これらは得られた結果について固有の不正確さであり,実数を浮動小数点系では正確に表現できないという事実からもたらされる.十進数 0.1 に相当する正確なバイナリ浮動小数点値は,例えばだが,次のように無限に循環するバイナリシーケンスとなる.11001100110011001100…

 座標値が浮動小数点バイナリフォーマットで表現される最も近い数に丸められねばならないため,特定の空間メソッドではエラーが発生する可能性がある.これは空間データに特異的なものではなく,浮動小数点値を使ういかなる計算にも適用されることを明記しておく必要がある.次の例を考えてみよう.

DECLARE @coordinate float = 174.3
DECLARE @a float = 1
DECLARE @b float = 1.001
SELECT @coordinate * (@b - @a) * 1000

 有理数を使って計算を実行すると,この式は 174.3*0.001*1000 に等しく,元の提供された座標値である,答えは 174.3 に至ると思うだろう.しかし,このクエリを実行したとき,実際に得られるのは 174.29999999981 であり,これは浮動小数点法を使って得られる最も近い近似である.

 空間データの操作を実行するいかなるメソッドも,これらのように座標値に微妙な変化をもたらす.これらの偏差の大きさは,個別に考えた際にはデータのいかなるアイテムにも実質的に著明な影響を与えることはほぼ稀であるが, 座標値の正確な評価と比較を要するようないかなるアプリケーションを設計するときにも,これは考慮すべき重要な点である.

2つのジオメトリの交差を定義する

 2つのジオメトリの交差は両インスタンスが共通に持つ点から生成される.交差により定義される点が単一で一致した面にあるなら,その交差は単一のジオメトリとなる.しかし,交差する点が分離しているなら,結果のジオメトリは多要素インスタンスとなる.Figure 12-3 に異なる種類のジオメトリ間で生成される交差の例を示す(略).

 2つのジオメトリの交差に含まれる点を表現するジオメトリを生成するためには,Figure 12-3 に示すように,STIntersection() メソッドを使う.

サポートされるデータ型

 STIntersection() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型
  • geography 型

使用法

 STIntersection() メソッドは geometry 型あるいは geography 型のインスタンス上で次のように使われる.

Instance1.STintersection(Instance2)

 このメソッドの結果は同じデータ型のオブジェクトになり,Instance1 および Instance2 により定義されるのと同じ SRID を使って定義される.このオブジェクトにより表現されるジオメトリの種類は,2つのジオメトリの交差に含まれるすべての点を含むことのできるジオメトリのうち,最も単純な種類となる.

付記 STIntersection() は2つの geometry 型インスタンス間,2つの geography 型インスタンス間なら交差を決定することができるが,geometry 型インスタンスと geography 型インスタンスとの間では交差を決定することができない.

 アッピア街道(あるいは Via Appia)は古代ローマの道路であり,ローマからイタリア南東部の都市 Brindisi に至る.それは世界史の中で最も重要な道路の一つである.というのは,ローマ軍が男性を迅速に配備しイタリア全土に供給するのに使い,その結果疑いなく軍事的な成功に貢献したからである.その経路に沿って,アッピア街道はポンティーヌ湿地を通過し,そこは死に至るマラリアを媒介する蚊がはびこっていた.次の例はアッピア街道を表現する LineString および,マラリアのはびこる湿地帯を表現する Polygon を生成する.ついでSTIntersection() メソッドを使い,湿地帯と交差する道路の危険なセクションを決定する.

DECLARE @Marshes geography
SET @Marshes = geography::STPolyFromText(
  'POLYGON((12.94 41.57, 12.71 41.46, 12.91 41.39, 13.13 41.26, 13.31 41.33, 12.94 41.57))',
  4326)
DECLARE @ViaApppia geography
SET @ViaAppia = geography::STLineFromText(
  'LINESTRING(
    12.51 41.88, 13.25 41.28, 13.44 41.35, 13.61 41.25, 13.78 41.23, 13.89 41.11,
    14.22 41.10, 14.47 41.02, 14.79 41.13, 14.99 41.04, 15.48 40.98, 15.82 40.96,
    17319 40.51, 17.65 40.50, 17.94 40.63)',
  4326)
SELECT
  @ViaAppia AS Shape,
  @ViaAppia.STAsText() AS WKT
UNION ALL SELECT
 @Marshes AS Shape,
  @Marshes.STAsText() AS WKT
UNION ALL SELECT
  @ViaAppia.STIntersection(@Marshes) AS Shape,
  @ViaAppia.STIntersection(@Marshes).STAsText() AS WKT

 STIntersecion() メソッドの結果の WKT 表現は次のとおりである.

LINESTRING (13.227901121493 41.298133443052509, 12.911513729116241 41.556421282182363)

 Figure 12-4 にこの例をイタリアの地図上に示す(略).STIntersection() メソッドの結果は湿地を表現する Polygon を通過する LineString のセクションに対応する.

2つのジオメトリ間の差分を識別する

 STDifference() メソッドは一つの geometry 型ないし geography 型インスタンス内部に含まれるが二番目のインスタンス内には含まれない,一意の点群を単離し返すのに使われる.Figure 12-5 に2つの様々な種類のジオメトリ間で差分を生成するのに STDifference() メソッドを使った結果を示す(略).

サポートされるデータ型

 STDifference() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型
  • geography 型

使用法

 STDifference() メソッドは一つの geometry 型あるいは geography 型インスタンスともう一つのインスタンスとの間の差分を単離するのに次のように使われる.

Instance1.STDifference(Instance2)

 STDifference() メソッドの結果は geometry 型ないし geography 型インスタンスであり,すべての点は Instance1 に含まれるもので,Instance2 に含まれるものではなく,提供された両インスタンスと同じ SRID およびデータ型を使って定義される.

 英国気象局(通常”Met Office” と称される)は 16 機のレーダーネットワークを操作し,英国全体の気象を継続的に監視し予測している.各レーダーは高性能の降雨量および水文データを提供することができ,その範囲は 75km 近くに及ぶ.このレーダーネットワークにより提供されるカバー範囲を Figure 12-6 に示す(略).

 STDifference() メソッドの使用法を示すため,次のコード例は,すべての英国気象局のレーダーの位置を表現する MultiPoint インスタンスを生成する.ついで STBuffer() を使って MultiPolygon インスタンスを生成し,MultiPoint ジオメトリ内の各点を中心とした個別の Polygon を含んでおり,これはそのレーダーのカバーする範囲を表現したものである.最後に,STDifference() メソッドを使ってイギリス諸島を表現する MultiPolygon ジオメトリとレーダーのカバー範囲を表現する MultiPolygon との間の差分を計算する.

DECLARE @Rader geography
SET @Rader = geography::STMPointFromText(
  'MULTIPOINT(
    -2.597 52.398, -2.289 53.755, -0.531 51.689, -6.340 54.500, -5.223 50.003,
    -0.559 53.335, -4.445 51.980, -4.231 55.691, -2.036 57.431, -6.183 58.211,
    -3.453 50.963, 0.604 51.295, -1.654 51.031, -2.199 49.209, -6.259 53.429,
    -8.923 52.700)', 4326)
DECLARE @RaderCoverage geography
SET @RaderCoverage = @Rader.STBuffer(75000)
DECLARE @BritishIsls geography
SET @BritishIsls = geography::STMPolyFromText(
  'MULTIPOLYGON(
    ((0.527 52.879, -3.164 56.0197, -1.626 57.631, -4.087 57.654, -2.989 58.582,
    -5.0977 58.514, -6.504 56.240, -4.746 54.670, -3.516 54.848, -3.252 53.432,
    -4.614 53.301, -4.922 51.697, -3.12 51.505, -5.625 50.032, 1.626 51.286,
    0.791 51.423, 1.890 52.291, 1.274 52.959, 0.527 52.879)),
    ((-6.548 52.123, -5.317 54.518, -7.734 55.276, -9.976 53.354, -9.888 51.369,
    -6.548 52.123)))', 4326)
SELECT
  @BritishIsls AS Shape,
  @BritishIsls.STAsText() AS WKT
UNION ALL SELECT
  @Rader AS Shape,
  @Rader.STAsText() AS WKT
UNION ALL SELECT
  @BritishIsls.STDifference(@RaderCoverage) AS Shape,
  @BritishIsls.STDifference(@RaderCoverage).STAsText() AS WKT

 STDifference() メソッドの結果の MultiPolygon は,英国気象局により操作されるレーダーでカバーされないイギリス諸島の陸地のエリアを表現する.次の WKT 表現のように.

MULTIPOLYGON (((-0.59313915744618673 50.956746798594949, -0.35419290461396075 50.99445115...

2つのジオメトリ間の対称差を計算する

 STSymDifferece() メソッドは2つのジオメトリ間の対称差を計算する.これはジオメトリ A かジオメトリ B かのいずれかに属するすべての点の集合であり,両方に属する点ではない.言い換えると,STSymDifference() は2つのジオメトリ由来の点の一意の集合の和を与える.

付記 A.STSymDifference(B) は論理的に A.STDifference(B).STUnion(B.STDifference(A)) と同義である.

 Figure 12-7 に異なる種類のジオメトリのいくつかの例に STSymDifference() メソッドを使って得られた結果を示す(略).

サポートされるデータ型

 STSymDifference() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型
  • geography 型

使用法

 STSymDifference() メソッドは geometry 型ないし geography 型の2つのいかなるインスタンス間でも対称差を計算するのに次のように使われる.

Instance1.STSymDifference(Instance2)

 結果は2つのジオメトリ間の対称差を表現するそれらの点群を含むジオメトリであり,提供されたインスタンスと同じデータ型と SRID を使っている.

付記 STSymDifference() は対称であるゆえに,2つのジオメトリを比較したとき,Instance1 で提供されるものと Instance2 で提供されるものとに差がつかない.

 2つの競合するローカルラジオ局 KWEST と KEAST のある都市について考えてみよう.それぞれの局は独自の送信機から放送しており,都市の異なる地域に位置する.KWEST の送信機は経度 -87.88 緯度 41.86 に位置している.それは 10km の範囲で放送している.KEAST の送信機は経度 -87.79 緯度 41.89 に位置しており,8km の範囲で送信する.各局のカバーエリアを Polygon で表現し,STSymDifference() メソッドを使ってそれらの対称差を計算することにより,都市の中で,両方の局ではなくどちらか一局しか受信できない地域を特定できる.次のコードで示す.

DECLARE @KWEST geography, @KEAST geography
SET @KWEST = geography::Point(41.86, -87.88, 4269).STBuffer(10000)
SET @KEAST = geography::Point(41.89, -87.79, 4269).STBuffer(8000)
SELECT
  @KEAST.STSymDifference(@KWEST) AS Shape,
  @KEAST.STSymDifference(@KWEST).STAsText() AS WKT

チップス この例は STBuffer() メソッドを使って,各送信機を受信できる地域 @KWEST および @KEAST を定義する2つの Point について円形の Polygon を生成する.STBuffer() メソッドは本章で更に詳しく論じる.

 STSymDifference() メソッドの結果は MultiPolygon ジオメトリであり,Figure 12-8 に示す(略).

ジオメトリを簡素化する

 Reduce() メソッドは,なおその全体の形状を維持しようと試みながら,ジオメトリの形状を定義するのに使われる点の数を減らすことで,ジオメトリを簡素化するのに使われる.これを達成するため,Reduce() メソッドは Douglas-Peucker アルゴリズムを実装しており,これは数学的手法によりジオメトリのより簡素な近似から許容内の偏差内にあるすべての点を取り除くものである.

サポートされるデータ型

 Reduce() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型
  • geography 型

使用法

 Reduce() メソッドは geometry 型や geography 型のいずれのインスタンス上でも次のように使われる.

Instance.Reduce(tolerance)

 単一のパラメータ tolerance は Douglas-Peucker アルゴリズムに提供する許容誤差である.この値は,元のジオメトリから簡素化したジオメトリの結果内のいかなる点でも,許容される偏差の最大値を表している.その許容範囲は正であり,浮動小数点であり,線形単位で計測されたものでなくてはならない.geography 型インスタンス上で使われたとき,tolerance は,そのインスタンスが定義された SRID に関連する sys.spatial_reference_system テーブルの unit_of_measure 列により定義された単位で計測されたものである.geometry 型インスタンス上で使われたとき,tolerance は,そのインスタンスの座標と同じ測定単位で計測される.

 その許容範囲が大きくなるほど,Ruduce() メソッドにより返る結果のジオメトリの簡略さの度合いは大きくなる.Figure 12-9 に,オーストラリアを表す Polygon インスタンス上で Reduce() メソッドを作用させた場合に異なる許容度を提供した効果を示す(略).

 Douglas-Peucker アルゴリズムは再帰アルゴリズムである.最初のパスでは,最初のジオメトリの近似を生成し,それは開始点と終了点を直線で直接結ぶことで簡素化させようとするものである.2回目のパスでは,そのジオメトリのいかなる点でも,この近似から許容誤差よりも遠くに位置するなら,一番遠いところに位置する点を追加し,より洗練された近似を生成する.その後のパスでは,この過程を何度も繰り返し,近似をさらに洗練させ,元のジオメトリ内に含まれていたすべての点が,生成された近似からの許容範囲内に収まるまで続ける.この点で,Reduce() メソッドは最後の反復により生成された近似を返す.Figure 12-10 に,Reduce() メソッドにより使われる Douglas-Peucker アルゴリズムが LineString ジオメトリを簡素化するのに使われるのを示す(略).

付記 Point および MultiPoint ジオメトリは簡素化することができない.これらの種類のジオメトリに使われたとき,Reduce() メソッドは元の,なんの修飾もされていないジオメトリを返す.

 次の例は LineString を生成し,Reduce() メソッドを使って,元のジオメトリ内のいかなる点も偏差が1単位以内のジオメトリの簡素化した削減を取得する.

DECLARE @LineString geometry
SET @LineString = geometry::STLineFromText(
  'LINESTRING(130 33, 131 33.5, 131.5 32.9, 133 32.5, 135 33, 137 32, 138 31, 140 30)', 0)
SELECT
  @LineString AS Shape,
  @LineString.STAsText() AS WKT
UNION ALL SELECT
  @LineString.Reduce(1) AS Shape,
  @LineString.Reduce(1).STAsText() AS KWT

 Reduce() メソッドから得られた簡素化したジオメトリの WKT 表現は次のとおりである.

LINESTRING (130 33, 135 33, 140 30)

オブジェクト周囲にバッファーを生成する

 あらゆるジオメトリは一つ以上の点を定義し,その内部,そのジオメトリにより占められる空間の面に位置する.そのジオメトリ自身の内部に含まれるこれらの点に加えて,特定のオブジェクトのすぐ周囲の空間の面に位置するそれらの点を考えたくなる多くの場合があるかもしれない.そのために”バッファー”を生成することができる.バッファーとはあるジオメトリの与えられた距離以内に位置するすべての点からなる面のことである.Figure 12-11 に異なる種類のジオメトリ周囲のバッファーの定義により生成された結果を示す(略).

 STBuffer() メソッドは,あるオブジェクトの一定量のバッファリングの結果のジオメトリを生成するのに使われる.単一要素のインスタンスに使われたとき,一般には Polygon を生成し,その外周は,そのオブジェクトから与えられた距離以内に位置する点を結ぶことで定義される.多要素インスタンスのバッファーを生成するとき,コレクション内の各要素のバッファーは個別に計算され,個別のバッファーされたジオメトリはすべて結合されて返る.言い換えると,STBuffer() は多要素ジオメトリ全体の周囲にバッファーを生成するのではなく,個別の要素にバッファーを生成する.

チップス Point オブジェクトに STBuffer() メソッドを使うとき,中心がその点である固定半径の Polygon を生成する.これは”円形” Polygon オブジェクトを生成する方法として有用である(このメソッドは実際には,真円というより円に近い多角形を生成する).

サポートされるデータ型

 STBuffer() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型
  • geography 型

使用法

 STBuffer() メソッドは,geometry 型や geography 型いずれのどんな種類のジオメトリでも次のように使われる.

Instance.STBuffer(distance)

 STBuffer() メソッドを呼ぶとき,単精度小数点値 distance を渡さなければならないが,それは生成される緩衝地帯の半径を表現している.geography 型のアイテム上で使うとき,このパラメータの値は,メソッドの呼ばれたインスタンスの空間参照に定義された線形計測単位で特定される.例えば,SRID 4296 で定義された geography 型のいかなるインスタンスでもその緩衝地帯の半径は,メートル単位で指定されなければならない.geometry 型のアイテム上で使うときは,distance パラメータはそのジオメトリ自身の座標値と同じ計測単位で指定される.

チップス geography 型の空間参照系の線形計測単位を確認するため,sys.spatial_reference_system テーブルの unit_of_measure 列の値を見ることができる.

 STBuffer() メソッドの結果は geometry 型あるいは geography 型インスタンスで,バッファーされたジオメトリ内部に含まれる点すべてを含んでおり,呼び出されたインスタンスと同じ SRID とデータ型を使って定義される.

チップス STBuffer() メソッドに渡された distance パラメータがゼロより小さかった場合は,結果のジオメトリは,ジオメトリ内部から記述された距離内にある点を取り除いたものになる.これは Polygon インスタンスを”縮める”のに有用なテクニックである.

 レストランから距離 5 km 以内に住むすべての顧客に無料のホームデリバリーサービスを提供するピザ配達の仕事を経営していると仮定しよう.STBuffer() メソッドを使って,顧客が無料の配達を受けられる権利のある範囲の Polygon エリアを定義できる.次のコードはこの例を示す.SRID 4326 を使い,北緯 52.6285°,東経 1.3033°に位置するレストランを示す Point 周囲に 5km のバッファーを生成する.

DECLARE @Restaurant geography
SET @restaurant = geography::STGeomFromText('POINT(1.3033 52.6285)', 4326)
DECLARE @FreeDeliveryZone geography
SET @FreeDeliveryZone = @Restaurant.STBuffer(5000)
SELECT
  @FreeDeliveryZone AS Shape,
  @FreeDeliveryZone.STAsText() AS WKT

 生成されるバッファーの半径を指定するため,STBuffer() にパラメータとして値 5000 を渡すことに留意する.@Restaurant は EPSG 4326 を使って定義された Point ジオメトリであるため,この値は 5000 メートルを表している.我々の関心のある半径 5 km のゾーンである.このクエリは次の結果をもたらす.

POLYGON ((1.3556167293586421 52.660220700919041, 1.3529946917604496 52.661744468478474, 1.3502526627452234 52.663188111575948, 1.3473972519095581 52.664548144295793, 1.3444353445937742 52.665821282298751, 1.3413740852330907 52.667004450810637, 1.338220860060046 52.668094792103972, 1.3349832792006679 52.669089672453744, 1.3316691582085762 52.669986688550019, 1.3282864990827781 52.670783673351131, 1.3248434708163777 52.671478701362844, 1.3213483895247364 52.672070093330163, 1.3178096982028111 52.67255642032994, 1.3142359461624735 52.672936507254015, 1.3106357682014877 52.673209435674089, 1.3070178635566267 52.673374546081071, 1.3033909746940029 52.673431439493243, 1.2997638659901609 52.673379978429253, 1.2961453023577951 52.673220287243375, 1.2925440278701135 52.672952751822216, 1.288968744437869 52.672578018643733, 1.2854280905929341 52.672096993200824, 1.2819306204319827 52.671510837793427, 1.2784847827733934 52.670820968694976, 1.2750989005798696 52.670029052699988, 1.2717811506985159 52.669137003061813, 1.2685395439692086 52.668146974830584, 1.2653819057510505 52.667061359603224, 1.2623158569155066 52.665882779698691, 1.2593487953535174 52.664614081773053, 1.2564878780424138 52.663258329890539, 1.2537400037169149 52.661818798067834, 1.2511117961867808 52.660298962310456, 1.2486095883419113 52.658702492160906, 1.2462394068837683 52.657033241779871, 1.244006957820013 52.655295240582817, 1.2419176127571523 52.653492683454978, 1.2399763960238253 52.6516299205694, 1.2381879726551175 52.649711446833045, 1.2365566372659695 52.647741890987319, 1.2350863038394 52.645726004389758, 1.2337804964528121 52.6436686495047, 1.2326423409632212 52.641574788131138, 1.2316745576697177 52.639449469396858, 1.2308794549689732 52.637297817548124, 1.2302589240170334 52.635125019564761, 1.2298144344081114 52.632936312631088, 1.229547030878497 52.630736971492809, 1.2294573310411823 52.628532295731006, 1.2295455241542086 52.626327596983757, 1.22981137092325 52.624128186146294, 1.2302542043364022 52.621939360580818, 1.2308729315266895 52.619766391366383, 1.23166603665534 52.617614510619724, 1.2326315848064839 52.615488898917256, 1.2337672268815609 52.61339467284828, 1.2350702054794132 52.611336872729161, 1.23653736174579 52.6093204505075, 1.2381651431737892 52.6073502578852, 1.239949612334627 52.605431034688365, 1.2418864565160626 52.603567397511519, 1.2439709982438107 52.60176382866301, 1.2461982066593433 52.600024665437424, 1.2485627097256413 52.598354089740241, 1.2510588072306836 52.596756118089083, 1.253680493776699 52.595234586920682, 1.2564214464195493 52.593793159259519, 1.2592750658629581 52.592435299611488, 1.262234483961735 52.591164271314277, 1.2652925802048134 52.589983128751385, 1.2684419987821942 52.58889471006708, 1.2716751661955283 52.587901630399649, 1.2749843093709758 52.587006275648022, 1.2783614742319791 52.586210796786631, 1.2817985446886813 52.585517104741129, 1.2852872619998963 52.584926865837289, 1.2888192444628153 52.584441497833019, 1.2923860073849835 52.584062166543049, 1.2959789832925492 52.583789783063708, 1.2995895423283086 52.5836250016044, 1.3032090127927269 52.58356821793064, 1.306828701780824 52.583619568422129, 1.3104399158676325 52.583778929748263, 1.3140339817948514 52.584045919161653, 1.3176022671112981 52.5844198954089, 1.3211362007198764 52.584899960256813, 1.3246272932839247 52.585484960630346, 1.328067157446118 52.586173491357364, 1.3314475278134195 52.5869638985141, 1.3347602806620593 52.587854283363406, 1.3379974533170556 52.588842506876958, 1.34115126316141 52.589926194830859, 1.3442141262308627 52.591102743463026, 1.3471786753508788 52.592369325679172, 1.3500377777734713 52.59372289779332, 1.3527845522724375 52.595160206787043, 1.3554123856566807 52.596677798070743, 1.3579149486624669 52.59827202372901, 1.3602862111867227 52.599939051230905, 1.36252045682482 52.60167487258493, 1.3646122966777525 52.603475313917357, 1.3665566823951041 52.6053360454517, 1.3683489184218272 52.607252591865823, 1.3699846734185295 52.609220343002576, 1.3714599908267393 52.61123456490882, 1.3727712985524585 52.613290411176919, 1.3739154177432289 52.6153829345618, 1.3748895706359467 52.617507098846559, 1.3756913874547005 52.619657790927945, 1.3763189123400577 52.621829833093749, 1.3767706082934059 52.624017995462282, 1.3770453611222147 52.626217008554825, 1.3771424823743874 52.62842157597062, 1.3770617112522341 52.630626387134313, 1.3768032154989971 52.632826130085178, 1.3763675912533146 52.6350155042774, 1.375755861869473 52.637189233360417, 1.3749694757038224 52.639342077908637, 1.3740103028702542 52.641468848069543, 1.3728806309701878 52.643564416099487, 1.3715831598050774 52.645623728756767, 1.3701209950820072 52.647641819521617, 1.3684976411254988 52.649613820613247, 1.3667169926112084 52.651534974774634, 1.36478332533971 52.65340064679588, 1.3627012860710619 52.655206334747966, 1.3604758814433251 52.656947680899115, 1.3581124660006141 52.658620482286764, 1.3556167293586421 52.660220700919041))

 これは半径 5 km の円形 Polygon の近似を表しており,レストランの位置を中心としている.

よりシンプルなバッファーを生成する

 前の例では,Point ジオメトリ周囲に”円形”の Polygon を生成するための STBuffer() メソッドの使い方を見せた.結果のジオメトリに含まれる点の数…数えるには多すぎる.幸いなことに,我々がそれを数える必要はない.STNumPoints() メソッドを使うことができ,コードの最後に次の行を加えることでその目的を果たせる.

SELECT @FreeDeliveryZone.STNumPoints()

 結果は次のようである.

72

 STBuffer() メソッドにより生成されたレストラン周囲のバッファーオブジェクトは 72 の点を含んでおり,正71角形のポリゴンを定義している.仮にいかなるジオメトリでも周囲のバッファーの精度を最大限に保ちたいなら,この Polygon 形状の定義をそのままにしておけばよい.しかし,特定のアプリケーションにとってこの例では,無料のピザ配達を提供することだが,おそらくそれほどの精度は必要ないだろう.複雑なジオメトリの演算には,それより少ない点の定義で実行するよりも多くの計算資源を要し,この例で見たように,点数の少ない”円形” Polygon から無料配達ゾーンの十分な精度を得られる.より簡素な Polygon を生成するため,代わりに拡張メソッド BufferWithTolerance() を使うことができる.

サポートされるデータ型

 BufferWithTolerance() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型
  • geography 型

使用法

 BufferWithTolerance() メソッドは geometry 型や geography 型のいかなるアイテムでも次のように使われる.

Instance.BufferWithTolerance(distance, tolerance, relative)

 このメソッドは次の3つのパラメータを必要とする.

  • distance パラメータは浮動小数点値で,生成されるバッファーの半径を定義しており,geography 型インスタンスなら空間参照系の線形計測単位を使って計測され,geometry 型インスタンスなら座標値と同じ計測単位を使って計測される.これは STBuffer() メソッドが distance パラメータを要求するのと同じである.
  • tolerance パラメータは浮動小数点値で,STBuffer() により計算される”真の”バッファー距離と,BufferWithTolerance() メソッドにより返るバッファーの簡素な近似との間の最大の偏差を指定する.Point 周辺のバッファーを生成する例では,これはBufferWithTolerance() により生成されたバッファーが,Point 周辺の真円にどれだけ近いかを表している.tolerance の値が小さいほど,結果の Polygon バッファーは実際のバッファーに似てくるが,より複雑になる.
  • relative パラメータはビット値であり,提供されたバッファーの tolerance パラメータが相対値か絶対値かを指定する.relative が”真”(あるいは 1)なら,バッファーの tolerance は問題のジオメトリの拡張は相対的と決定される.geometry 型の場合,これは,インスタンスの境界ボックスの直径と tolerace パラメータの積から計算されることを意味する.geography 型インスタンスの場合(境界ボックスは適用されない),相対的 tolerance は代わりに tolerance パラメータと,空間参照系の参照楕円体の赤道半径を掛け算した角度との積を計算する.relative が”偽”(あるいは 0)なら,tolerance パラメータの値は絶対値として扱われ,生成されるバッファー内で最大許容度の偏差として均一に適用される.

 tolerance パラメータと relative パラメータは一緒に用いられ,BufferWithTolerance() により生成されるより簡素なバッファーが,STBuffer() により生成される”真”のバッファーから偏差することによる許容範囲の受け入れられるレベルを定義する.許容範囲より大きく逸脱する点だけが結果のジオメトリに含まれる.BufferWithTolerance() メソッドを使って適切な許容値を決定するとき,許容値を大きくするとジオメトリがより簡素になること,結果の精度がより失われることを覚えておこう.許容値が低いほどより複雑になるがより正確なバッファーになる.

チップス STBuffer() メソッドから得られる結果は BufferWithTolerance() に tolerace = 0.001 および relative = ‘false’ を渡したときと同じになる.

 STBuffer() の例からの無料配達エリアを BufferWithTolerance() メソッドを代わりに使って再計算してみよう.同じくレストラン周囲の 5 km のバッファー半径を維持し,今度は許容値に絶対値の 250 m を指定する.この許容範囲内に偏差する”真”のバッファーからのいかなる点も結果のジオメトリ内には含まれることはない.

DECLARE @Restaurant geography
SET @Restaurant = geography::STGeomFromText('POINT(1.3033 52.6285)', 4326)
DECLARE @FreeDeliveryZone geography
SET @FreeDeliveryZone = @Restaurant.BufferWithTolerance(5000, 250, 'false')
SELECT
  @FreeDeliveryZone AS Shape,
  @FreeDeliveryZone.STAsText() AS WKT

 BufferWithTolerance() メソッドの結果は次の WKT 表現で示すとおりである.

POLYGON ((1.3556167293586421 52.660220700919041, 1.3502526627452234 52.663188111575948, 1.3444353445937742 52.665821282298751, 1.338220860060046 52.668094792103972, 1.3316691582085762 52.669986688550019, 1.3248434708163777 52.671478701362844, 1.3178096982028111 52.67255642032994, 1.3106357682014877 52.673209435674089, 1.3033909746940029 52.673431439493243, 1.2961453023577951 52.673220287243375, 1.288968744437869 52.672578018643733, 1.2819306204319827 52.671510837793427, 1.2750989005798696 52.670029052699988, 1.2685395439692086 52.668146974830584, 1.2623158569155066 52.665882779698691, 1.2564878780424138 52.663258329890539, 1.2511117961867808 52.660298962310456, 1.2462394068837683 52.657033241779871, 1.2419176127571523 52.653492683454978, 1.2381879726551175 52.649711446833045, 1.2350863038394 52.645726004389758, 1.2326423409632212 52.641574788131138, 1.2308794549689732 52.637297817548124, 1.2298144344081114 52.632936312631088, 1.2294573310411823 52.628532295731006, 1.22981137092325 52.624128186146294, 1.2308729315266895 52.619766391366383, 1.2326315848064839 52.615488898917256, 1.2350702054794132 52.611336872729161, 1.2381651431737892 52.6073502578852, 1.2418864565160626 52.603567397511519, 1.2461982066593433 52.600024665437424, 1.2510588072306836 52.596756118089083, 1.2564214464195493 52.593793159259519, 1.262234483961735 52.591164271314277, 1.2684419987821942 52.58889471006708, 1.2749843093709758 52.587006275648022, 1.2817985446886813 52.585517104741129, 1.2888192444628153 52.584441497833019, 1.2959789832925492 52.583789783063708, 1.3032090127927269 52.58356821793064, 1.3104399158676325 52.583778929748263, 1.3176022671112981 52.5844198954089, 1.3246272932839247 52.585484960630346, 1.3314475278134195 52.5869638985141, 1.3379974533170556 52.588842506876958, 1.3442141262308627 52.591102743463026, 1.3500377777734713 52.59372289779332, 1.3554123856566807 52.596677798070743, 1.3602862111867227 52.599939051230905, 1.3646122966777525 52.603475313917357, 1.3683489184218272 52.607252591865823, 1.3714599908267393 52.61123456490882, 1.3739154177432289 52.6153829345618, 1.3756913874547005 52.619657790927945, 1.3767706082934059 52.624017995462282, 1.3771424823743874 52.62842157597062, 1.3768032154989971 52.632826130085178, 1.375755861869473 52.637189233360417, 1.3740103028702542 52.641468848069543, 1.3715831598050774 52.645623728756767, 1.3684976411254988 52.649613820613247, 1.36478332533971 52.65340064679588, 1.3604758814433251 52.656947680899115, 1.3556167293586421 52.660220700919041))

 BufferWithTolerance() を使って生成した Polygon ジオメトリの含む点は,前回 STBuffer() メソッドを使って生成したものよりも少ないことが WKT 表現から明らかである.STNumPoints() メソッドを使って,BufferWithTolerance() を使って生成したこのより簡素なジオメトリが実際に 11 の点を有していることを確認でき,それは正十角形と定義できる.このアプリケーションで我々が関心を持つ円形のゾーンのリーズナブルな近似をも提供しており,より簡素なジオメトリを操作するいかなるメソッドもより効率的に実行するメリットを有している.

 figure 12-12 にSTBuffer() および BufferWithTolerance() メソッドの結果を比較する(略).

ジオメトリの凸包を生成する

 STConvexHull() メソッドは,インスタンス内のすべての点を含んだジオメトリの最小の凸面を返す.凸面ジオメトリはその内角が 180° より大きなものはないものであり,ゆえに辺が内側に曲がったり圧痕を含むことは決してない.Figure 12-13 に様々な種類のジオメトリの凸包を示す(略).

チップス ジオメトリの凸包の視覚化を助けるため,ジオメトリ内の点群すべての外周を伸展する弾性バンドを考えてみよう.弾性バンドが解放されたとき,その戻る形がジオメトリの凸包を表している.

サポートされるデータ型

 STConvexHull() メソッドは次のデータ型のインスタンス上で使われる.

  • geometry 型

使用法

 STConvexHull() メソッドは geometry 型のいかなるインスタンス上でも次のように使われる.

Instance.STConvexHull()

 STConvex() により返るジオメトリの種類は,インスタンス内に含まれるすべての点を含む最小の凸面ジオメトリである.単一の Point インスタンスに使った場合,その凸包はその Point 自身になる.直線状に並ぶ Point のシリーズや LineString に対して使った場合,その凸包は LineString になる.その他の場合,その凸包は Polygon になる.

 ジオメトリの凸包を生成し解析することは,地球上のオブジェクトの地理的な広がりを調べるのに有用である.これを示すため,次の例は H5N1 ウイルス(一般に”鳥インフルエンザ”として知られる)の症例の報告された広がりを表現する凸包を生成する.

 この例では,@H5N1 は MultiPoint ジオメトリであり,ヒトに H5N1 ウイルスが記録された症例の各位置の点を含んでおり,世界保健機関が 2003 年 9 月から 2004 年 12 月の間に報告したものである.ついで geometry 型の STConvexHull() メソッドを使って,この疾患の広がり全体を記述する MultiPoint ジオメトリ内の各点を包囲する凸包 Polygon を生成する.

DECLARE @H5N1 geometry
SET @H5N1 = geometry::STMPointFromText(
  'MULTIPOINT(
105.968 20.541, 105.877 21.124, 106.208 20.28,  101.803 16.009, 99.688 16.015,
 99.055 14.593,  99.055 14.583,  102.519 16.215, 100.914 15.074, 102.117 14.957,
100.527 14.341,  99.699 17.248,  99.898 14.608,  99.898 14.608,  99.898 14.608,
 99.898 14.608, 100.524 17.75,  106.107 21.11,  106.91 11.753,  107.182 11.051,
105.646 20.957, 105.857 21.124, 105.867 21.124, 105.827 21.124, 105.847 21.144,
105.847 21.134, 106.617 10.871, 106.617 10.851, 106.637 10.851, 106.617 10.861,
106.627 10.851, 106.617 10.881, 108.094 11.77, 108.094 11.75,  108.081 11.505,
108.094 11.76,  105.899 9.546,  106.162 11.414, 106.382 20.534, 106.352 20.504,
106.342 20.504, 106.382 20.524, 106.382 20.504, 105.34 20.041,  105.34 20.051,
104.977 22.765, 105.646 20.977, 105.646 20.937, 99.688 16.015,  100.389 13.927,
101.147 16.269, 101.78 13.905,  99.704 17.601,  105.604 10.654, 105.817 21.124,
106.162 11.404, 106.362 20.504)', 4326)
SELECT
  @H5N1 AS Shape
UNION ALL SELECT
  @H5N1.STConvexHull() AS Shape

 STConvexHull() メソッドおよび生成された MultiPoint @H5N1 ジオメトリの結果の凸面 Polygon を Figure 12-14 に示し(略),影響を受けるエリアを地図上にオーバーレイしている.

 一つ興味深い事実を記載しておくと,このデータの表現する期間(2003 年 9 月から 2004 年 12 月にかけて),H5N1 の個別の症例はタイとベトナムでしか報告されなかった.しかし,それらの症例の見つかった点を包囲する凸包はラオスとカンボジアの大半をカバーしており,疾患の拡大していく地域内に位置していること,そして疾患に暴露する著明なリスクにさらされていたことを示唆している.事実,2005 年 1 月 21 日,このデータセットの最後の記録の一ヶ月以内に,カンボジアでヒトへの H5N1 の最初の感染例が報告された.

要約

 本章では,既存のジオメトリを結合したり差分を取ったり修飾したりするための SQL Server 2008 の提供するメソッドを紹介した.Table 12-1 に本章で紹介したメソッドの要約を示す.

Table 12-1. 空間オブジェクトを修飾するメソッド
メソッド 記述 geometry型 geography型
MakeValid() ジオメトリを修飾して有効になるよう確保する  
STUnion() 2つのジオメトリの和集合を定義する
STIntersection() 2つのジオメトリの交差を定義する
STDifference() 2つのジオメトリ間の差分を表現する点のインスタンスを定義する
STSymDifference() 2つのジオメトリの対称差のインスタンスを定義する
Reduce() Polygon や LineString の簡素化したインスタンスを定義する
STBuffer() オブジェクトの緩衝地帯を表現する Polygon や MultiPolygon を定義する
BufferWithTolerance() 与えられた許容範囲でオブジェクトの緩衝地帯を表現する Polygon や MultiPolygon を定義する
STConvexHull() ジオメトリの凸包を表現する Polygon を生成する  

“第12章 空間オブジェクトを修飾する (Begining Spatial with SQL Server 2008)” への1件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください