概要
PostGISとQGISを使用して、重複ポリゴンを一つにまとめて、属性を,区切りで表示させる手順になります。
地番図などの修正作業で使うことになりそうです。
元々pluginなどで重複ポリゴンを抽出しようとしましたが、上手くいかず、方法を模索した結果、postgisを使用することで抽出できました。
情報保護の観点から、説明の画像を一部黒塗りしておりますので、ご了承ください。
手順詳細
postgis
postgisのインストール方法やshpの取り込み方は、こちらのサイトを参考にしてみてください。
localhostに作業用のDBを作成しておくとよいです。また、拡張機能でpostgisを追加しておきます。
重複を抽出したいshpを作業用のDBに追加します。ここではsagyoというDBを作成して、tochi2011という名前のshpを取り込んでいます。
以下のsqlを流して、重複ポリゴンの抽出を行います。
tochi_chofukuという新たな重複のあるデータのみのテーブルを作成します。
geom列(座標を文字列で表したもの)で、同じデータを抽出します。
CREATE TABLE tochi_chofuku AS
SELECT t1.*, t2.重複数
FROM “tochi2011” AS t1
INNER JOIN (
SELECT geom, COUNT(*) AS 重複数
FROM “tochi2011”
GROUP BY geom
HAVING COUNT(*) >= 2
) AS t2 ON t1.geom = t2.geom;
tochi2011から、tochi_chofukuを削除したテーブル(tochi_chofuku_sakujo)を作成します。
まずは、tochi2011のテーブルをコピーして、tochi_chofuku_sakujoというテーブルを作成します。
下記のsqlで作成します。
CREATE TABLE tochi_chofuku_sakujo AS
SELECT * FROM tochi2011;
次に、作成したtochi_chofuku_sakujoのテーブルに対して、下記のsqlを流します。
gidはidのことです。ユニークな値であれば、何でも大丈夫です。
DELETE FROM “tochi_chofuku_sakujo”
WHERE gid IN (
SELECT gid
FROM “tochi_chofuku”
);
tochi_chofukuのテーブルをもとに、重複しているポリゴンごとにフラグを付けたテーブル(tochi_chofuku_group_id)を作成します。
下記のsqlを流します。
(CREATE TABLE tochi_chofuku_group_id AS )
SELECT
a.*,
DENSE_RANK() OVER (ORDER BY a.geom) AS group_id
FROM “tochi_chofuku” AS a
QGIS
ここからQGISを使用します。
QGISを起動して、PostgreSQLからsagyoのDBに接続して、tochi_chofuku_group_idを追加します。
プロセシングツールボックス → ベクタジオメトリ → 集計 を選択します
入力レイヤをtochi_chofuku_group_id、グループ化のための式を「group_id」とします。
集計関数は、一つでよいものはminimum、,区切りにしたいものは、concatenateを選択します。
shpに名前を付けて(今回はtochi_chofuku_gattai.shp)、実行をクリックします。
すると、group_idごとにまとまったshpが出力されます。
土地重複部分を削除したデータ(tochi_chofuku_sakujo)と重複分のデータ(tochi_chofuku_gattai)をマージします。
PostgreSQLからsagyoのDBに接続して、tochi_chofuku_sakujoを追加します。
プロセシングツールボックス → ベクタ一般 → ベクタレイヤをマージ を選択します。
入力レイヤに、土地重複部分を削除したデータ(tochi_chofuku_sakujo)と重複分のデータ(tochi_chofuku_gattai)を選択して、出力レイヤに名前を付けて(ここでは、tochi_final)、実行します。
1つにまとまったポリゴンが完成します。