按点提取像素值并转换为Google地球引擎中的表格

时间:2017-03-12 01:36:21

标签: extraction google-earth-engine

我正在开展一个项目,将火灾严重程度的现场测量与火灾前后Landsat图像得出的波段值和光谱指数联系起来。我目前正在使用Google Earth Engine从一组Landsat图像中提取表面反射值。我使用的方法将我的字段站点位置(点数据)作为要素集合导入,并使用getRegion函数从每个点的Landsat图像集合中提取带值。代码如下:

//IMPORT SAMPLE POINTS
var pts =     ee.FeatureCollection('ft:1N9Hb01uCSHqGpz262K_f9VzWedxvTiV0g6tJwfw4');

//IMPORT LANDSAT IMAGE
var L82014pre = ee.ImageCollection('LANDSAT/LC8_SR') //Landsat 8 Surface   reflectance
.filter(ee.Filter.eq('wrs_path', 94))
.filter(ee.Filter.eq('wrs_row', 86)) 
.filterDate(ee.Date.fromYMD(2013,12,13), ee.Date.fromYMD(2014,1,15)) 

//EXTRACT BY SAMPLE POINTS
var sample = L82014pre.getRegion(pts, 30);

我的问题是如何转换生成的样本'变量(列表列表)到可以导出到谷歌驱动器的表?或者是否有更好的方法通过Google地球引擎中的点提取图像数据?

我是Google地球引擎和Java编程语言的新手,所以如果这个问题的答案显而易见,我会道歉。我花了很多时间试图找到这个问题的解决方案,我觉得我无处可去。

谢谢,

2 个答案:

答案 0 :(得分:2)

我无法访问您的融合表,因此我为该示例编写了一些随机点。 我很确定还有其他方法可以做到这一点。 GEE有很多功能,有时它们使用起来有点棘手。这将是我的方式:

// As I can't access your FusionTable,
// I make random points and create a FeatureCollection
var p1 = ee.Geometry.Point([142.36083984375, -37.466138602344046])
var p2 = ee.Geometry.Point([143.23974609375, -37.04640889969956])
var pts = ee.FeatureCollection(ee.List([ee.Feature(p1),ee.Feature(p2)]))

//IMPORT LANDSAT IMAGE
var L82014pre = ee.ImageCollection('LANDSAT/LC8_SR') //Landsat 8 Surface   reflectance
.filter(ee.Filter.eq('wrs_path', 94))
.filter(ee.Filter.eq('wrs_row', 86)) 
.filterDate(ee.Date.fromYMD(2013,12,13), ee.Date.fromYMD(2014,1,15))

// Empty Collection to fill
var ft = ee.FeatureCollection(ee.List([]))

var fill = function(img, ini) {
  // type cast
  var inift = ee.FeatureCollection(ini)

  // gets the values for the points in the current img
  var ft2 = img.reduceRegions(pts, ee.Reducer.first(),30)

  // gets the date of the img
  var date = img.date().format()

  // writes the date in each feature
  var ft3 = ft2.map(function(f){return f.set("date", date)})

  // merges the FeatureCollections
  return inift.merge(ft3)
}

// Iterates over the ImageCollection
var newft = ee.FeatureCollection(L82014pre.iterate(fill, ft))

// Export
Export.table.toDrive(newft,
"anyDescription",
"anyFolder",
"anyNameYouWant")

答案 1 :(得分:2)

@Rodrigo,谢谢你的及时回复。点提取代码完美地适用于该示例。我尝试将点提取用于已应用云蒙版的另一组图像,并发现如果集合中第一个图像的第一个点落在蒙版之外(即在指定了' null&#的像素上) 39;值),导出的表不包含任何点的带数据。为了解决这个问题,我添加了一个过滤器来删除包含' null'在与要素集合并之前的值。

下面是包含一个示例的代码,该示例同时提取失败的提取不会删除' null'值和成功提取删除' null'值。

//cloud mask ------------------------------------------------------  
var maskCloudShadow = function(image){
var cfmask = image.select('cfmask');
return image.updateMask(cfmask.lt(1));   // keep clear (0) pixels
};

//select images from image collection -----------------------------
//extract filtered collection of Landsat 5 Surface Reflection
var L5fs1998post = ee.ImageCollection('LANDSAT/LT5_SR') //Landsat 5 Surface reflectance
.filterDate('1998-1-9', '1998-2-27') //filter to date bounds 
.filter(ee.Filter.eq('wrs_path', 91))//filter to path and row
.filter(ee.Filter.eq('wrs_row', 86))
.map(maskCloudShadow); //apply cloud and cloud shadow mask function
print(L5fs1998post);

//Create sample points --------------------------------------------
//var pts = 
ee.FeatureCollection('ft:1lfLgiQQSIIOpgjuZV5MZJno9_kLyQC49w6u3Hf9W');
var p1 = ee.Geometry.Point([146.84341192245483, -37.47371711676642]);
var p2 = ee.Geometry.Point([146.84167385101318, -37.4]);
var pts = ee.FeatureCollection(ee.List([ee.Feature(p1),ee.Feature(p2)]));

// Empty Collection to fill
var ft = ee.FeatureCollection(ee.List([]));

//Without removal of null values ----------------------------------
//Function to extract values from image collection based on point file and export as a table 
var fill = function(img, ini) {
// type cast
var inift = ee.FeatureCollection(ini);

// gets the values for the points in the current img
var ft2 = img.reduceRegions(pts, ee.Reducer.first(),30);

// gets the date of the img
var date = img.date().format();

// writes the date in each feature
var ft3 = ft2.map(function(f){return f.set("date", date)});

// merges the FeatureCollections
return inift.merge(ft3);
};

// Iterates over the ImageCollection
var newft = ee.FeatureCollection(L5fs1998post.iterate(fill, ft));
print(newft);

// Export
Export.table.toDrive(newft,
"anyDescription",
"EarthEngine",
"sample_include_null");

//With removal of null values ------------------------------------------
//Function to extract values from image collection based on point file and export as a table 
var fill = function(img, ini) {
// type cast
var inift = ee.FeatureCollection(ini);

// gets the values for the points in the current img
var ft2 = img.reduceRegions(pts, ee.Reducer.first(),30);

// gets the date of the img
var date = img.date().format();

// writes the date in each feature
var ft3 = ft2.map(function(f){return f.set("date", date)});

// merges the FeatureCollections

var ft3a = ft3.filter(ee.Filter.neq('B1', null));//filter first to remove null values
return inift.merge(ft3a);
};

// Iterates over the ImageCollection
var newft_remove_null = ee.FeatureCollection(L5fs1998post.iterate(fill, ft));
print(newft_remove_null);

// Export
Export.table.toDrive(newft_remove_null,
"anyDescription",
"EarthEngine",
"sample_remove_null");

//plot cloudy scene and sample points ------------------------------------
var scene = ee.Image('LANDSAT/LT5_SR/LT50910861998042');
Map.setCenter(147, -37.5, 9);
Map.addLayer(scene, {bands: ['B3', 'B2', 'B1'], min: 0, max: 2000}, 'false-color composite');
Map.addLayer(pts);