現象の概要
ArcGIS を介して PostGIS データベースへインポートされたシェープファイルデータを、QGIS で接続して表示すると、同一のデータソースに対して 2 つのレイヤーが重複して表示されるケースがあります。一方、ArcGIS 側では単一のレイヤーとして正常に認識されています。
重複して表示されるレイヤーのジオメトリタイプを確認すると、一方が MultiPolygonZM、もう一方が PolygonZM となっていることが確認できます。
発生原因
この差異は、GIS ソフトウェアにおけるジオメトリタイプの解釈違いに起因します。
- ArcGIS:
PolygonZMとMultiPolygonZMを同一の面レイヤーとして統合的に扱い、表示を分割しません。 - QGIS: ジオメトリタイプを厳密に区別します。タイプが異なれば、同一テーブルであっても別々のレイヤーとして扱われます。
その結果、PostGIS テーブル内に这两种の类型が混在している場合、QGIS では 2 つのレイヤーとして認識されてしまいます。
解決手順:ジオメトリタイプの統一
データを削除したりソースを変更したりせず、すべてのジオメトリデータを MultiPolygonZM に統一することで解決できます。以下の SQL 操作を実行してください。
1. ジオメトリカラム名の特定
ArcGIS からのインポート時にジオメトリカラム名がデフォルトで wkb_geometry や shape などに設定されている場合があります。まず、対象テーブルの正確なカラム名と SRID を確認します。
SELECT
f_geometry_column AS geometry_column_name,
type AS geometry_type,
srid AS coordinate_system
FROM geometry_columns
WHERE f_table_name = 'map_layers';
実行結果から、geometry_column_name(例:location_geom)と coordinate_system(例:4326)を控えてください。
2. データの変換と型修正
特定した情報をもとに、以下の 2 つの SQL を順に実行します。ここでは、テーブル名を map_layers、ジオメトリカラムを location_geom、SRID を 4326 として例示します。
-- 全レコードのジオメトリを MultiPolygon 化
UPDATE map_layers
SET location_geom = ST_Multi(location_geom);
-- テーブル定義のジオメトリタイプを強制更新
ALTER TABLE map_layers
ALTER COLUMN location_geom
TYPE geometry(MultiPolygonZM, 4326)
USING location_geom::geometry(MultiPolygonZM, 4326);
実際の実行時には、map_layers、location_geom、4326 を環境に合わせて置き換えてください。
3. QGIS の更新
SQL 実行後、QGIS の PostGIS 接続を右クリックして「更新」を実行します。これで重複していたレイヤーが統合され、ArcGIS と同様に表示されます。
技術背景:ZM 次元とジオメトリ構造
本件に関連する技術用語について補足します。
ZM 次元の意味
- Z: 標高値。頂点座標に X, Y に加えて高度情報を含みます。
- M: 計測値。距離、時間、速度などの測地線参照や属性値を頂点に付与します。
PolygonZM や MultiPolygonZM は、各頂点が X, Y, Z, M の 4 値を保持していることを示します。
Polygon と MultiPolygon の構造差
| 特性 | PolygonZM | MultiPolygonZM |
|---|---|---|
| 定義 | 単一の面要素(外環 1 つ+内環 0 以上) | 複数の PolygonZM を集合させた要素 |
| 構成 | 連続した単一の面(穴あり可) | 地理的に分離した複数の面(論理的に同一オブジェクト) |
| 例 | 湖を含む一つの区画 | 複数の島からなる諸島 |
| OGC タイプ | Polygon ZM | MultiPolygon ZM |
WKT 表現の比較
PolygonZM は環を二重の括弧で表現します。
POLYGON ZM (
(外環座標),
(内環座標)
)
MultiPolygonZM は、さらに外側に括弧を追加し、各子面を独立して包裹します。
MULTIPOLYGON ZM (
((子面 1 の外環), (子面 1 の内環)),
((子面 2 の外環))
)
データベース上で複数の独立した面を単一の PolygonZM として保存するとジオメトリ無効となるため、論理的に同一でも空間的に分離している場合は MultiPolygonZM での保存が必須となります。