Operações geométricas

O Earth Engine oferece suporte a uma grande variedade de operações em objetos Geometry. Isso inclui operações em geometrias individuais, como calcular um buffer, centroide, caixa delimitadora, perímetro, envolvente convexa etc. Por exemplo:

Editor de código (JavaScript)

// Create a geodesic polygon.
var polygon = ee.Geometry.Polygon([
  [[-5, 40], [65, 40], [65, 60], [-5, 60], [-5, 60]]
]);

// Compute a buffer of the polygon.
var buffer = polygon.buffer(1000000);

// Compute the centroid of the polygon.
var centroid = polygon.centroid();
Map.addLayer(buffer, {}, 'buffer');
Map.addLayer(centroid, {}, 'centroid');

No exemplo anterior, a distância do buffer é especificada em metros.

As operações geométricas com suporte também incluem cálculos relacionais entre geometrias, como interseção, união, diferença, distância, contém etc. Para testar algumas dessas relações, as geometrias usam a regra "par-ímpar" por padrão. Pela regra par-ímpar, um ponto está dentro do polígono se uma linha desse ponto para algum ponto conhecido por estar fora do polígono cruza um número ímpar de outras bordas. O interior de um polígono é tudo o que está dentro da casca, e não dentro de um buraco. Como exemplo simples, um ponto dentro de um polígono circular precisa cruzar exatamente uma aresta para sair do polígono. As geometrias podem usar a regra "à esquerda", se necessário. Imagine percorrer os pontos de um anel na ordem indicada. O interior fica à esquerda.

Para demonstrar a diferença entre as geometrias criadas com a regra "à esquerda" (evenOdd: false) e as criadas com a regra "par-ímpar", o exemplo a seguir compara um ponto a dois polígonos diferentes:

Editor de código (JavaScript)

// Create a left-inside polygon.
var holePoly = ee.Geometry.Polygon({
  coords: [
    [[-35, -10], [-35, 10], [35, 10], [35, -10], [-35, -10]]
  ],
  evenOdd: false
});

// Create an even-odd version of the polygon.
var evenOddPoly = ee.Geometry({
  geoJson: holePoly,
  evenOdd: true
});

// Create a point to test the insideness of the polygon.
var pt = ee.Geometry.Point([1.5, 1.5]);

// Check insideness with a contains operator.
print(holePoly.contains(pt));       // false
print(evenOddPoly.contains(pt));    // true

O exemplo anterior demonstra como a ordem das coordenadas fornecidas ao construtor Polygon afeta o resultado quando um polígono à esquerda é construído. Especificamente, o ponto está fora do polígono à esquerda, mas dentro do polígono par-ímpar.

O exemplo a seguir calcula e visualiza geometrias derivadas com base na relação entre dois polígonos:

Editor de código (JavaScript)

// Create two circular geometries.
var poly1 = ee.Geometry.Point([-50, 30]).buffer(1e6);
var poly2 = ee.Geometry.Point([-40, 30]).buffer(1e6);

// Display polygon 1 in red and polygon 2 in blue.
Map.setCenter(-45, 30);
Map.addLayer(poly1, {color: 'FF0000'}, 'poly1');
Map.addLayer(poly2, {color: '0000FF'}, 'poly2');

// Compute the intersection, display it in green.
var intersection = poly1.intersection(poly2, ee.ErrorMargin(1));
Map.addLayer(intersection, {color: '00FF00'}, 'intersection');

// Compute the union, display it in magenta.
var union = poly1.union(poly2, ee.ErrorMargin(1));
Map.addLayer(union, {color: 'FF00FF'}, 'union');

// Compute the difference, display in yellow.
var diff1 = poly1.difference(poly2, ee.ErrorMargin(1));
Map.addLayer(diff1, {color: 'FFFF00'}, 'diff1');

// Compute symmetric difference, display in black.
var symDiff = poly1.symmetricDifference(poly2, ee.ErrorMargin(1));
Map.addLayer(symDiff, {color: '000000'}, 'symmetric difference');

Nestes exemplos, o parâmetro maxError é definido como um metro para as operações de geometria. O maxError é o erro máximo permitido, em metros, de transformações (como projeção ou reprojeção) que podem alterar a geometria. Se uma das geometrias estiver em uma projeção diferente da outra, o Earth Engine vai fazer o cálculo em um sistema de coordenadas esféricas, com uma precisão de projeção dada por maxError. Também é possível especificar uma projeção específica para fazer a computação, se necessário.