five

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
5,000+
优质数据集
54 个
任务类型
进入经典数据集
二维码
社区交流群

面向社区/商业的数据集话题

二维码
科研交流群

面向高校/科研机构的开源数据集话题

数据驱动未来

携手共赢发展

商业合作