GEEでポリゴンの集合演算をする

GEE

Google Earth Engine(GEE)でポリゴン同士の集合演算をしたいときがあると思います。

例えば、あるポリゴンのバッファーを取った後に、バッファーだけを切り出したい時や、隣り合ったポリゴンが重なった時に、結合したい場合があると思います。

そこで、本記事では、二つのポリゴンのAND演算や、OR演算、XOR演算をする方法を紹介していきます。

QGISの場合、各演算の名称はAND演算が交差、OR演算が結合、XOR演算が対象差分になります。

ソースコードを確認したい方はこちらから

手順

処理の手順はee.Geometryを使いポリゴンを作成した後、AND演算とOR演算は関数を適用するだけでできます。

XOR演算に関してはAND演算とOR演算を組み合わせて計算できます。

ポリゴンの作成(任意)

ポリゴンの作成をします。こちらは、GEEのポリゴン作成ツールからでも問題ありません。

今回は説明のため、下記のポリゴンを用意します

var polygon = ee.Geometry({
  "type": "Polygon",
  "coordinates": [
    [[139.80181450975107,35.59377329895019],
    [139.8134016526954,35.59377329895019],
    [139.8134016526954,35.60284606030559],
    [139.80181450975107,35.60284606030559],
    [139.80181450975107,35.59377329895019]]
  ]
});

var polygon2 = ee.Geometry({
  "type": "Polygon",
  "coordinates": [[
    [139.80541939866708,35.599775394681906],
    [139.81975312364267,35.599775394681906],
    [139.81975312364267,35.60801009586216],
    [139.80541939866708,35.60801009586216],
    [139.80541939866708,35.599775394681906]
  ]]
});

Map.addLayer(polygon, {}, "polygon1");
Map.addLayer(polygon2, {}, "polygon2");

Map.setCenter(139.8094, 35.6013, 15);

ポリゴンの形はシンプルにこんな感じで用意してます

AND演算

AND演算はintersection関数で計算できます。

使い方は簡単で、元のオブジェクト(polygon)とintersection関数の引数に比較したいポリゴン(polygon2)を指定すればいいだけです

使い方はこんな感じ!

var intersection = polygon.intersection(polygon2);
Map.addLayer(intersection, {}, "And");

OR演算

OR演算も同じくunion関数を指定するだけで計算できます。

使い方はAND演算と同じです

var union = polygon.union(polygon2);
Map.addLayer(union, {}, "Or");

XOR演算

XOR演算はAND演算とOR演算の結果を活用します

OR演算の結果に対してdifference関数を使い、AND演算の結果のみを除外させます

difference関数は引数に指定したポリゴンを含まない範囲を抽出できる関数です

これにより、XORを算出することができます

// Xor
var xor = union.difference(intersection);
Map.addLayer(xor, {}, "xor");

ソースコード

今回の記事の全体のソースコードはこちらになります!

基本的にコピペで実行すれば動作するはずです

コピペするのが面倒臭い方は作成したコードを公開しているのでこちらからでも動かせます

是非、参考にしてみてください!

var polygon = ee.Geometry({
  "type": "Polygon",
  "coordinates": [
    [[139.80181450975107,35.59377329895019],
    [139.8134016526954,35.59377329895019],
    [139.8134016526954,35.60284606030559],
    [139.80181450975107,35.60284606030559],
    [139.80181450975107,35.59377329895019]]
  ]
});

var polygon2 = ee.Geometry({
  "type": "Polygon",
  "coordinates": [[
    [139.80541939866708,35.599775394681906],
    [139.81975312364267,35.599775394681906],
    [139.81975312364267,35.60801009586216],
    [139.80541939866708,35.60801009586216],
    [139.80541939866708,35.599775394681906]
  ]]
});

Map.addLayer(polygon, {}, "polygon1");
Map.addLayer(polygon2, {}, "polygon2");

Map.setCenter(139.8094, 35.6013, 15);

// And
var intersection = polygon.intersection(polygon2);
Map.addLayer(intersection, {}, "And");

// Or
var union = polygon.union(polygon2);
Map.addLayer(union, {}, "Or");

// Xor
var xor = union.difference(intersection);
Map.addLayer(xor, {}, "xor");

コメント

タイトルとURLをコピーしました