位置情報とパブリックデータ#03: Teradataの地理空間データ型
(TeradataのSQL実行環境に関してはこちらをご覧ください)
Teradataデータベースには、Teradata Geospatialという機能が備わっており、これは地理空間データを格納するためのデータ型と、それを用いて計算などを行う関数に分かれています。今回はこのうちデータ型を、次回以降の複数回に分けて関数について紹介していきます。
マニュアルのありか
必要な情報は以下より得ています。詳細に確認したい方はこちらを:
地理空間データ
そもそも地理空間データとはどんなものかという話ですが、ベースとなるのはx軸、y軸、オプションでz軸の、2次元もしくは3次元空間で表現されるデータということになります。位置情報と同義です。これは論理的な世界の話で、地球上の現実世界に当てはめると、それぞれ経度(longitude)、緯度(latitude)、高度(altitude、というらしい)のことを指します。数学的な3次元空間が平面で、どの方向も距離単位が等しい世界を表現しているのに対して、地球は楕円球体を前提としています。距離単位も緯度と経度はともに度数ですが、場所によってメートル換算すると1度あたりの距離が異なってきます。そして高度はメートルということでそれぞればらばらの単位を用いています。
そのため使い道としては、数学的な地理空間位置を扱う、もしくは地球上の地理空間位置を扱うということです。後者に関していうと、経度と緯度だけなら以下のようなデータです。
緯度: latitude、日本だと20から45度の範囲、縦軸、南から北
経度: longitude、日本だと122から153度の範囲、横軸、西から東
st_geometry
このようなデータを扱うため、Teradataデータベースではst_geometryというデータ型を有しています。データ型ということは、文字型、数字型などと並列して存在するものであり、データベーステーブルの一つの列としてほかの列と共存可能です。形式はWKT(Well Known Text)と言われる形式が代表的で、この場合、以下に代表されるサブタイプがあります。
点: point
線: linestring
面: polygon
これ以外にも複数のポイントを示すmultipointなどのサブタイプがありますが、ここでは基本的なこれらのサブタイプを考えます。最もシンプルな形式を考えると、それぞれ以下のようなデータで格納されます。
point(x1 y1)
linestring(x1 y1,x2 y2)
polygon((x1 y1,x2 y2,x3 y3,x1 y1))
xnとynはそれぞれの軸の座標を示す数値データです。地球を前提すると単に経度と緯度です。pointは点を意味します。linestringは線を意味し、もっとも単純なケースでは上述のように2点を示す直線の始点と終点で示されます。曲線の場合は、限りなく小さい距離で直線をつなぎ合わせて曲線を表現します。そしてこれの始点と終点がつながると面、つまりpolygonになります。polygonは中に池のような形で穴あきがあるケースもあり、それを表現するために、かっこが二重になっています。上記は単純なケースですが、linestringとpolygonは形状が複雑であれば座標の数が増えていくことになります。一つのグリッドにおいて最大16MB、約100万の点に相当するデータを格納可能とのことです。また、上記ではx軸とy軸だけですが、z軸も同様に追加できます。その際はpoint(x1 y1 z1)という形式です。以降のノートブックにて、テーブルの定義と、そこへのデータ挿入例を記載しましたのでご覧ください。
あともう一つ。polygonのケースで最初と最後が同じ座標ですが、これは形状として「閉じている」ことを示す大事な情報です。「閉じていない」場合、関数などの利用が適切にできなくなります。そしてここから、linestringやpolygonにおける座標の記述順序の順番で、図形オブジェクトの線が描かれるということもわかります。始点とした記載した座標から終点で戻ってくるので、閉じてはじめて面になります。
早速、テーブル定義からデータの挿入、照会や型変換などの流れについてみていきましょう。以下のノートブックでは、以下のような位置関係のデータを挿入しました。
テーブルにおける型定義の方法、データを挿入するときの形式、数値型との相互変換方法がご確認いただけると思います。st_geometry型は形式としてはblob型に近いため、Teradata Studioなどでそのまま結果を取得しようとするとファイル形式での出力を促されます。そのため、データを確認するのであれば文字型に変換したうえで出力した方が扱いやすいです。点座標のst_geometry型データからx軸とy軸の座標データを数値として取得する際にはst_x()、st_y()の関数が利用できます。Teradata Geospatialの場合、関数への入力が特殊なケースもあります。この関数には頭に列名を指定して入力とする形式です。関数はwhere句にも利用可能です。また元の数値データからst_geometry型に変換するには、いったん文字型でWKT形式の文字列を作成し、それをcastしてあげればよいです。
以上です。ご参考までに、上述したグラフを描画するために利用した定義用jsonファイルとデータのcsv/topojsonファイルを置いておきます。
#geospatial #gis #teradata #sql #analytics #st_geometry