Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ 空間データサポート » 空間データ » チュートリアル:空間機能の実験

 

レッスン 4:空間データのクエリ

このレッスンでは、いくつかの空間メソッドを使用して、意味のあるコンテキストでデータを問い合わせる方法について説明します。また、距離を計算する方法も学習するためデータベースに測定単位を追加する必要があります。

前提条件

このレッスンは、受講者がこれまでのすべてのレッスンを終了していることを前提としています。レッスン 1:追加の測定単位と空間参照系のインストールを参照してください。

このレッスンでは、このチュートリアルの冒頭の「権限」セクションに一覧になっているロールおよび権限を持っていることを前提としています。 チュートリアル:空間機能の実験

内容と備考

SpatialContacts テーブルと Massdata テーブルのどちらか、または両方でクエリを実行します。データベースにすでに存在している SpatialContacts には、多くは Massachusetts に在住する人々の名前と連絡先情報が格納されています。

 ♦ 空間データのクエリ
  1. Interactive SQL で、郵便番号区域 01775 に関連付けられるジオメトリを保持するために、@Mass_01775 という変数を作成します。

    CREATE VARIABLE @Mass_01775 ST_Geometry;
    SELECT geometry INTO @Mass_01775
    FROM Massdata
    WHERE ZIP = '01775';
  2. 郵便番号区域 01775 と周辺の郵便番号区域のすべての連絡先を SpatialContacts から検索するとします。このためには、交差するジオメトリ、または指定したジオメトリと同じジオメトリを返す、ST_Intersects メソッドを使用します。Interactive SQL で次の文を実行します。

    SELECT c.Surname, c.GivenName, c.Street, c.City, c.PostalCode, z.geometry
    FROM Massdata z, GROUPO.SpatialContacts c
    WHERE
    c.PostalCode = z.ZIP
    AND z.geometry.ST_Intersects( @Mass_01775 ) = 1;

    ST_Geometry タイプの ST_Intersects メソッドを参照してください。

  3. Massdata.geometry のすべてのローは、同じ空間参照系 (SRID 4269) に関連付けられています。これは、geometry カラムを作成するときに SRID 4269 を割り当て、そのカラムにデータをロードしたためです。

    ただし、「宣言されていない」 ST_Geometry カラム (つまり、SRID が割り当てられていない) を作成することもできます。これは、異なる SRS が関連付けられている空間値を単一のカラムに格納したい場合に必要になります。これらの値に対して操作が実行されると、各値に関連付けられている空間参照系が使用されます。

    宣言されていないカラムを使用する場合のリスクの 1 つは、データベースサーバでは、宣言されていないカラムのデータに関連付けられている空間参照系の変更が防止されないことです。

    カラムに宣言された SRID がある場合、データベースサーバはデータに関連付けられている空間参照系を変更することを許可しません。最初に、宣言されたカラムのデータをアンロードしてトランケートしてから、空間参照系を変更し、データを再ロードする必要があります。

    ST_SRID メソッドを使用すると、宣言されているかどうかに関係なく、カラムの値に関連付けられている SRID を判別できます。たとえば、次の文は Massdata.geometry カラムの各ローに割り当てられている SRID を表示します。

    SELECT geometry.ST_SRID()
    FROM Massdata;
  4. ST_CoveredBy メソッドを使用すると、ジオメトリが別のジオメトリ内に完全に含まれているかどうかをチェックできます。たとえば、Massdata.CenterPoint (ST_Point タイプ) には郵便番号区域の中心の緯度/経度の座標が含まれ、Massdata.geometry には郵便番号区域を反映した多角形が含まれます。Interactive SQL で次のクエリを実行することによって、郵便番号区域外に設定されている CenterPoint 値がないことを簡単に確認できます。

    SELECT * FROM Massdata
    WHERE NOT(CenterPoint.ST_CoveredBy(geometry) = 1);

    ローが 1 つも返されないため、すべての CenterPoint 値が Massdata.geometry の関連付けられているジオメトリ内にあることを示しています。このチェックは CenterPoint 値が本当に中心にあるかどうかは検証していません。そのためには、データを平面空間参照系に投影し、ST_Centroid メソッドを使用して CenterPoint 値をチェックする必要があります。投影についてはこのチュートリアルの後半で学習します。

  5. ST_Distance メソッドを使用すると、郵便番号区域の中心点間の距離を測定できます。たとえば、郵便番号区域 01775 から 100 マイル以内の郵便番号をリストしたいとします。この処理は、Interactive SQL で次のクエリを実行します。

    SELECT c.PostalCode, c.City,  
           z.CenterPoint.ST_Distance( ( SELECT CenterPoint 
                                FROM Massdata WHERE ZIP = '01775' ),
                              'Statute mile' ) dist,
           z.CenterPoint
    FROM Massdata z, GROUPO.SpatialContacts c
    WHERE c.PostalCode = z.ZIP
      AND dist <= 100
    ORDER BY dist;
  6. 正確な距離を知ることが重要ではない場合、代わりに ST_WithinDistance メソッドを使用してクエリを作成できます。これは、特定のデータセット (特に、大きなジオメトリ) に対してよりよいパフォーマンスが得られます。

    SELECT c.PostalCode, c.City, z.CenterPoint
    FROM Massdata z, GROUPO.SpatialContacts c
    WHERE c.PostalCode = z.ZIP
      AND z.CenterPoint.ST_WithinDistance( ( SELECT CenterPoint
                                FROM Massdata WHERE ZIP = '01775' ),
                              100, 'Statute mile' ) = 1
    ORDER BY c.PostalCode;

結果

空間データに関するクエリが実行されます。

 参照