waigani's diary

QGISを中心にFOSS4Gをいじくる

ST_LineMerge()を試してみる

QGIS初心者掲示板への投稿

ラインデータの統合についてという質問があがっていたのですが、QGISから離れてspatialiteで処理してみましょう。
案外簡単だよ、とか思っていただければ幸いですが、SQLの知識は必要になるからそうでもないかな・・・

spatialiteの使い方

FOSS4G Hokkaidoハンズオン(裏メニュー) を参照いただきたいです。

  • spatialite-gui使うと楽
  • dbの作り方
  • shapefileのload
  • SQLの実行方法
  • 結果をQGISで表示してみる

辺りをさーっと見といてください。

ラインデータの結合

ラインデータの結合には、ST_LineMerge()という関数があります。リンク先はPostGISですが、同じと思っておきましょう。spatialiteで使える関数一覧は、SpatiaLite 3.0.0 SQL functions reference listを見ておきましょう。

テストデータ作成

以下のSQL文を順に実行してテストデータを作成します。sridは仮に4326としています。

CREATE TABLE mergetest (attr1 varchar);

select addgeometrycolumn('mergetest', 'geom', 4326, 'LINESTRING', 'XY');

insert into mergetest(attr1, geom) 
values('A', st_linefromtext('LINESTRING(1 1, 2 1)', 4326));

insert into mergetest(attr1, geom) 
values('A', st_linefromtext('LINESTRING(2 1, 3 1)', 4326));

insert into mergetest(attr1, geom) 
values('B', st_linefromtext('LINESTRING(3 1, 4 1)', 4326));

insert into mergetest(attr1, geom) 
values('C', st_linefromtext('LINESTRING(1 3, 2 3)', 4326));

insert into mergetest(attr1, geom) 
values('C', st_linefromtext('LINESTRING(2 3, 3 3)', 4326));

insert into mergetest(attr1, geom) 
values('C', st_linefromtext('LINESTRING(3 3, 4 3)', 4326));

insert into mergetest(attr1, geom) 
values('C', st_linefromtext('LINESTRING(2 2, 2 3)', 4326));

insert into mergetest(attr1, geom) 
values('D', st_linefromtext('LINESTRING(1 4, 2 4)', 4326));

insert into mergetest(attr1, geom) 
values('D', st_linefromtext('LINESTRING(1 5, 2 5)', 4326));

insert into mergetest(attr1, geom) 
values('E', st_linefromtext('LINESTRING(2 5, 3 5)', 4326));

QGISで、色分け&ラベルを付けて表示するとこんな感じになります。

テストケースの実行結果

こんな感じのSQL文を実行します。

create table mergeresult as
select attr1, st_multi(st_linemerge(st_union(geom))) geom
from mergetest
group by attr1

結果のgeometry typeはmultilinestringで出てきますので、ご注意ください。
同様にQGISで、色分け&ラベルを付けて表示するとこんな感じになります。
ラベルを図形の中間位置に発生させていますので、merge前の図と比べてみてください。

お手元のデータでお試しください

テストケースで実行したSQL文の

を変更していただければ、そのまま使えると思います。

こんなんでどうでしょう?

multi→single(追記です)

multiから個別の要素にばらしたい場合は、spatialite-guiから対応出来ます。
1. 'multi'の図形が入っているカラムを選択。この場合、mergeresultテーブルのgeomカラム
2. 右クリックでメニュー表示、"separating elementry Geometries"を選択
3. ダイアログが表示されるので情報確認して実行してください、新しいテーブルが作成されます