Коллекции можно объединять по пространственному расположению, а также по значениям свойств. Чтобы присоединиться на основе пространственного местоположения, используйте фильтр 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);
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.
