Operacje geometryczne

Earth Engine obsługuje wiele operacji na obiektach Geometry. Obejmują one operacje na poszczególnych geometriach, takie jak obliczanie bufora, centroidu, prostokąta ograniczającego, obwodu czy wypukłej otoczki. Przykłady:

Edytor kodu (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');

Z poprzedniego przykładu widać, że odległość buforowa jest podana w metrach.

Obsługiwane operacje geometryczne obejmują też obliczenia relacji między geometriami, takie jak przecięcie, złączenie, różnica, odległość, zawiera itp. Aby przetestować niektóre z tych relacji, geometrie domyślnie używają reguły parzysta. Zgodnie z zasadą parzystości–nieparzystości punkt znajduje się wewnątrz wielokąta, jeśli linia łącząca ten punkt z jakimś punktem znajdującym się na zewnątrz wielokąta przecina nieparzystą liczbę innych krawędzi. Wewnętrzna część wielokąta to wszystko, co znajduje się wewnątrz powłoki, a nie wewnątrz otworu. Na przykład punkt wewnątrz wielokąta okręgu musi przeciąć dokładnie 1 krawędź, aby opuścić wielokąt. W razie potrzeby geometrie mogą opcjonalnie używać reguły „z lewej strony”. Wyobraź sobie, że przechodzisz przez punkty pierścienia w podanej kolejności; wnętrze będzie po lewej stronie.

Aby zilustrować różnicę między geometriami utworzonymi przy użyciu reguły „z lewej do środka” (evenOdd: false) i reguły „parzysta–nieparzysta”, w tym przykładzie porównujemy punkt z 2 różnymi wielokątami:

Edytor kodu (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

Poprzedni przykład pokazuje, jak kolejność współrzędnych podanych do konstruktora Polygon wpływa na wynik podczas konstruowania lewostronnego wielokąta wewnętrznego. W szczególności punkt znajduje się na zewnątrz wielokąta lewej strony, ale wewnątrz wielokąta parzysto-nieparzystej.

W tym przykładzie obliczamy i wizualizujemy geometrie pochodne na podstawie relacji między 2 poligonami:

Edytor kodu (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');

Zwróć uwagę, że w tych przykładach parametr maxError ma ustawioną wartość 1 m w przypadku operacji geometrycznych. maxError to maksymalny dopuszczalny błąd w metrach wynikający z przekształceń (takich jak projekcja lub ponowna projekcja), które mogą zmienić geometrię. Jeśli jedna z geometrii jest w innej projekcji niż druga, Earth Engine wykona obliczenia w układzie współrzędnych sferycznych, a precyzja projekcji będzie określona przez maxError. W razie potrzeby możesz też określić konkretny typ projekcji, w której mają być wykonywane obliczenia.