Пространственные соединения

Коллекции можно объединять по пространственному расположению, а также по значениям свойств. Чтобы присоединиться на основе пространственного местоположения, используйте фильтр withinDistance() с указанными полями соединения .geo . Поле .geo указывает, что геометрия элемента будет использоваться для вычисления метрики расстояния. Например, рассмотрим задачу найти все электростанции в радиусе 100 километров от национального парка Йосемити, США. Для этой цели используйте фильтр в полях геометрии, установив максимальное расстояние в 100 километров с помощью параметра distance :

Редактор кода (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);

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# 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)

Обратите внимание, что предыдущий пример объединяет FeatureCollection с другим FeatureCollection . Соединение saveAll() устанавливает свойство ( points ) для каждого объекта в primary коллекции, в котором хранится список точек в пределах 100 км от объекта. Расстояние каждой точки до объекта хранится в свойстве distance каждой присоединенной точки.

Пространственные соединения также можно использовать для определения того, какие объекты в одной коллекции пересекаются с объектами в другой. Например, рассмотрим две коллекции объектов: primary коллекцию, содержащую полигоны, представляющие границы штатов США, и secondary коллекцию, содержащую точечные местоположения, представляющие электростанции. Предположим, необходимо определить количество пересекающих каждое состояние. Это можно сделать с помощью пространственного соединения следующим образом:

Редактор кода (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);

Обратите внимание, что в предыдущем примере фильтр intersects() не сохраняет расстояние, как это делает фильтр withinDistance() . Результат должен выглядеть примерно так, как показано на рисунке 1.

CA WRS2 присоединиться
Рисунок 1. Гистограмма, показывающая количество электростанций, пересекающих каждый штат США.