Spatial data outlier detection and visualization using Google Earth Engine
收藏NIAID Data Ecosystem2026-03-12 收录
下载链接:
https://doi.org/10.7910/DVN/9ZIUGQ
下载链接
链接失效反馈官方服务:
资源简介:
Spatial data outlier detection and visualization using Google Earth Engine This is associated with an article published by IEEE in IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing on 20 March 2019, available online at doi.org/10.1109/JSTARS.2019.2901404. Reference: Peter, B.G. and Messina, J.P., 2019. Errors in Time-Series Remote Sensing and an Open Access Application for Detecting and Visualizing Spatial Data Outliers Using Google Earth Engine. IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing, 12(4), pp.1165-1174. Link to manuscript https://ieeexplore.ieee.org/abstract/document/8672086 Interactive Google Earth Engine Application https://cartoscience.users.earthengine.app/view/outliers Google Earth Engine Code // Map view Map.setCenter(30, 20, 2.5).setOptions('HYBRID').style().set('cursor', 'crosshair'); // Mask options var countryList = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'), waterMask = ee.Image('UMD/hansen/global_forest_change_2015_v1_3').select('datamask').eq(1), forestMask = ee.ImageCollection('JAXA/ALOS/PALSAR/YEARLY/FNF').mode().eq(2), agModis = ee.ImageCollection('MODIS/006/MCD12Q1').select('LC_Type1').mode() .remap([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17], [0,0,0,0,0,0,0,0,0, 0, 0, 1, 0, 1, 0, 0, 0]), agGC = ee.Image('ESA/GLOBCOVER_L4_200901_200912_V2_3').select('landcover') .remap([11,14,20,30,40,50,60,70,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230], [ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), agMask = agModis.add(agGC).gt(0).eq(1); // Calculate stats var stats = function(year) { Map.layers().reset(); var scale = 10000; // Get input parameters var countrySelected = app.country.countrySelect.getValue(), region = countryList.filterMetadata('country_na', 'equals', countrySelected), version = app.inputBox.productBox.getValue(), band = app.inputBox.bandBox.getValue(); if (app.inputBox.customCheckbox.getValue() === true) { var latCoord = ee.Number.parse(app.inputBox.latCoordBox.getValue()).getInfo(), lonCoord = ee.Number.parse(app.inputBox.lonCoordBox.getValue()).getInfo(), distBuffer = ee.Number.parse(app.inputBox.distBox.getValue()).getInfo(), distNum = distBuffer*1000; region = ee.Geometry.Point([lonCoord,latCoord]).buffer(distNum).bounds(); } var image = ee.Image(version).select(band).clip(region); if (app.inputBox.imageCheckbox.getValue() === false) { var imageCollection = ee.ImageCollection(version).select(band); var startDate = ee.Date(imageCollection.first().get('system:time_start')).get('year'); var endDate = ee.Date(imageCollection.sort('system:time_start',false).first().get('system:time_start')).get('year'); imageCollection = ee.ImageCollection(version).select(band).filter(ee.Filter.calendarRange(startDate, endDate, 'year')).filterBounds(region); image = ee.Image(imageCollection.filter(ee.Filter.calendarRange(year, year, 'year')).mean()).clip(region); } if (app.inputBox.waterCheckbox.getValue() === true) { image = image.updateMask(waterMask); } if (app.inputBox.forestCheckbox.getValue() === true) { image = image.updateMask(forestMask); } if (app.inputBox.agricultureCheckbox.getValue() === true) { image = image.updateMask(agMask); } // Tukey's lower and upper fence var percentiles = image.reduceRegion({ reducer: ee.Reducer.percentile([10,25,50,75,90]), geometry: region, scale: scale, maxPixels: 1e12 }); var lowerQuartile = ee.Number(percentiles.get(band+'_p25')), median = ee.Number(percentiles.get(band+'_p50')), upperQuartile = ee.Number(percentiles.get(band+'_p75')); var IQR = upperQuartile.subtract(lowerQuartile), lowerFence = lowerQuartile.subtract(IQR.multiply(1.5)), upperFence = upperQuartile.add(IQR.multiply(1.5)); var quartiles = image.gt(lowerQuartile).add(image.gt(median)).add(image.gt(upperQuartile)) .remap([0,1,2,3],[1,2,3,4]).rename('quartile'), outliers = image.gt(lowerFence).add(image.gt(upperFence)).remap([0,1,2],[1,0,2]), tukeys = outliers.updateMask(outliers.neq(0)).rename('fence'); // Z-score var mean = ee.Number(image.reduceRegion({ reducer: ee.Reducer.mean(), geometry: region, scale: scale, maxPixels: 1e12 }).get(band)); var stdDev = ee.Number(image.reduceRegion({ reducer: ee.Reducer.stdDev(), geometry: region, scale: scale, maxPixels: 1e12 }).get(band)); var zScore = image.subtract(mean).divide(stdDev).rename('zscore'); // Modified Z-score var medAbsDev = image.subtract(median).abs(); var medianMedAbsDev = ee.Number(medAbsDev.reduceRegion({ reducer: ee.Reducer.median(), geometry: region, scale: scale, maxPixels: 1e12 }).get(band)); var zScoreMod = image.subtract(mean).multiply(0.6745).divide(medianMedAbsDev).abs().rename('zscore_mod'), zScoreModExp = zScoreMod.gt(3.5).multiply(3), zScoreModOutliers = zScoreModExp.updateMask(zScoreModExp.eq(3)).rename('zmod_outlier'); // Lower fence/upper fance + modified s-score outliers var combined = zScoreModExp.add(outliers).rename('combined_outliers').remap([0,1,2,3,4,5],[0,3,4,5,1,2]), // 0 = none // 1 = lower...
创建时间:
2021-03-06



