ST_LineMerge()を試してみる
QGIS初心者掲示板への投稿
ラインデータの統合についてという質問があがっていたのですが、QGISから離れてspatialiteで処理してみましょう。
案外簡単だよ、とか思っていただければ幸いですが、SQLの知識は必要になるからそうでもないかな・・・
ラインデータの結合
ラインデータの結合には、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前の図と比べてみてください。
multi→single(追記です)
multiから個別の要素にばらしたい場合は、spatialite-guiから対応出来ます。
1. 'multi'の図形が入っているカラムを選択。この場合、mergeresultテーブルのgeomカラム
2. 右クリックでメニュー表示、"separating elementry Geometries"を選択
3. ダイアログが表示されるので情報確認して実行してください、新しいテーブルが作成されます