在Google Earth Engine中利用陆水掩码筛选六边形网格陆地单元
Google Earth Engine 陆地区域六边形网格筛选方案
问题解答
利用水陆信息筛选FeatureCollection的方法
通过对每个六边形网格单元,在陆水掩码图像上统计陆地面积占比,保留陆地占比大于0的单元(或根据需求设置阈值,比如占比超过10%),排除纯水域网格。是否需要转换陆水掩码为几何?
不需要转换为几何,直接使用ee.Image类型的陆水掩码即可操作。核心思路是:
- 先定义陆地区域的掩码(比如MOD44W里
water_mask为0代表陆地) - 遍历FeatureCollection中的每个网格,用
reduceRegion计算该网格内陆地的面积或占比 - 给每个Feature添加陆地占比属性,再基于该属性筛选
若需转换几何的方案(不推荐)
如果一定要转,可将陆水掩码的陆地区域转成Polygon/MultiPolygon类型的FeatureCollection,方法是使用ee.Image.reduceToVectors(),但这种方法处理大范围数据时效率极低,远不如直接统计属性高效。适合的过滤器类型
使用filterMetadata()过滤器,基于每个网格计算出的陆地占比属性进行筛选,比如筛选陆地占比大于0的单元。
修正后的代码示例
// 导入覆盖欧洲的六边形网格FeatureCollection var hexGrid = ee.FeatureCollection('你的六边形网格资产ID'); // 加载MODIS陆水掩码数据集 var waterMask = ee.Image('MODIS/006/MOD44W') .select('water_mask') .eq(0); // 0表示陆地,1表示水域,生成陆地掩码 // 定义函数:给每个网格添加陆地占比属性 var addLandRatio = function(feature) { // 计算网格内陆地的面积 var landArea = waterMask.reduceRegion({ reducer: ee.Reducer.sum(), geometry: feature.geometry(), scale: 250, // MOD44W的分辨率是250m maxPixels: 1e10 }).get('water_mask'); // 计算网格总面积 var gridArea = feature.geometry().area(); // 计算陆地占比(避免除以0) var landRatio = ee.Number(landArea).divide(gridArea).max(0); // 返回添加了属性的Feature return feature.set({'land_ratio': landRatio}); }; // 给所有网格添加陆地占比属性 var hexGridWithRatio = hexGrid.map(addLandRatio); // 筛选陆地占比大于0的网格(排除纯水域) var filteredGrid = hexGridWithRatio.filterMetadata('land_ratio', 'greater_than', 0); // 可视化结果 Map.addLayer(filteredGrid, {color: 'green'}, '陆地六边形网格');
原filterBounds无效的原因
filterBounds()仅判断网格的几何范围是否与陆地掩码的几何有交集,但纯水域网格可能因边缘与陆地掩码的边界相交而被保留,无法准确排除纯水域单元。通过统计网格内的陆地占比,能精准判断网格是否包含陆地。
内容的提问来源于stack exchange,提问作者Lulu
相关产品推荐
相关产品推荐

