見出し画像

位置情報とパブリックデータ#02: topojsonの作成SQL

(TeradataのSQL実行環境に関してはこちらをご覧ください)

Vega Liteにて以下のようなポリゴンを描画する場合にはtopojson形式のファイルで出力して、それを描画定義に含める必要があります。今回はこれを作成するSQLをご紹介。

ポリゴン

最終的にtopojsonは以下のような形式で記述したいです。

{"type":"Topology","transform":{
"scale": [0.00003105401469401469,0.00002513449824449824],
"translate": [122.93267356,20.42276189]
},"objects":{"po":{"type": "GeometryCollection","geometries":[
{"type": "Polygon", "arcs":[[0]],"properties": {"name": "ポリゴン1四角形" }}
,{"type": "Polygon", "arcs":[[1]],"properties": {"name": "ポリゴン2三角形" }}
]}},"arcs": [
[[549601.28692441,778899.101925988],
[0,-79571.9087186387],
[-64403.9110468212,0],
[0,79571.9087186387],
[64403.9110468212,0]],
[[581803.24244782,739113.147566669],
[-64403.9110468212,-79571.9087186388],
[0,79571.9087186388],
[64403.9110468212,0]]]}

全体の話をすると、上記のtopojsonファイルと合わせて、以下のjsonファイルで定義を行っているのと、もう1つのtopojsonファイルが下地データになっています。

jsonファイルの定義内で、scaleとtranslate(2行目と3行目)は、下地に使っている方のtopojsonファイルで定義されている値と同じものを使います。そしてポリゴンの宣言をしているのが、このファイルでいうと5行目と6行目で、0番から始まり、名前をセットしています。そして、実際のポリゴン情報はarcs内にて[経度 緯度]のような形で記載されていますが、見た感じ実際の経度緯度とは単位が異なっています。どうやって計算、記述するのか.. 色々調べていくと、以下を読むことでtopojsonの記述方法は何となくわかってきます。

ただ重複するarcの記載については意味が分かりません。Right Polygonはarcの0行目と1行目の配列を指定しているのに、Left Polygonでは2行目と0行目ではなく、2,-1という値を指定しているあたりは何故なのかを理解できず、あきらめました。とはいえ、そこら辺を無視すれば、ポリゴンの記述方法は何となくわかったので、それっぽく記述してみましょう。まず、topojsonのarcからは、scaleを掛けてtranslateを足すと緯度経度座標になる。したがって緯度経度座標からは逆算するとtranslateを引き、その後にscaleで割ります。以下の式が成り立ちます。

  • (緯度,経度) = (scale * arc(x,y)) + translate

  • arc(x,y) = ((緯度,経度) - translate) / scale

そして2つ目以降の位置は、なぜか前の位置からの相対距離を記述します。なので上述の処理をした後に、前の位置の値を経度緯度ともに差し引く必要があります。これを配列としてセットしてあげたtopojsonファイルを作成し、これをもとの都道府県地図があるtopojsonファイルに重ねる形でVega Liteを記述します。ポリゴンに点や線を重ねるのと同じく、ポリゴンにポリゴンを重ねます。複数ポリゴンが重複していても問題ないこともこの例からわかります。


topojson作成SQL

ただ、これを任意のポリゴン群に対して手計算で作成していくのは面倒です。なので、以下にTeradataのSQLで生成できるようにしました。もともとのポリゴン座標データがテーブルに入っていると仮定し、これを使ってtopojsonファイルの各行を作成します。

解説です。parasの中は下地のtopojsonが持っている定義を書き入れてください。src内のテーブルと列は、描画したいポリゴン群がセットされているそれを指定してください。ただしリネームした列名はそのままで。以降のテーブルや列は抽象化されているため、そのまま書き換えずに実行することができます。pttidとpttnameが描画したいポリゴンを指し、その中の座標順番はordeにて定義されてます。blockidとordeでtopojsonファイル内の記述順を決定しているので、order by 1,2で出力すればlit列の順番は欲しいtopojsonの記述順序になります。あとはlit列をコピーしてメモ帳にでも貼り付け、拡張子を.topojsonにしてあげれば完了です。冒頭に示したtopojsonファイルになります。インデントがされていないためぐちゃっとしていて見にくいですが、そのまま使えます。

以上です。

#geospatial #gis #topojson #vegalite #teradata #sql  


この記事が気に入ったらサポートをしてみませんか?