waigani's diary

QGISを中心にFOSS4Gをいじくる

FOSS4G Hokkaidoハンズオン(裏メニュー) 続き

前回からの続きです。spatialiteで、残っていた課題2を行います。
にぎわっているエリアでカレー屋さんを開くのに良いエリアを探します。

shapeデータのimport

ハンズオン用のデータ(QGIS_level2_vector\work02\shp)から

  • 01_GPS_L
  • 03_mesh100
  • 05_curry_p

をspatialiteへimportします。
注意点は今回と同じく、

  • Charset Encodingで"SHIFT_JIS"
  • SRIDに"32654"
  • table name の先頭の数字は避ける。それぞれGPS_L, mesh100, curry_pとします

としてください。

にぎわっているエリアの抽出

QGISで行った場合、

  • GPSで取ったライン→ノード展開
  • 100mメッシュに入るノード数をカウント

しています。
ここでは、

  • 100mメッシュ毎に、GPSで取ったラインの重なる長さ

を計算しましょうか。
重なる長さ"0"の100mメッシュは使わないので捨てちゃいます。少しでも重なりがあるメッシュはにぎわっていると判断しましょう。
実行結果は"mesh_l"テーブルに保存しておきます。

create table mesh_l
as
select m.*, cast(sum(length(intersection(g.Geometry, m.Geometry))) as REAL) as l
from GPS_L g, mesh100 m
group by m.ID
having l is not null

"GPS_L"テーブルと"mesh_l"テーブルをQGISで表示してみると下図になります。
"mesh_l"は重なる長さにより色分けしてあります。濃いほうが重なる長さが長い。
にぎわっているエリアは抽出出来ていそうです。

カレー屋さんから200mのバッファ作成

バッファ作成は前回もやっているので同じような感じです。個々に保持する必要もないので、1つの図形にしてしまいます。
実行結果は"curry_b"テーブルに保存しておきます。

create table curry_b
as
select st_union(buffer(geometry, 200)) as geometry
from curry_p

さらにQGISで重ねて表示すると下図になります。

カレー屋を開くのにどのエリアがよいか探します

にぎわっているエリアのうち、カレー屋から200mのエリアに重ならないものを抽出します。
実行結果は"mesh_res"テーブルに保存しておきます。

create table mesh_res
as
select m.*
from mesh_l m, curry_b b
where intersects(m.geometry, b.geometry) != 1

下図の結果となります。

結果

接してるくらいの条件が少し違うかもしれませんね。。。
ほぼ同じ結果は得られるということで。

QGISでやった場合、調査用の100mメッシュを作ってくれるのは便利です。
データが全て準備で出来ていればデータベースで処理する選択肢もありですが、随時必要なデータを整備しながらだと、QGISのようなGUIでの編集機能や便利なデータ作成機能は必須ですね。

さてラスタ編に進みたいけど、これは中々手強そうですね。