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);
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.
