読者です 読者をやめる 読者になる 読者になる

waigani's diary

QGISを中心にFOSS4Gをいじくる

沿道に10万人入るのか考えてみた

最初に告知

今年もFOSS4G Advent Calendarやります。ぜひご登録を。
FOSS4G Advent Calendar 2012

今日は札幌では、日ハムの優勝パレードでした

家族が風邪をひいていて、病院に連れて行っている間に終わってました。
出歩けないし暇だと思ってTwitterを眺めていたら、こんなつぶやきが。

へー、10万人も人出あったんだ。

spatialite 4の新機能

まだリリースされていないんですが、spatialite 4で追加される機能はいつか試そうと思っていました。
特にこれtesselations-4.0です。
本来は調査用にメッシュを切ったりするのでしょうが、ただ単に六角形で範囲を充填してみたい、とか思っていただけです。

パレード沿道を六角形で埋めてみよう

というわけで、10万人並べれるものかなと思いつつ、パレード沿道を六角形で埋めてみました。
使用したデータ&アプリは下記になります。

作業の流れ

作業の流れとしては、このような形になります。

  1. 基盤地図情報から必要データダウンロード
  2. JPGIS→shapefile
  3. QGISでパレード沿道(っぽい)データ作成
  4. spatialiteで範囲に図形充填
  5. QGISで表示して確認

QGISが新しいspatialiteに対応してないので、QGIS⇔spatialite間は一度shapefileに変換しています。

データ準備

基盤地図情報ダウンロード、JPGIS→shapefileは割愛いたしますm(_ _)m。
いきなりQGISに読み込んだ画面ですが、このような形になります。

背景にするデータは準備出来たとして、次にパレード沿道の範囲を決めます。パレードのコースを調べましょう。こちらで公開されています。

まずはQGIS上で大まかにこの辺まで沿道でいいだろう、という範囲をポリゴンで作成してしまいます。
駅前からススキノまでのポリゴンを作成しました。レイヤー名:routeExtとしておきましょう。

次に明らかに観客が入れない区域を定義します。
もう少し細かく定義すべきですが、ここではパレードの通りそうな道路だけにしました。
この範囲もポリゴンを作成しておきます。
駅前からススキノまでの道路のポリゴンを作成しました。レイヤー名:routeとしておきましょう。

ここからは空間演算。routeExt -(引く) routeの範囲を求めます。
"ベクタ"→"空間演算ツール"→"差分"を選択します。

"ベクタレイヤーの入力"をrouteExt、"レイヤの差分"をrouteにします。出力shapefileはrouteExt2としました。


差分の結果、パレードが通る道路が抜けたポリゴンが出来ます。

さらに建物部分を抜きます。同じく、"ベクタ"→"空間演算ツール"→"差分"を選択して、"ベクタレイヤーの入力"をrouteExt2、"レイヤの差分"を建築物にします。
差分の結果は下記になります。

建物の裏の路地まで残っていたり、地上と高架の関係がおかしかったりしますが、ご愛嬌ということで。なんなく人が立てそうな範囲が残ったとしておきましょう。
結果を一旦shapefileに保存してください。
ここからの処理はspatialiteで行います。

spatialiteでST_HexagonalGrid

spatiliate-guiの取り扱いについては、FOSS4G Hokkaidoハンズオン(裏メニュー)を御覧ください。詳細は割愛致します。
読み込んだデータ(テーブル名:routeAreaとしています)に対して、下記のSQLを実行します。

 create table hexOnArea as 
 SELECT ST_HexagonalGrid(geometry, 0.3) as geometry
 FROM routeArea
  • 範囲を充填する(覆う)ように、六角形を作成します
  • 作成される各六角形の1辺の長さを30cmとしています、特に根拠はなし
  • 実行結果はhexOnAreaテーブルに入れられます

QGISからspatialiteにアクセスしたいところですが、QGISが開発版のspatiliateには対応していません。
実行結果はshapefileに保存して、改めてQGISで表示します。

結果

一瞬なんだかわかりませんが。

拡大すると。


おぉ、覆っている。
数を出したら、284,510個の六角形が作成されてました。
指定した範囲を覆うように作成されるので、はみ出すやつもありますのでご注意を。


なんら根拠のない、ただ単に関数を使ってみたかっただけの結果でした。
本当は条件変えて色々試してみたかったのですが、思いの外spatialiteでの計算に時間がかかったので、ここで止めておきます。


以上。