waigani's diary

QGISを中心にFOSS4Gをいじくる

QGISで人口が半分になるように2分割してみた

人口が半分になるように都道府県を二分割してみた

togetter.com
というのがtwitterでまわっていましたね。
これをQGISでやるプラグインを作って、FOSS4G Advent Calendar
FOSS4G Advent Calendar 2016 - Qiita
のネタにしようと思っていました。ただ朝の時点で出来ていなかったので、他の投稿をしておきました。
UIを作るところで思いの外ハマったのでですが、なんとなくできたので晒しておきます。

QGISプラグイン

GitHubにおいておきました。
github.com

プラグインの動作

インストールして実行してもらうと、ベクトルレイヤ(ポリゴンのみ)を選択→レイヤ内の使用するカラムの選択を行えます。
合わせてスライダーで割合を指定します。
f:id:waigani:20161201224121p:plain
この画像の例だと、

  • h22ka01204レイヤを
  • JINKO カラムを使って
  • 人口上位の地域から加えていって30%になる地域:それ以外の地域で色分け(30%超えたところで止めてるのでだいたいね)

になります。

e-stat から平成22年の小地域をダウンロードしてきて試してみました。

  • 旭川市を、人口上位の地域から数えていって30%になるところまでを青:それ以外を赤で色分け

f:id:waigani:20161201224811p:plain

  • 札幌市を、人口上位の地域から数えていって50%になるところまでを青:それ以外を赤で色分け

f:id:waigani:20161201225042p:plain

処理の仕方

大事なところだけ。

  • comboboxとsliderから値を持ってきて
  • 指定のlayerの指定のカラムの値を全部足す
  • sliderの値の割合をかけて、目標の数字とする
  • 指定カラムの値をソート
  • ソートしたものを足していって、目標の数字を超えたところでストップ
  • この条件でQgsRuleBasedRendererV2を作成
  • layerにセットして再描画

としています。

QtDesinger with QGIS 2.14 custom widgets

どこでハマってたかというと。気づいてなかったのですがQGISをインストールすると、QtDesingerがついてくるんですね。
このQtDesingerにはQGISのcustom widgetsがついています。

例えばQgsFieldComboBoxだと、レイヤを渡すと勝手にFieldでComboBoxを作ってくれます。
ただ作ったUIを実行しようとすると、エラーが出てしまいました。このあたりを参考に修正しています。
osgeo-org.1560.x6.nabble.com