Earth Engine 中几何的意外行为
Unexpected behaviour of geometry in Earth Engine
我正在分析太阳能发电场并定义了两个几何区域。在下面的示例中,对于一个名为 'Stateline' 的站点,我绘制了该站点的边界并将几何图形保存为变量 'Stateline_boundary'。我在边界内绘制了太阳能电池板,它们存在于两个不同的组中,并将几何图形保存为变量 'Stateline_panels'。
Stateline_panels 有两个坐标列表(因为面板有两个区域)。
当我尝试从边界内的区域中减去面板覆盖的区域时,仅使用 'Stateline_panels' 几何中两个列表中的第一个(参见下面的代码和附图)。
var mask = Stateline_boundary
var mask_no_panels = mask.difference(Stateline_panels);
Map.addLayer(mask_no_panels,{},'Stateline_mask_no_panels',false);
我不明白几何体的行为。特别是为什么将 'Stateline_panels' 几何图形添加到地图时它会完整显示,但当用作遮罩时会破坏几何图形并且仅使用两个坐标列表中的第一个。
我打算写一个更长的问题来询问为什么几何变量在导入脚本而不是在脚本中列出时表现不同(我认为这不会有什么不同,但确实如此).但是我认为这是正在发生的事情的早期表现。
我发现最终有效的方法是使用 Earth Engine IDE 中的 多边形 工具单独创建几何资产 - 确保每个资产都在不同的图层(使用线条工具,然后转换为多边形从未奏效)。
这不仅更加灵活,而且在 Earth Engine 上更易于管理,因为编辑几何图形并不容易。我读到了顺时针 winding 的重要性——尽管我从未确定这是否是这里问题的一部分。如果我总是顺时针绘制多边形,问题就不会发生。
最后我的 aoi 被这样的多边形覆盖(每种颜色都有不同名称的 layer/geometry 对象):
一旦完成,在代码编辑器中操作每个几何对象就相对简单了。它们可以转换为 FeatureCollections 并使用简单的代码合并(或减去)——我的最终代码见下文。
通过导入生成的代码,在脚本之间共享它们也很容易。
我希望这对某人有所帮助 - 首先尝试回答一个问题(即使是我自己的问题)。 :)
// Convert panel geometries to Feature Collections and merge to create one object.
var spw = ee.FeatureCollection(stateline_panels_west);
var spe = ee.FeatureCollection(stateline_panels_east);
var stateline_panels = spw.merge(spe);
// Convert 'features to mask' geometries to Feature Collections.
var gc = ee.FeatureCollection(golf_course);
var sp = ee.FeatureCollection(salt_pan);
var sc = ee.FeatureCollection(solar_concentrator);
var h1 = ee.FeatureCollection(hill_1);
var h2 = ee.FeatureCollection(hill_2);
var h3 = ee.FeatureCollection(hill_3);
var mf = ee.FeatureCollection(misc_features);
// Merge geometries to create mask
var features_to_mask = gc.merge(sp).merge(sc).merge(h1).merge(h2).merge(h3).merge(mf);
// Convert 'Features_to_mask' to geometry (needed to create mask)
var features_to_mask = features_to_mask.geometry();
// Change name
var mask = features_to_mask
///// If site has other solar panels nearby need to add these separately & buffer by 1km
var extra_mask = ee.Feature(solar_concentrator);
var extra_mask = extra_mask.buffer(1000);
var extra_mask = extra_mask.geometry();
///// Join mask & extra mask into single feature using .union()
// Geometry objects
var mask = mask.union(extra_mask);
我正在分析太阳能发电场并定义了两个几何区域。在下面的示例中,对于一个名为 'Stateline' 的站点,我绘制了该站点的边界并将几何图形保存为变量 'Stateline_boundary'。我在边界内绘制了太阳能电池板,它们存在于两个不同的组中,并将几何图形保存为变量 'Stateline_panels'。
Stateline_panels 有两个坐标列表(因为面板有两个区域)。
当我尝试从边界内的区域中减去面板覆盖的区域时,仅使用 'Stateline_panels' 几何中两个列表中的第一个(参见下面的代码和附图)。
var mask = Stateline_boundary
var mask_no_panels = mask.difference(Stateline_panels);
Map.addLayer(mask_no_panels,{},'Stateline_mask_no_panels',false);
我不明白几何体的行为。特别是为什么将 'Stateline_panels' 几何图形添加到地图时它会完整显示,但当用作遮罩时会破坏几何图形并且仅使用两个坐标列表中的第一个。
我打算写一个更长的问题来询问为什么几何变量在导入脚本而不是在脚本中列出时表现不同(我认为这不会有什么不同,但确实如此).但是我认为这是正在发生的事情的早期表现。
我发现最终有效的方法是使用 Earth Engine IDE 中的 多边形 工具单独创建几何资产 - 确保每个资产都在不同的图层(使用线条工具,然后转换为多边形从未奏效)。
这不仅更加灵活,而且在 Earth Engine 上更易于管理,因为编辑几何图形并不容易。我读到了顺时针 winding 的重要性——尽管我从未确定这是否是这里问题的一部分。如果我总是顺时针绘制多边形,问题就不会发生。
最后我的 aoi 被这样的多边形覆盖(每种颜色都有不同名称的 layer/geometry 对象):
一旦完成,在代码编辑器中操作每个几何对象就相对简单了。它们可以转换为 FeatureCollections 并使用简单的代码合并(或减去)——我的最终代码见下文。
通过导入生成的代码,在脚本之间共享它们也很容易。
我希望这对某人有所帮助 - 首先尝试回答一个问题(即使是我自己的问题)。 :)
// Convert panel geometries to Feature Collections and merge to create one object.
var spw = ee.FeatureCollection(stateline_panels_west);
var spe = ee.FeatureCollection(stateline_panels_east);
var stateline_panels = spw.merge(spe);
// Convert 'features to mask' geometries to Feature Collections.
var gc = ee.FeatureCollection(golf_course);
var sp = ee.FeatureCollection(salt_pan);
var sc = ee.FeatureCollection(solar_concentrator);
var h1 = ee.FeatureCollection(hill_1);
var h2 = ee.FeatureCollection(hill_2);
var h3 = ee.FeatureCollection(hill_3);
var mf = ee.FeatureCollection(misc_features);
// Merge geometries to create mask
var features_to_mask = gc.merge(sp).merge(sc).merge(h1).merge(h2).merge(h3).merge(mf);
// Convert 'Features_to_mask' to geometry (needed to create mask)
var features_to_mask = features_to_mask.geometry();
// Change name
var mask = features_to_mask
///// If site has other solar panels nearby need to add these separately & buffer by 1km
var extra_mask = ee.Feature(solar_concentrator);
var extra_mask = extra_mask.buffer(1000);
var extra_mask = extra_mask.geometry();
///// Join mask & extra mask into single feature using .union()
// Geometry objects
var mask = mask.union(extra_mask);