Algorithms—58.Length of Last Word

本文介绍了一个利用倒序查找的方法来确定输入字符串中最后一个非空单词的长度。通过逐步遍历字符串,从末尾开始寻找第一个非空字符,然后继续向前查找直到遇到空格或字符串结束,从而计算出最后一个单词的长度。

思路:倒着查。

public class Solution {
    public int lengthOfLastWord(String s) {
        if (s.length()==0) {
			return 0;
		}
        int e=-1;
        for (int i = s.length()-1; i >=0; i--) {
			if (!s.substring(i,i+1).equals(" ")) {
				e=i;
				break;
			}
		}
        if (e==-1) {
			return 0;
		}
        int b=-1;
        for (int i = e-1; i >=0; i--) {
			if (s.substring(i,i+1).equals(" ")) {
				b=i;
				break;
			}
		}
        System.out.println("b="+b);
        return b==-1?e+1:e-b;
    }
}


耗时:272ms,发现减少新建对象可以有效的提高速度。


内容概要:本文是一篇关于使用RandLANet模型对SensatUrban数据集进行点云语义分割的实战教程,系统介绍了从环境搭建、数据准备、模型训练与测试到精度评估的完整流程。文章详细说明了在Ubuntu系统下配置TensorFlow 2.2、CUDA及cuDNN等深度学习环境的方法,并指导用户下载和预处理SensatUrban数据集。随后,逐步讲解RandLANet代码的获取与运行方式,包括训练、测试命令的执行与参数含义,以及如何监控训练过程中的关键指标。最后,教程涵盖测试结果分析、向官方平台提交结果、解读评估报告及可视化效果等内容,并针对常见问题提供解决方案。; 适合人群:具备一定深度学习基础,熟悉Python编程和深度学习框架,从事计算机视觉或三维点云相关研究的学生、研究人员及工程师;适合希望动手实践点云语义分割项目的初学者与进阶者。; 使用场景及目标:①掌握RandLANet网络结构及其在点云语义分割任务中的应用;②学会完整部署一个点云分割项目,包括数据处理、模型训练、测试与性能评估;③为参与相关竞赛或科研项目提供技术支撑。; 阅读建议:建议读者结合提供的代码链接和密码访问完整资料,在本地或云端环境中边操作边学习,重点关注数据格式要求与训练参数设置,遇到问题时参考“常见问题与解决技巧”部分及时排查。
内容概要:本文详细介绍了三相异步电机SVPWM-DTC(空间矢量脉宽调制-直接转矩控制)的Simulink仿真实现方法,结合DTC响应快与SVPWM谐波小的优点,构建高性能电机控制系统。文章系统阐述了控制原理,包括定子磁链观测、转矩与磁链误差滞环比较、扇区判断及电压矢量选择,并通过SVPWM技术生成固定频率PWM信号,提升系统稳态性能。同时提供了完整的Simulink建模流程,涵盖电机本体、磁链观测器、误差比较、矢量选择、SVPWM调制、逆变器驱动等模块的搭建与参数设置,给出了仿真调试要点与预期结果,如电流正弦性、转矩响应快、磁链轨迹趋圆等,并提出了模型优化与扩展方向,如改进观测器、自适应滞环、弱磁控制和转速闭环等。; 适合人群:电气工程、自动化及相关专业本科生、研究生,从事电机控制算法开发的工程师,具备一定MATLAB/Simulink和电机控制理论基础的技术人员。; 使用场景及目标:①掌握SVPWM-DTC控制策略的核心原理与实现方式;②在Simulink中独立完成三相异步电机高性能控制系统的建模与仿真;③通过仿真验证控制算法有效性,为实际工程应用提供设计依据。; 阅读建议:学习过程中应结合文中提供的电机参数和模块配置逐步搭建模型,重点关注磁链观测、矢量选择表和SVPWM调制的实现细节,仿真时注意滞环宽度与开关频率的调试,建议配合MATLAB官方工具箱文档进行参数校准与结果分析。
已经博主授权,源码转载自 https://pan.quark.cn/s/bf1e0d5b9490 本文重点阐述了Vue2.0多Tab切换组件的封装实践,详细说明了通过封装Tab切换组件达成多Tab切换功能,从而满足日常应用需求。 知识点1:Vue2.0多Tab切换组件的封装* 借助封装Tab切换组件,达成多Tab切换功能* 支持tab切换、tab定位、tab自动化仿React多Tab实现知识点2:TabItems组件的应用* 在index.vue文件中应用TabItems组件,借助name属性设定tab的标题* 通过:isContTab属性来设定tab的内容* 能够采用子组件作为tab的内容知识点3:TabItems组件的样式* 借助index.less文件来设定TabItems组件的样式* 设定tab的标题样式、背景色彩、边框样式等* 使用animation达成tab的切换动画知识点4:Vue2.0多Tab切换组件的构建* 借助运用Vue2.0框架,达成多Tab切换组件的封装* 使用Vue2.0的组件化理念,达成TabItems组件的封装* 通过运用Vue2.0的指令和绑定机制,达成tab的切换功能知识点5:Vue2.0多Tab切换组件的优势* 达成多Tab切换功能,满足日常应用需求* 支持tab切换、tab定位、tab自动化仿React多Tab实现* 能够满足多样的业务需求,具备良好的扩展性知识点6:Vue2.0多Tab切换组件的应用场景* 能够应用于多样的业务场景,例如:管理系统、电商平台、社交媒体等* 能够满足不同的业务需求,例如:多Tab切换、数据展示、交互式操作等* 能够与其它Vue2.0组件结合运用,达成复杂的业务逻辑Vue2.0多Tab切换组件的封装实例提供了...
代码下载地址: https://pan.quark.cn/s/41cd695ddf65 `htmldiff` 是一个以 Ruby 语言为基础构建的库,其主要功能是在 HTML 文档中展示文本之间的差异。 该库的一个显著特点在于它不仅能够识别出不同之处,还会借助 HTML 标签来呈现这些差异,从而让用户能够直观地观察到文本的变化情况。 这种特性使得 `htmldiff` 在版本控制、文档对比或任何需要展示文本变动场景的应用中显得尤为有用。 `htmldiff` 的核心作用是对比两个字符串,并生成一个 HTML 输出结果,这个结果会明确地指出哪些部分被添加、哪些部分被删除以及哪些部分被修改。 此外,通过运用 CSS,用户可以进一步调整差异展示的样式,使其与项目或网站的现有设计风格相协调。 在使用 `htmldiff` 之前,需要先完成该库的安装。 如果项目已经配置了 Ruby 环境和 Gemfile,可以在 Gemfile 文件中添加 `gem htmldiff` 语句,随后执行 `bundle install` 命令进行安装。 如果没有 Gemfile 文件,也可以直接采用 `gem install htmldiff` 命令来进行全局安装。 在编程实现时,可以通过调用 `Htmldiff.diff` 方法来对比两个字符串,并获取相应的 HTML 输出。 例如:```rubyrequire htmldiffstr1 = "这是一个示例文本。 "str2 = "这是一个示例文本,现在有更多内容。 "diff_html = Htmldiff.diff(str1, str2)puts diff_html```上述代码将会输出两个字符串之间的差异,其中新增的内容会被 `<ins>` 标签所包围,而...
源码地址: https://pan.quark.cn/s/4b03c5611266 依据所提供的资料,可以判定这份资料是关于《电子技术基础模拟部分》第五版教科书第七章节的习题解析,由湖南人文科技学院通信与控制工程系的田汉平教师提供。 尽管具体内容未予展示,但能够围绕模拟电子技术的基础理论、第七章节所涉及的核心概念以及潜在的习题种类等方面来展开相关知识点的阐述。 ### 模拟电子技术概述模拟电子技术是电子工程学科中的一个关键领域,主要探讨模拟信号的产生、转换、传输和处理等议题。 模拟信号是指时间与幅度上均呈现连续变化的电信号。 模拟电路的设计与剖析是模拟电子技术的核心,它涵盖了放大器、振荡器、滤波器等电路的设计原理及其应用。 ### 第七章核心知识点猜测#### 1. 放大电路分析与设计- **基本放大电路**:共射极、共基极和共集电极放大电路的特性及其应用场景。 - **多级放大电路**:掌握如何将多个放大电路串联,以提升增益或优化频率响应。 - **差分放大电路**:用于抑制共模信号,放大差模信号,是精密仪器和测量设备中的关键构成部分。 #### 2. 反馈电路与稳定性- **反馈的基本概念**:正反馈与负反馈的区分,以及它们在电路中的应用场景。 - **深度负反馈**:解析深度负反馈状态下的放大器性能改进,包括增益稳定性和带宽的拓宽。 - **振荡电路**:理解LC振荡器、RC振荡器的工作机制及应用领域。 #### 3. 功率放大器- **A类、B类、AB类功率放大器**:熟练掌握不同类型功率放大器的特性、效率及其适用环境。 - **热效应与保护措施**:讨论在功率放大器设计过程中需要关注的散热问题及相应的防护措施。 #### 4. 集成运算放大器的应用- **理想运放模型**:熟...
<think> 我们遇到了错误提示:`ee.Algorithms.Not is not a function`。在Google Earth Engine中,`ee.Algorithms.Not`确实不存在。我们需要使用其他方式来实现逻辑非操作。 在GEE中,逻辑操作通常通过以下方式实现: - 逻辑非:使用`ee.Number(1).subtract(condition)` 或者 `condition.not()`(如果condition是布尔类型) - 逻辑与:`condition1.and(condition2)` - 逻辑或:`condition1.or(condition2)` 另外,我们也可以使用`ee.Algorithms.If`来根据条件返回不同的值,但注意`ee.Algorithms`模块并没有提供直接的逻辑操作函数(如`Not`)。 因此,我们需要修改代码中的逻辑非操作。具体来说,错误出现在以下行: ```javascript var imageValid = ee.Algorithms.Not(ee.Algorithms.IsEqual(temperatureImage.get('is_valid'), 1)); ``` 我们可以改为: ```javascript var imageValid = ee.Algorithms.IsEqual(temperatureImage.get('is_valid'), 1).not(); ``` 但需要注意的是,`get('is_valid')`返回的是一个`ee.ComputedObject`,我们需要确保它被转换为布尔类型或者使用`ee.Number`进行比较。然而,`not()`方法只能用于`ee.Number`或`ee.Boolean`类型的对象。因此,我们也可以使用: ```javascript var imageValid = ee.Number(1).subtract(ee.Algorithms.IsEqual(temperatureImage.get('is_valid'), 1)); ``` 但这样得到的是数字(1-条件结果,条件结果为0或1),这可能不适合作为条件使用。因为条件表达式需要布尔类型(或0/1数字)?实际上,在`ee.Algorithms.If`中,条件需要是一个布尔类型的服务器端对象,但GEE中通常用0和1来表示,所以我们可以使用数字比较。 然而,更直接的方式是使用`not()`方法。但我们必须确保前面的比较返回的是布尔类型(实际上,`ee.Algorithms.IsEqual`返回的是一个整数0或1,而不是布尔类型?)。在GEE中,比较操作返回的是整数(0或1),因此我们不能直接使用`.not()`,因为整数没有`not`方法。 因此,我们可以这样处理: 1. 将比较结果转换为布尔类型,然后使用`not()`,或者 2. 使用`ee.Number`的`eq(0)`来实现逻辑非。 这里我们采用第二种方法,因为比较结果已经是0或1,我们可以用: ```javascript var imageValid = ee.Algorithms.IsEqual(temperatureImage.get('is_valid'), 1).eq(0); ``` 因为如果相等返回1,那么1.eq(0)就是0(false),如果不相等返回0,0.eq(0)就是1(true)。这正好是逻辑非。 但是,这样会变得复杂。我们也可以直接使用: ```javascript var imageValid = ee.Algorithms.NotEqual(temperatureImage.get('is_valid'), 1); ``` 但是,GEE中并没有`ee.Algorithms.NotEqual`。所以我们可以用: ```javascript var imageValid = ee.Algorithms.IsEqual(temperatureImage.get('is_valid'), 1).not(); ``` 但注意,`ee.Algorithms.IsEqual`返回的是整数,整数没有`not`方法。所以我们需要先把它转为布尔值?实际上,在GEE中,整数0和1可以直接用`ee.Number`的`not`方法(但是`not`方法只对0返回1,对非0返回0,这不符合我们的需求,因为我们想要的是:当相等时为0,不相等时为1,即逻辑非)。 实际上,我们想要的是:如果`is_valid`不等于1,则`imageValid`为真(1),否则为假(0)。所以: ```javascript var imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); ``` 这样,当`is_valid`为1时,`neq(1)`返回0,否则返回1。但注意,我们想要的是逻辑非,即原来的条件为真(1)时,我们想要假(0);条件为假(0)时,我们想要真(1)。所以这样并不对。 实际上,我们想要的是:原条件(相等)的否定。所以: 原条件:`is_valid == 1` -> 我们想要 `is_valid != 1` 因此,我们可以使用: ```javascript var imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); ``` 这样,当`is_valid`不等于1时,`imageValid`为1(真);等于1时,为0(假)。这符合我们的逻辑。 因此,我们可以将所有的`ee.Algorithms.Not(ee.Algorithms.IsEqual(...))`替换为`ee.Number(...).neq(1)`。 但是,请注意,`temperatureImage.get('is_valid')`可能是未定义的(如果图像没有这个属性)?在我们的代码中,我们设置了`is_valid`属性,所以应该没问题。 所以,修改后的代码中,我们将使用: ```javascript var imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); ``` 这样修改后,应该可以避免使用`ee.Algorithms.Not`。 现在,我们重写整个`getAnnualTemperature`函数中的相关部分。 注意:在GEE中,使用`ee.Number`来确保类型是数字,然后使用`neq`方法。 我们修改三处: 1. 第一次有效性检查(MODIS之后) 2. 第二次有效性检查(ERA5之后) 3. 最终有效性检查(GLDAS之后) 同时,我们也要修改最后返回时的条件判断,那里使用了`ee.Algorithms.If`,条件部分我们同样使用`ee.Number(...).neq(1)`。 但是,注意最后返回时的条件: ```javascript return ee.Algorithms.If({ condition: isValid, // 这里我们希望isValid为真(非0)时,返回有效图像;否则返回无效图像 ... }); ``` 而我们的`isValid`现在是一个ee.Number对象(0或1),可以直接作为条件,因为GEE的条件表达式接受数值(0为假,非0为真)?实际上,在`ee.Algorithms.If`中,条件应该是一个整数(0表示假,非0表示真)或者一个布尔类型(但GEE中布尔类型也是用0和1表示的)。所以这样是可以的。 因此,我们修改后的代码为: ```javascript // 3. 温度数据处理函数 - 修复服务器端比较问题 function getAnnualTemperature(year) { var startDate = ee.Date.fromYMD(year, 1, 1); var endDate = startDate.advance(1, 'year'); // 定义无效图像标记 var invalidImage = ee.Image().set('is_valid', 0); // 尝试不同数据源 var modisDay = datasets.modis_day .filterDate(startDate, endDate) .filterBounds(regionGeometry); // 检查MODIS白天数据是否可用 var modisDayAvailable = modisDay.size().gt(0); // 处理MODIS数据 var temperatureImage = ee.Image( ee.Algorithms.If({ condition: modisDayAvailable, trueCase: modisDay.mean() .multiply(0.02).subtract(273.15) .rename('temp_day'), falseCase: invalidImage }) ); // 正确检查图像有效性 (服务器端方法): 如果 is_valid 不等于1,说明无效,需要尝试下一个数据源 var imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); // 如果MODIS不可用,尝试ERA5 temperatureImage = ee.Image( ee.Algorithms.If({ condition: imageValid, trueCase: ee.Algorithms.If({ condition: datasets.era5 .filterDate(startDate, endDate) .filterBounds(regionGeometry) .size().gt(0), trueCase: datasets.era5 .filterDate(startDate, endDate) .filterBounds(regionGeometry) .mean() .subtract(273.15) .rename('era5_temp'), falseCase: invalidImage }), falseCase: temperatureImage }) ); // 更新有效性检查 (服务器端方法) imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); // 如果ERA5不可用,尝试GLDAS temperatureImage = ee.Image( ee.Algorithms.If({ condition: imageValid, trueCase: ee.Algorithms.If({ condition: datasets.gldas .filterDate(startDate, endDate) .filterBounds(regionGeometry) .size().gt(0), trueCase: datasets.gldas .filterDate(startDate, endDate) .filterBounds(regionGeometry) .mean() .subtract(273.15) .rename('gldas_temp'), falseCase: invalidImage }), falseCase: temperatureImage }) ); // 最终有效性检查 (服务器端方法): 如果 is_valid 等于1,则为有效图像 var isValid = ee.Number(temperatureImage.get('is_valid')).eq(1); // 裁剪并设置属性 return ee.Algorithms.If({ condition: isValid, trueCase: temperatureImage .clip(regionGeometry) .set({ 'year': year, 'data_source': temperatureImage.bandNames().get(0), 'is_valid': 1 }), falseCase: invalidImage.set('year', year) }); } ``` 注意:在最后一部分,我们使用`isValid`作为条件,它应该是当`is_valid`等于1时为1(真),否则为0(假)。而`ee.Algorithms.If`在条件为真(非0)时返回`trueCase`,否则返回`falseCase`。 另外,我们在最后设置`is_valid`属性时,有效图像设为1,无效图像在`invalidImage`中设为0。所以最后返回时,有效图像会保留,无效图像则返回一个只有属性`year`和`is_valid=0`的图像。 现在,我们提供完整的代码,并修改了这三处。 ## 完整代码 ```javascript // =============================================== // 京津冀地区温度数据提取完整解决方案 (修复服务器端逻辑操作问题) // =============================================== // 1. 正确获取京津冀区域几何体 function getRegionGeometry() { var chinaAdmin1 = ee.FeatureCollection("FAO/GAUL_SIMPLIFIED_500m/2015/level1"); var beijing = chinaAdmin1.filter(ee.Filter.eq('ADM1_NAME', 'Beijing')); var tianjin = chinaAdmin1.filter(ee.Filter.eq('ADM1_NAME', 'Tianjin')); var hebei = chinaAdmin1.filter(ee.Filter.eq('ADM1_NAME', 'Hebei')); var mergedCollection = beijing.merge(tianjin).merge(hebei); var regionGeometry = mergedCollection.geometry().bounds(); return regionGeometry; } // 获取区域几何体 var regionGeometry = getRegionGeometry(); // 2. 温度数据源定义 var datasets = { modis_day: ee.ImageCollection("MODIS/061/MOD11A2").select('LST_Day_1km'), modis_night: ee.ImageCollection("MODIS/061/MOD11A2").select('LST_Night_1km'), era5: ee.ImageCollection("ECMWF/ERA5_LAND/MONTHLY").select('temperature_2m'), gldas: ee.ImageCollection("NASA/GLDAS/V021/NOAH/G025/T3H").select('Tair_f_inst') }; // 3. 温度数据处理函数 - 修复服务器端逻辑操作 function getAnnualTemperature(year) { var startDate = ee.Date.fromYMD(year, 1, 1); var endDate = startDate.advance(1, 'year'); // 定义无效图像标记 var invalidImage = ee.Image().set('is_valid', 0); // 尝试不同数据源 var modisDay = datasets.modis_day .filterDate(startDate, endDate) .filterBounds(regionGeometry); // 检查MODIS白天数据是否可用 var modisDayAvailable = modisDay.size().gt(0); // 处理MODIS数据 var temperatureImage = ee.Image( ee.Algorithms.If({ condition: modisDayAvailable, trueCase: modisDay.mean() .multiply(0.02).subtract(273.15) .rename('temp_day'), falseCase: invalidImage }) ); // 正确检查图像有效性 (服务器端方法): 如果 is_valid 不等于1,说明无效,需要尝试下一个数据源 var imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); // 如果MODIS不可用,尝试ERA5 temperatureImage = ee.Image( ee.Algorithms.If({ condition: imageValid, trueCase: ee.Algorithms.If({ condition: datasets.era5 .filterDate(startDate, endDate) .filterBounds(regionGeometry) .size().gt(0), trueCase: datasets.era5 .filterDate(startDate, endDate) .filterBounds(regionGeometry) .mean() .subtract(273.15) .rename('era5_temp'), falseCase: invalidImage }), falseCase: temperatureImage }) ); // 更新有效性检查 (服务器端方法) imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); // 如果ERA5不可用,尝试GLDAS temperatureImage = ee.Image( ee.Algorithms.If({ condition: imageValid, trueCase: ee.Algorithms.If({ condition: datasets.gldas .filterDate(startDate, endDate) .filterBounds(regionGeometry) .size().gt(0), trueCase: datasets.gldas .filterDate(startDate, endDate) .filterBounds(regionGeometry) .mean() .subtract(273.15) .rename('gldas_temp'), falseCase: invalidImage }), falseCase: temperatureImage }) ); // 最终有效性检查 (服务器端方法): 如果 is_valid 等于1,则为有效图像 var isValid = ee.Number(temperatureImage.get('is_valid')).eq(1); // 裁剪并设置属性 return ee.Algorithms.If({ condition: isValid, trueCase: temperatureImage .clip(regionGeometry) .set({ 'year': year, 'data_source': temperatureImage.bandNames().get(0), 'is_valid': 1 }), falseCase: invalidImage.set('year', year) }); } // 4. 时间范围处理 (2000-2023) var years = ee.List.sequence(2000, 2023); // 使用映射函数处理年份 var temperatureImages = years.map(function(year) { return getAnnualTemperature(year).set('year', year); }); // 过滤掉无效图像 (服务器端方法) var validImages = ee.ImageCollection(temperatureImages).filter( ee.Filter.eq('is_valid', 1) ); // 创建图像集合 var temperatureCollection = ee.ImageCollection(validImages); // 5. 可视化 var visParams = { min: -10, max: 30, palette: ['blue', 'cyan', 'green', 'yellow', 'red'] }; // 添加最新年份的温度图层 var latestTemp = temperatureCollection.filter( ee.Filter.eq('year', 2023) ).first(); Map.centerObject(regionGeometry, 6); Map.addLayer(latestTemp, visParams, '2023年平均温度'); // 6. 时间序列图表 // 计算区域平均温度 var chart = ui.Chart.image.series({ imageCollection: temperatureCollection, region: regionGeometry, reducer: ee.Reducer.mean(), scale: 5000, xProperty: 'year' }).setOptions({ title: '京津冀地区年平均温度变化 (2000-2023)', hAxis: {title: '年份'}, vAxis: {title: '温度 (°C)'}, lineWidth: 2, pointSize: 4 }); print(chart); // 7. 导出所有年份数据 // 使用批量导出方法 Export.image.toDrive({ image: temperatureCollection.toBands(), description: 'Annual_Temperature_Composite', folder: 'GEE_Temperature_Data', fileNamePrefix: 'temperature_composite', region: regionGeometry, scale: 1000, maxPixels: 1e13, crs: 'EPSG:4326', fileFormat: 'GeoTIFF' }); print('已创建复合图像导出任务'); print('脚本执行完成!'); ``` ## 错误修复总结 1. **问题原因**: - `ee.Algorithms.Not` 不是 GEE 中的有效函数。 - 之前的修复尝试使用了不存在的函数。 2. **解决方案**: - 使用 `ee.Number` 的 `neq` 方法替代逻辑非操作。 - 将 `ee.Algorithms.IsEqual(...)` 的比较结果转换为数字比较。 - 使用 `ee.Number(x).neq(y)` 实现“不等于”比较。 3. **修改点**: - 将三处有效性检查从 `ee.Algorithms.Not(ee.Algorithms.IsEqual(...))` 改为 `ee.Number(...).neq(1)` - 将最终有效性检查改为 `ee.Number(...).eq(1)` 此版本应能解决所有服务器端逻辑操作问题,并正确运行。 §§相关问题§§: 1. 在Google Earth Engine中如何处理条件判断和逻辑运算? 2. 如何优化GEE中的图像集合处理以提高性能? 3. 在GEE中导出大数据集的最佳实践是什么? 4. 如何调试Google Earth Engine脚本中的常见错误? </think> # 解决 "ee.Algorithms.Not is not a function" 错误 这个错误表明在 Google Earth Engine 中尝试使用了不存在的 `ee.Algorithms.Not` 方法。实际上,GEE 没有提供这个特定的逻辑操作方法,我们需要使用其他方式实现逻辑非操作。 ## 完整修复方案 ```javascript // =============================================== // 京津冀地区温度数据提取完整解决方案 (修复逻辑操作问题) // =============================================== // 1. 正确获取京津冀区域几何体 function getRegionGeometry() { var chinaAdmin1 = ee.FeatureCollection("FAO/GAUL_SIMPLIFIED_500m/2015/level1"); var beijing = chinaAdmin1.filter(ee.Filter.eq('ADM1_NAME', 'Beijing')); var tianjin = chinaAdmin1.filter(ee.Filter.eq('ADM1_NAME', 'Tianjin')); var hebei = chinaAdmin1.filter(ee.Filter.eq('ADM1_NAME', 'Hebei')); var mergedCollection = beijing.merge(tianjin).merge(hebei); var regionGeometry = mergedCollection.geometry().bounds(); return regionGeometry; } // 获取区域几何体 var regionGeometry = getRegionGeometry(); // 2. 温度数据源定义 var datasets = { modis_day: ee.ImageCollection("MODIS/061/MOD11A2").select('LST_Day_1km'), modis_night: ee.ImageCollection("MODIS/061/MOD11A2").select('LST_Night_1km'), era5: ee.ImageCollection("ECMWF/ERA5_LAND/MONTHLY").select('temperature_2m'), gldas: ee.ImageCollection("NASA/GLDAS/V021/NOAH/G025/T3H").select('Tair_f_inst') }; // 3. 温度数据处理函数 - 使用正确的逻辑操作方法 function getAnnualTemperature(year) { var startDate = ee.Date.fromYMD(year, 1, 1); var endDate = startDate.advance(1, 'year'); // 定义无效图像标记 var invalidImage = ee.Image().set('is_valid', 0); // 尝试不同数据源 var modisDay = datasets.modis_day .filterDate(startDate, endDate) .filterBounds(regionGeometry); // 检查MODIS白天数据是否可用 var modisDayAvailable = modisDay.size().gt(0); // 处理MODIS数据 var temperatureImage = ee.Image( ee.Algorithms.If({ condition: modisDayAvailable, trueCase: modisDay.mean() .multiply(0.02).subtract(273.15) .rename('temp_day'), falseCase: invalidImage }) ); // 正确检查图像有效性 (使用数字比较) var imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); // 如果MODIS不可用,尝试ERA5 temperatureImage = ee.Image( ee.Algorithms.If({ condition: imageValid, trueCase: ee.Algorithms.If({ condition: datasets.era5 .filterDate(startDate, endDate) .filterBounds(regionGeometry) .size().gt(0), trueCase: datasets.era5 .filterDate(startDate, endDate) .filterBounds(regionGeometry) .mean() .subtract(273.15) .rename('era5_temp'), falseCase: invalidImage }), falseCase: temperatureImage }) ); // 更新有效性检查 (使用数字比较) imageValid = ee.Number(temperatureImage.get('is_valid')).neq(1); // 如果ERA5不可用,尝试GLDAS temperatureImage = ee.Image( ee.Algorithms.If({ condition: imageValid, trueCase: ee.Algorithms.If({ condition: datasets.gldas .filterDate(startDate, endDate) .filterBounds(regionGeometry) .size().gt(0), trueCase: datasets.gldas .filterDate(startDate, endDate) .filterBounds(regionGeometry) .mean() .subtract(273.15) .rename('gldas_temp'), falseCase: invalidImage }), falseCase: temperatureImage }) ); // 最终有效性检查 (使用数字比较) var isValid = ee.Number(temperatureImage.get('is_valid')).eq(1); // 裁剪并设置属性 return ee.Algorithms.If({ condition: isValid, trueCase: temperatureImage .clip(regionGeometry) .set({ 'year': year, 'data_source': temperatureImage.bandNames().get(0), 'is_valid': 1 }), falseCase: invalidImage.set('year', year) }); } // 4. 时间范围处理 (2000-2023) var years = ee.List.sequence(2000,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值