PostGIS データを QGIS で開いた際にレイヤーが重複表示される現象の修正方法

現象の概要

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 の構造差

特性PolygonZMMultiPolygonZM
定義単一の面要素(外環 1 つ+内環 0 以上)複数の PolygonZM を集合させた要素
構成連続した単一の面(穴あり可)地理的に分離した複数の面(論理的に同一オブジェクト)
例湖を含む一つの区画複数の島からなる諸島
OGC タイプPolygon ZMMultiPolygon ZM

WKT 表現の比較

PolygonZM は環を二重の括弧で表現します。

POLYGON ZM (
  (外環座標),
  (内環座標)
)

MultiPolygonZM は、さらに外側に括弧を追加し、各子面を独立して包裹します。

MULTIPOLYGON ZM (
  ((子面 1 の外環), (子面 1 の内環)),
  ((子面 2 の外環))
)

データベース上で複数の独立した面を単一の PolygonZM として保存するとジオメトリ無効となるため、論理的に同一でも空間的に分離している場合は MultiPolygonZM での保存が必須となります。

タグ: PostGIS QGIS ArcGIS Spatial SQL Geometry Types

10月19日 16:51 投稿