GISにおける対称差(Symmetric Difference)とは
対称差(XOR、排他的論理和とも呼ばれます)は、2つのポリゴンレイヤーのうち重ならない部分だけを残し、共有部分は完全に取り除くベクターオーバーレイ処理です。古いゾーニング境界線と新しい境界線を比べたい場合や、2つのカバレッジエリアを比較したい場合など、2つの境界の間で何が変わったかを知りたいときに、このツールが答えを出してくれます。このツールは計算をすべてブラウザ内でローカルに実行します。地図上に直接2つの図形を描くか、GeoJSONファイルまたはZIP圧縮されたShapefileをアップロードすれば、データをどこにも送信することなく、独立したGeoJSON・Shapefile対応の対称差ツールとして動作します。地図自体は初期状態でベースマップなしで読み込まれるため、ツールは軽快に起動します。レイヤーの下に道路や衛星写真の背景が欲しい場合のみ、サイドバーからベースマップをオンにしてください。
レイヤーのスタイルを設定する
結果を含むすべてのレイヤーは個別にスタイルを変更でき、ベースマップ自体も完全に任意です。
- カラーピッカー: サイドバーの任意のレイヤーの横にある色見本をクリックすると、塗りつぶしと輪郭の色をその場で変更できます。
- 表示切り替え: レイヤーのチェックを外すと、削除せずに地図上で非表示にできます。レイヤーAとレイヤーBをそれぞれ単独で結果と比較したいときに便利です。
- ベースマップ切り替え: 地図はツールを軽快に保ち、図形に集中できるよう、初期状態ではベースマップなしで読み込まれます。サイドバーの「ベースマップを表示」をいつでもチェックすれば、レイヤーの下に道路または衛星写真のベースマップを追加でき、同じくらい簡単にオフにできます。
これらのスタイル設定はセッション外には一切保存されず、作業中の地図の見た目を制御するだけです。
複数のレイヤーを管理する
サイドバーのレイヤーマネージャーは、追加したすべてのポリゴンレイヤーと、生成したすべての対称差の結果を1つのリストにまとめて保持します。異なるレイヤーの組み合わせでツールを何度も実行し、すべての結果を同時に地図上に残しておくことができ、不要になったレイヤーは他に影響を与えずに削除できます。複数の候補境界がそれぞれ1つの基準レイヤーからどう異なるかを順番に確認する際に便利です。
対称差を支えるGISライブラリ
対称差は非常に一般的な処理であるため、ほとんどのGISソフトウェアが単一の名前付きツールとして提供していますが、その内部は多くの場合、このページで説明した和集合と差分の基本演算から構築されています。
- Turf.js(difference + union): このツール自体のエンジンです。Turf.jsには単一のsymmetricDifference関数はないため、このツールは@turf/differenceを2回、複数フィーチャーのレイヤーをディゾルブするために@turf/unionを呼び出しており、すべて純粋なJavaScriptとしてブラウザのタブ内で直接実行されます。
- PostGIS ST_SymDifference: PostgreSQLの空間拡張機能は、ST_SymDifferenceを単一のSQL関数として提供しており、ST_IntersectionやST_Differenceを計算するのと同じC++エンジンであるGEOSライブラリに支えられています。
- QGIS 対称差: QGISのプロセシングツールボックスには、ベクターオーバーレイの下に専用の「対称差」アルゴリズムがあり、これもインターフェースの裏側でGEOSを呼び出しています。
- ArcGIS 対称差: EsriのArcGIS Proには、2つのレイヤーを入力してXORを得るという同じ動作をするSymmetrical Differenceジオプロセシングツールがありますが、GEOSではなくEsri独自のジオメトリエンジンで実装されています。
- Shapely(symmetric_difference): PythonのShapelyライブラリは、そのジオメトリオブジェクトに直接.symmetric_difference()メソッドを公開しており、Shapelyのほぼすべての機能と同様、内部ではGEOSに処理を委譲しています。
対称差には特定のジオメトリのペアに対して正しい答えが一つしかないため、これら5つのツールはすべて同じ基礎数学に基づいています。実際の違いは、このサイトの他のオーバーレイツールと同様、計算がどこで実行されるかにあります。GEOSベースのツールはPostgreSQL、QGIS、またはPython環境のインストールを必要としますが、このツールのTurf.jsエンジンは、ポリゴンXORファインダーとしてお使いの端末上で直接動作するため、ファイルがどこにもアップロードされることはありません。
よくある質問
結果をエクスポートする
各レイヤーは個別にエクスポートすることも、まとめてすべてエクスポートすることもできます。
- 単一レイヤーのエクスポート: 任意のレイヤーの横にあるダウンロードアイコンをクリックすると、そのレイヤーのフィーチャーだけを独立した.geojsonファイルとしてエクスポートします。
- すべてをエクスポート: 「全レイヤーをダウンロード」ボタンは、レイヤーA、レイヤーB、対称差の結果を1つのGeoJSON FeatureCollectionにまとめ、各フィーチャーにどのレイヤー由来かのタグを付けます。
- GeoJSON形式: 出力ファイルはRFC 7946準拠の標準GeoJSONで、QGIS、ArcGIS、Google Earth、Mapboxなど、ほぼすべてのGISツールで直接開くことができます。
出力は純粋なGeoJSONであるため、後でこの同じツールに問題なく再インポートしたり、デスクトップGISソフトウェアで実行する他のGeoJSON・Shapefileワークフローに取り込んだりできます。
ステップバイステップ:対称差を求める





ポリゴンレイヤーの追加方法
対称差を計算する前にポリゴンをツールに取り込む方法は2つあり、どちらもGeoJSONまたはZIP圧縮されたShapefileに対応しています。
- 地図上に描画する: 「ポリゴンを描画」をクリックし、地図をクリックして頂点を配置し、ダブルクリック、Enterキー、または「完了」をクリックして図形を閉じます。2つ目のポリゴンを追加する場合はこれを繰り返します。
- ファイルをアップロードする: .geojsonファイル、またはZIP圧縮されたShapefile(.shp/.dbf/.shxを含む.zip)を地図上のどこかにドラッグ&ドロップするか、アップロードボタンを使用します。読み込まれるのはPolygonとMultiPolygonのフィーチャーのみで、ポイントとラインはスキップされます。
ポリゴンレイヤーが2つ以上そろったら、サイドバーで一方をレイヤーA、もう一方をレイヤーBとして選び、「対称差を計算」をクリックすると、重ならない部分だけが残ります。
実際の活用例
対称差アルゴリズムの仕組み
対称差には単純な集合論的な定義があります。ポリゴンAまたはポリゴンBのどちらかに属するが、両方には属さないすべての点です。数式で書くと、A ⊕ B = (A ∪ B) − (A ∩ B)、つまり2つの形状の和集合から共通部分を引いたものです。同じ演算を書く、実際にはより確実に計算しやすい、もう一つの同値な方法があります。A ⊕ B = (A − B) ∪ (B − A)、つまりBを取り除いたAの部分と、Aを取り除いたBの部分を組み合わせたものです。このツールは後者の方式を使用します。
この選択が重要な理由は、先に完全な和集合を計算してから共通部分を引くと、2つの別々のブール演算オーバーレイを連続して実行することになり、最初の演算での丸め誤差が2番目の演算に伝播してしまうためです。代わりに、AマイナスBとBマイナスAという2つの独立した差分演算を実行し、両方の結果を単に同じ出力レイヤーに配置する方式では、共有の中間ジオメトリがまったく不要になり、それぞれの半分が互いに影響を与えることなく独立して失敗できます。実際のデータセットに不正な形のリングが1つあっても、このツールは成功した方の半分をどちらかわかるようにラベル付けして返します。
このツールが実行するパイプライン
- 各入力レイヤーをディゾルブする: レイヤーに複数のフィーチャーがある場合、まずブール和集合によってその中のすべてのポリゴンを1つのジオメトリに統合し、レイヤーが個別のパーツのリストではなく1つの形状として扱われるようにします。
- AマイナスBを計算する: ディゾルブされたレイヤーAのジオメトリとレイヤーBのジオメトリを、このサイトのポリゴン差分ツールと同じスイープライン方式のブール差分アルゴリズムに渡し、Bの外側にあるAの部分だけを残します。
- BマイナスAを計算する: 同じアルゴリズムをレイヤーを入れ替えてもう一度実行し、Aの外側にあるBの部分だけを残します。
- 両方の結果にタグを付けて結合する: 残った各部分はプロパティ内で「Aのみ」または「Bのみ」とラベル付けされ、1つの出力レイヤーにまとめられるため、結果は常に2つの入力がどこで異なるかを正確に示します。
- 排他的な面積を合計する: 出力される各フィーチャーの面積は球面積の公式で合計され、ヘクタール、平方キロメートル、エーカーで表示されるため、形状に加えて数値も得られます。
2回の差分計算はそれぞれ、Martinez-Rueda方式のスイープラインによるブールクリッピングアルゴリズムです。すべてのエッジの端点を左から右へソートし、垂直な線でデータを走査しながら、ワインディングルールを使って生成された各セグメントがもう一方のポリゴンの内側か外側かを分類します。これは、このサイトのポリゴン交差ツールおよびポリゴン差分ツールで使われているのとまったく同じエンジン、まったく同じ数学です。対称差には新しいクリッピングアルゴリズムは必要なく、既存のものをオペランドを入れ替えて2回呼び出すだけで済みます。
関連するジオプロセシングツール
Map tiles © OpenStreetMap contributors and CARTO, Esri (satellite, opt-in). Symmetric difference math powered by Turf.js. Shapefile parsing by shpjs. Map rendering by Leaflet. All drawing, file reading and calculation is local, no data is uploaded to any server.
