このレッスンでは、いくつかの空間メソッドを使用して、意味のあるコンテキストでデータを問い合わせる方法について説明します。
SpatialContacts テーブルと Massdata テーブルのどちらか、または両方でクエリを実行します。データベースに既に存在している SpatialContacts には、多くは Massachusetts に在住する人々の名前と連絡先情報が格納されています。
また、距離を計算する方法も学習するためデータベースに測定単位を追加する必要があります。
Interactive SQL で、郵便番号区域 01775 に関連付けられるジオメトリを保持するために、@Mass_01775
という変数を作成します。
CREATE VARIABLE @Mass_01775 ST_Geometry; SELECT geometry INTO @Mass_01775 FROM Massdata WHERE ZIP = '01775'; |
郵便番号区域 01775 と周辺の郵便番号区域のすべての連絡先を SpatialContacts から検索するとします。このためには、交差するジオメトリ、または指定したジオメトリと同じジオメトリを返す、ST_Intersects メソッドを使用します。Interactive SQL で次の文を実行します。
SELECT c.Surname, c.GivenName, c.Street, c.City, c.PostalCode, z.geometry FROM Massdata z, SpatialContacts c WHERE c.PostalCode = z.ZIP AND z.geometry.ST_Intersects( @Mass_01775 ) = 1; |
ST_Geometry タイプの ST_Intersects メソッドを参照してください。
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; |
を参照してください。
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 値をチェックする必要があります。データを別の空間参照系に投影する方法については、レッスン 6:空間データの投影を参照してください。
ST_Geometry タイプの ST_CoveredBy メソッドを参照してください。
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, SpatialContacts c WHERE c.PostalCode = z.ZIP AND dist <= 100 ORDER BY dist; |
ST_Geometry タイプの ST_Distance メソッドを参照してください。
正確な距離を知ることが重要ではない場合、代わりに ST_WithinDistance メソッドを使用してクエリを作成できます。これは、特定のデータセット (特に、大きなジオメトリ) に対してよりよいパフォーマンスが得られます。
SELECT c.PostalCode, c.City, z.CenterPoint FROM Massdata z, 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; |
ST_Geometry タイプの ST_WithinDistance メソッドを参照してください。
レッスン 5:SVG への空間データの出力に進みます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |