Złączenia przestrzenne

Zbiory można złączać według lokalizacji przestrzennej i według wartości właściwości. Aby złączać dane na podstawie lokalizacji przestrzennej, użyj filtra withinDistance() z określonymi polami złączenia .geo. Pole .geo wskazuje, że do obliczenia odległości ma być użyta geometria elementu. Załóżmy na przykład, że chcesz znaleźć wszystkie W tym celu użyj filtra w polach geometrycznych, ustawiając maksymalną odległość na 100 km za pomocą parametru distance:

Edytor kodu (JavaScript)

// Load a primary collection: protected areas (Yosemite National Park).
var primary = ee.FeatureCollection("WCMC/WDPA/current/polygons")
  .filter(ee.Filter.eq('NAME', 'Yosemite National Park'));

// Load a secondary collection: power plants.
var powerPlants = ee.FeatureCollection('WRI/GPPD/power_plants');

// Define a spatial filter, with distance 100 km.
var distFilter = ee.Filter.withinDistance({
  distance: 100000,
  leftField: '.geo',
  rightField: '.geo',
  maxError: 10
});

// Define a saveAll join.
var distSaveAll = ee.Join.saveAll({
  matchesKey: 'points',
  measureKey: 'distance'
});

// Apply the join.
var spatialJoined = distSaveAll.apply(primary, powerPlants, distFilter);

// Print the result.
print(spatialJoined);

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

import ee
import geemap.core as geemap

Colab (Python)

# Load a primary collection: protected areas (Yosemite National Park).
primary = ee.FeatureCollection('WCMC/WDPA/current/polygons').filter(
    ee.Filter.eq('NAME', 'Yosemite National Park')
)

# Load a secondary collection: power plants.
power_plants = ee.FeatureCollection('WRI/GPPD/power_plants')

# Define a spatial filter, with distance 100 km.
dist_filter = ee.Filter.withinDistance(
    distance=100000, leftField='.geo', rightField='.geo', maxError=10
)

# Define a saveAll join.
dist_save_all = ee.Join.saveAll(matchesKey='points', measureKey='distance')

# Apply the join.
spatial_joined = dist_save_all.apply(primary, power_plants, dist_filter)

# Print the result.
display(spatial_joined)

W poprzednim przykładzie tabela FeatureCollection jest złączana z inną tabelą FeatureCollection. Operacja złączenia saveAll() ustawia w przypadku każdego elementu w kolekcji primary właściwość points, która przechowuje listę punktów w odległości do 100 km od tego elementu. Odległość każdego punktu od funkcji jest przechowywana w właściwości distance każdego złączonego punktu.

Złączenia przestrzenne można też stosować do określania, które cechy w jednej kolekcji pokrywają się z cechami w innej. Rozważmy na przykład 2 zbiory obiektów: zbiór primary zawierający wielokąty przedstawiające granice stanów w USA oraz zbiór secondary zawierający punktowe lokalizacje elektrowni. Załóżmy, że trzeba określić liczbę krzyżujących się stanów. Można to zrobić za pomocą złączenia przestrzennego w ten sposób:

Edytor kodu (JavaScript)

// Load the primary collection: US state boundaries.
var states = ee.FeatureCollection('TIGER/2018/States');

// Load the secondary collection: power plants.
var powerPlants = ee.FeatureCollection('WRI/GPPD/power_plants');

// Define a spatial filter as geometries that intersect.
var spatialFilter = ee.Filter.intersects({
  leftField: '.geo',
  rightField: '.geo',
  maxError: 10
});

// Define a save all join.
var saveAllJoin = ee.Join.saveAll({
  matchesKey: 'power_plants',
});

// Apply the join.
var intersectJoined = saveAllJoin.apply(states, powerPlants, spatialFilter);

// Add power plant count per state as a property.
intersectJoined = intersectJoined.map(function(state) {
  // Get "power_plant" intersection list, count how many intersected this state.
  var nPowerPlants = ee.List(state.get('power_plants')).size();
  // Return the state feature with a new property: power plant count.
  return state.set('n_power_plants', nPowerPlants);
});

// Make a bar chart for the number of power plants per state.
var chart = ui.Chart.feature.byFeature(intersectJoined, 'NAME', 'n_power_plants')
  .setChartType('ColumnChart')
  .setSeriesNames({n_power_plants: 'Power plants'})
  .setOptions({
    title: 'Power plants per state',
    hAxis: {title: 'State'},
    vAxis: {title: 'Frequency'}});

// Print the chart to the console.
print(chart);

W poprzednim przykładzie zwróć uwagę, że filtr intersects() nie przechowuje odstępu, tak jak filtr withinDistance(). Dane wyjściowe powinny wyglądać mniej więcej tak jak na rysunku 1.

CA WRS2 join
Rysunek 1. Wykres słupkowy pokazujący liczbę elektrowni w poszczególnych stanach USA.