Amazon Redshift での空間データのクエリ
空間データは、定義された空間 (空間参照系) におけるジオメトリの位置と形状を説明するものです。Amazon Redshift は、GEOMETRY
および GEOGRAPHY
データ型の空間データをサポートします。これには空間データが含まれており、さらにオプションでデータの空間参照系識別子 (SRID) を使用できます。
空間データには、ジオメトリの特徴を表すために使用できるジオメトリデータが含まれます。このタイプのデータの例としては、天気予報、地図の案内、位置情報を含むツイート、店舗の場所、航空路線などがあります。空間データは、ビジネス分析、レポート、および予測で重要な役割を果たします。
空間データは、Amazon Redshift SQL 関数を使ってクエリできます。空間データには、オブジェクトのジオメトリ値が含まれます。
GEOMETRY
データ型の演算は、デカルト平面上で動作します。空間参照系識別子 (SRID) はオブジェクト内に格納されますが、この SRID は座標系の識別子に過ぎず、GEOMETRY
オブジェクトの処理で使用するアルゴリズム内の処理とは特に関係がありません。一方、GEOGRAPHY
データ型の演算では、オブジェクト内の座標は回転楕円体上の球座標として扱われます。この回転楕円体は、地理空間参照系を参照する SRID によって定義されます。デフォルトで GEOGRAPHY
データ型は、世界測地系 (WGS) 84 を参照しながら、空間参照 (SRID) 4326 を使用して作成されます。SRA の詳細については、Wikipedia で「Spatial reference system
ST_Transform 関数を使用すると、さまざまな空間参照系からの座標を変換できます。座標変換の完了後は、これら 2 つの座標間で単純なキャストを使用できるようになります (ただし、入力された GEOMETRY
が地理的 SRID でエンコードされている場合に限ります)。このキャストでは追加的な変換は行わず、単に座標をコピーします。例:
SELECT ST_AsEWKT(ST_GeomFromEWKT('SRID=4326;POINT(10 20)')::geography);
st_asewkt
------------------------
SRID=4326;POINT(10 20)
GEOMETRY
と GEOGRAPHY
データ型間での違いをよりよく理解するためには、世界測地系 (WGS) 84 を使用して、ベルリン空港 (BER) とサンフランシスコ空港 (SFO) の間の距離を計算してみるということもできます。GEOGRAPHY
データ型を使用した場合、結果はメートル単位で返されます。SRID 4326 による GEOMETRY
データ型を使用する場合、結果は度数で返されます。1 度に対応する距離が地球上でのジオメトリの位置によって異なるため、度数をメートルに変換することはできません。
GEOGRAPHY
データ型での計算は、国の正確な面積をゆがみなく計算する場合など、地球面上での現実に沿った計算に主に使用されます。ただし、これらの処理ではコストが高くなります。したがって、ST_Transform により、ローカルに投影された適切な座標系に座標を変換することで、GEOMETRY
データ型を使用して計算を高速化できるようになります。
空間データを使って、以下を実行するクエリを実行できます。
2 点間の距離を確認する。
あるエリア (ポリゴン) 内に別のエリアが含まれているかどうかを確認する。
あるラインストリングが別のラインストリングまたはポリゴンと交差するかどうかを確認する。
空間データの値を保持するには、GEOMETRY
データ型を使います。Amazon Redshift のGEOMETRY
値では、2 次元 (2D)、3 次元 (3DZ)、メジャー付 2 次元 (3DM)、および 4 次元 (4D) ジオメトリの、プリミティブデータ型を定義できます。
2 次元 (2D) ジオメトリは、平面上の 2 つのデカルト座標 (x, y) によって表現されます。
3 次元 (3DZ) ジオメトリは、空間内の 3 つのデカルト座標 (x, y, z) によって表現されます。
メジャー付き 2次元 (3DM) ジオメトリは、3 つの座標 (x、y、m) によって表現されます。最初の 2 つは平面内のデカルト座標であり、3 つ目は測定尺度です。
4 次元 (4D) ジオメトリは、4 つの座標 (x, y, z, m) によって表現されます。最初の 3 つは空間内のデカルト座標、4 つ目は測定尺度です。
ジオメトリプリミティブのデータ型に関する詳細は、ウィキペディアの Well-known text
空間データの値を保持するには、GEOGRAPHY
データ型を使います。Amazon Redshift のGEOGRAPHY
値では、2 次元 (2D)、3 次元 (3DZ)、メジャー付 2 次元 (3DM)、および 4 次元 (4D) ジオメトリの、プリミティブデータ型を定義できます。
2 次元 (2D) ジオメトリは、回転楕円体上の経度と緯度の座標によって表現されます。
3 次元 (3DZ) ジオメトリは、回転楕円体上の経度、緯度、および標高によって表現されます。
メジャー付き 2 次元 (3DM) ジオメトリは、3 つの座標 (経度、緯度、メジャー) によって表現されます。最初の 2 つは球体面上の角座標であり、3 つ目は測定尺度です。
4 次元 (4D) ジオメトリは、4 つの座標 (経度、緯度、標高、メジャー) によって表現されます。最初の 3 つが経度、緯度、高度で、4 つ目は測定尺度です。
地理座標系の詳細については、ウィキペディアで「地理座標系
GEOMETRY
および GEOGRAPHY
データ型には、以下のサブタイプがあります。
POINT
LINESTRING
POLYGON
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
ジオメトリデータの次の表記をサポートする Amazon Redshift SQL 関数があります。
GeoJSON
Well-known text (WKT)
Extended well-known text (EWKT)
Well-known binary (WKB) 表記
Extended well-known binary (EWKB)
GEOMETRY
データ型と GEOGRAPHY
データ型の間はキャストすることが可能です。
次の SQL は、GEOMETRY
から GEOGRAPHY
にラインストリングをキャストします。
SELECT ST_AsEWKT(ST_GeomFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)')::geography);
st_asewkt
----------------------------------------------
SRID=4326;LINESTRING(110 40,2 3,-10 80,-7 9)
次の SQL は、GEOGRAPHY
から GEOMETRY
にラインストリングをキャストします。
SELECT ST_AsEWKT(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)')::geometry);
st_asewkt
----------------------------------------------
SRID=4326;LINESTRING(110 40,2 3,-10 80,-7 9)
Amazon Redshift は、空間データをクエリするための多くの SQL 関数が用意されています。ST_IsValid
関数を除いて、引数として GEOMETRY
オブジェクトを受け入れる空間関数は、この GEOMETRY
オブジェクトが有効なジオメトリであることを期待します。GEOMETRY
あるいは GEOGRAPHY
オブジェクトが有効でない場合、空間関数の動作が定義されていません。検証についての詳細は、幾何学的妥当性 を参照してください。
空間データをクエリする SQL 関数の詳細については、「空間関数」を参照してください。
空間データのロードの詳細については、「GEOMETRY もしくは GEOGRAPHY データ型の列のロード」を参照してください。