IDL学习笔记(二)IDL处理卫星数据
IDL处理卫星数据
- HDF文件
- 数据集属性
- 通用属性
- 常用HDF4操作函数
- 常用的HDF5操作函数
- 读取HDF文件的一般步骤
- HDF4文件读取-----数据信息查询
- HDF4文件读取示例-----目标数据TIFF输出
- 提取modis产品中数据,与某一点经纬度最接近的点有效结果,并按每行内容为日期号、经度、纬度 AOD格式输出到IDL控制台
- 如何把modis的年积日,换成日期号?
- (多数据)筛选数据
HDF文件
数据集属性
数据集名称,是“:”前的一部分,不是long_name中的文字
通用属性
查看hdf的软件为HDF Explorer。也可以尝试使用Panoply进行简单的数据可视化(该软件也可以读nc文件)。
常用HDF4操作函数
HDF_SD_START函数是打开一个hdf文件。
HDF_SD_FILEINFO函数是查询hdf文件信息的。
HDF_SD_SELECT是选择数据集。
HDF_SD_NAMETOINDEX,已知数据集名称的情况下,获取数据集id号。
HDF_SD_GETDATA,获取指定数据集的id号所包含的数据。
HDF_SD_ATTRINFO,获取hdf属性信息。
使用完之后必须要关闭这个文件,不然的话相当于这个文件一直被占用,需要关闭、释放后掉。
常用的HDF5操作函数
读取HDF文件的一般步骤
1.指定文件名
2.打开文件
3.获取数据集/属性名称
4.获取数据集/属性ID
5.获取数据集/属性内容
6.下一步处理
HDF4文件读取-----数据信息查询
流程:
指定文件名–打开文件–获取文件数据集、属性的个数—循环获取数据集信息—(循环)—选中当前循环的数据集----获取当前数据集名称、属性个数、循环获取数据集属性信息----(是否完成循环)----否----获取属性名。-----是----判断数据集循环是否结束,若是则释放文件,若否循环继续。最后,释放文件
把光标放在函数上,按f1会直接跳转帮助
hdf_sd_fileinfo,sd_id,sds_num,att_num
文件名,文件id,(再任意定义两个文件名装返回结果),DataSets(数据集个数), Attributes(属性个数)--------获取文件数据集/属性个数
循环获取数据集信息:
pro hdf4_file_info_extractmodis_data = 'E:\Data\modis\2019\05\MOD09GA.A2019130.h27v05.061.2020293213719.hdf'sd_id = hdf_sd_start(modis_data,/read)hdf_sd_fileinfo,sd_id,sds_num,att_num;print,sds_num;print,att_numfor sds_i = 0, sds_num - 1 do beginsds_id = hdf_sd_select(sd_id, sds_i)hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例print, 'The sds name of '+strcompress(string(sds_i))+':'print,sds_att_numprint,'The include attributes name:'if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_nameendforprint,string('****************************************')endifhdf_sd_endaccess, sds_id;关闭释放数据集endforend
- sds_id = hdf_sd_select(sd_id, sds_i)选中数据集.在sd_id文件下,sds_i的地址id是多少传递给sds_id
- hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num获取在sds_id位置上,文件的名字是什么,在这个文件下,又有多少数据集的属性att_num,赋值给natts
- hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例
- hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name;通过name关键字传递属性名称给右边的sds_att_name
- hdf_sd_endaccess, sds_id;关闭释放数据集
- hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name只是显示了数据集名字,如果想显示内容,可以加一个关键词,data = sds_data_info,获取到的信息很多时候是一个数组
pro hdf4_file_info_extractmodis_data = 'E:\Data\modis\2019\05\MOD09GA.A2019130.h27v05.061.2020293213719.hdf'sd_id = hdf_sd_start(modis_data,/read)hdf_sd_fileinfo,sd_id,sds_num,att_num;print,sds_num;print,att_numfor sds_i = 0, sds_num - 1 do beginsds_id = hdf_sd_select(sd_id, sds_i)hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例print, 'The sds name of '+strcompress(string(sds_i))+':'print,sds_att_numprint,'The include attributes name:'if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_namehelp,sds_attnamehelp,sds_data_infoendforprint,string('****************************************')endifhdf_sd_endaccess, sds_id;关闭释放数据集endforend
如果想把sds_att_name、sds_attname同时输出的时候呢?
if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + sds_data_infoendforprint,string('****************************************')endif
此时有内部转换错误,因为字符串和数据集内变量相加,不能直接相加,需要强制类型转换为string
if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + string(sds_data_info)endforprint,string('****************************************')endif
此时可以相加,但是结果如图所示
valid_range 0
valid_range 2147483647
_FillValue -1
中间有很长的空格,此时是因为强制类型转换后,把转换前前面有多少个位也显示出来了,因此需要添加函数strcompress,使得空格不再那么长
if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + strcompress(string(sds_data_info))endforprint,string('****************************************')endif
此时结果:
The include attributes name:
long_nameNumber of additional observations per row
unitsnone
valid_range 0 valid_range 2147483647
_FillValue -1
如果一个空格都不想要,就可以添加关键字“/remove_all”
if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + strcompress(string(sds_data_info),/remove_al)endforprint,string('****************************************')endif
结果为:
The include attributes name:
long_nameNumberofadditionalobservationsperrow
unitsnone
valid_range0 valid_range2147483647
_FillValue-1
此时结果不好区分,可以认为在中间加一个冒号
print,sds_att_name + ':'+strcompress(string(sds_data_info),/remove_al)
获取全局信息,以及释放文件:
pro hdf4_file_info_extractmodis_data = 'E:\Data\modis\2019\05\MOD09GA.A2019130.h27v05.061.2020293213719.hdf'sd_id = hdf_sd_start(modis_data,/read)hdf_sd_fileinfo,sd_id,sds_num,att_num;print,sds_num;print,att_numfor sds_i = 0, sds_num - 1 do beginsds_id = hdf_sd_select(sd_id, sds_i)hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例print, 'The sds name of '+strcompress(string(sds_i))+':'print,sds_att_numprint,'The include attributes name:'if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + ':'+strcompress(string(sds_data_info),/remove_al)endforprint,string('****************************************')endifhdf_sd_endaccess, sds_id;关闭释放数据集endforfor att_i = 0, att_num-1 do beginhdf_sd_attrinfo,sd_id,att_i, name = att_nameprint,'global att name:'print,att_nameendforhdf_Sd_end,sd_idend
HDF4文件读取示例-----目标数据TIFF输出
数组和数字 sf[0] 相乘 VS 数组和数组 sf 相乘 注意区分!
pro hdf4_dataset_readfilename = 'E:\Data\modis\2019\05\MOD09GA.A2019130.h27v05.061.2020293213719.hdf'result_name = 'E:\Data\modis\2019\result\MOD09GA.A2019130.h27v05.061.2020293213719.tiff'modis_sd_id = hdf_sd_start(filename,/read)modis_sds = 'sur_refl_b02_1'modis_sds_index = hdf_sd_nametoindex(modis_sd_id,modis_sds);找到文件地址modis_sds_id = hdf_sd_select(modis_sd_id,modis_sds_index);转换为文件id号hdf_sd_getdata,modis_sds_id,modis_band2 ;由id找到文数据集,赋值给modis_band2modis_sds = 'sur_refl_b03_1'modis_sds_index = hdf_sd_nametoindex(modis_sd_id,modis_sds)modis_sds_id = hdf_sd_select(modis_sd_id,modis_sds_index)hdf_sd_getdata,modis_sds_id,modis_band3modis_att_index = hdf_sd_attrfind(modis_sds_id,'scale_factor')hdf_sd_attrinfo, modis_sds_id,modis_att_index,data=sfmodis_att_index = hdf_sd_attrfind(modis_sds_id,'_FillValue')hdf_sd_attrinfo,modis_sds_id,modis_att_index,data=fvhdf_sd_endaccess,modis_sds_idhdf_SD_end,modis_sd_idmodis_target_data = modis_band2modis_target_data = (modis_target_data ne fv[0])*modis_target_data*sf[0] ;注意这里乘以的是一个数,而不是一个恶搞数组write_tiff,result_name, modis_target_data,/float ;必须要加一个 /float 否则可能输出的是一个黑白图end
保存出去的图为:
保存成功!
提取modis产品中数据,与某一点经纬度最接近的点有效结果,并按每行内容为日期号、经度、纬度 AOD格式输出到IDL控制台
out_data = strmid(file_basename(file_list[file_i],10,7):
1.从file_list[file_i]中, 第10个位置, 提取7个字符出来,赋值给out_data
2.file_basename()意思是去除路径,只在文件名进行读取操作
print,outdata,modis_lon_data,modis[pos],modis_lat_data[pos]
此时输出的是一个数字一行,是1行3列的模式输出,那么如何能让3个数字都在一行呢?
print,[outdata,modis_lon_data,modis[pos],modis_lat_data[pos]]
这样就会以数组形式输出。但前面的日期会自动变成浮点数,该如何解决呢?
print,outdata, [modis_lon_data,modis[pos],modis_lat_data[pos]]
或
print,outdata, string([modis_lon_data,modis[pos],modis_lat_data[pos]])
就可以解决了
输出格式用逗号分隔:
print,outdata, [modis_lon_data,modis[pos],modis_lat_data[pos]],format = '(A,",",3(F0.3,:,","))'
format = ‘(A,“,”,3(F0,:,“,”))’ 格式控制, 第一个A代表是第一个以字符串形式输出,后接一个 , 号,然后输出三个浮点数。F0.3意思是保留三位小数。此时其实不加 [modis_lon_data,modis[pos],modis_lat_data[pos]] 的方括号也是可以的。:的意思是,如果换行的话,就不要后面的那个逗号
如何把modis的年积日,换成日期号?
IDL有函数,可以把儒略日自动转换为年月日。也有把一个日期转换为儒略日的功能。
如果modis产品日期写的是2018121,这就是意味着,从2017年12月31号过了121天,那么就只需要先算出2017.12.31的儒略日,就可以转而计算2018121对应的儒略日了。
strmid(file_basename(file_list[file_i],10,7),是字符串
fix()把目标转换为整形数
print,out_year,out_month,out,day, [modis_lon_data,modis[pos],modis_lat_data[pos]],format = '(I0,“-”, I02,“-”, I02,“-”, I02,",",3(F0.3,:,","))'
1.I0 表示保留数据本身的样子,本身自己前面的空格全部去除
2.“-”意思是中间以 - 链接
3.I02保留本身的5,但需要补足2位,2表示有几个字符占位,若缺少,自动以0补全
function hdf4_data_get, file_name,sds_namesd_id = hdf_sd_start(file_name,/read)sds_index = hdf_sd_nametoindex(sd_id,sds_name)sds_id = hdf_sd_select(sd_id,sds_index)hdf_sd_getdata,sds_id,datahdf_sd_endaccess,sds_idhdf_sd_end,sd_idreturn,dataendfunction hdf4_attdata_get, file_name, sds_name, att_namesd_id = hdf_sd_start(file_name)sds_index = hdf_sd_nametoindex(sd_id,sds_name)sds_id = hdf_sd_select(sd_id, sds_index)att_index = hdf_sd_attrfind(sds_id,att_name)hdf_sd_attrinfo, sds_id,att_index,data=att_datahdf_sd_endaccess,sds_idhdf_sd_end,sd_idreturn, att_dataendpro mod04_nearest_point_value_extracting;程序功能:从modis-mod04气溶胶数据集中提取出特定经纬度点位的产品结果;待提取点位坐标extract_lon = 116.40extract_lat = 39.90point_name = 'BeiJing'data_path = 'E:/Data/IDL/chapter_1/MODIS_2018_mod04_3k/'file_list = file_search(data_path,'*.hdf',count = file_n) ;查找data_path路径下,所有以hdf结尾的文件(包括子路径下的)print,file_listprint,file_nfile_n = n_elements(file_list) ;计算文件数量print,file_n ;两种方式获取 file_nout_file = data_path+'point_value_'+point_name+'.txt'openw,1,out_file ;width = 80000,/appendfor file_i = 0, file_n-1 do beginout_data = strmid(file_basename(file_list[file_i]),10,7)date = fix(strmid(file_basename(file_list[file_i]),14,3))out_year = strmid(file_basename(file_list[file_i]),10,4)out_year_fix = fix(strmid(file_basename(file_list[file_i]),10,4))date_julian = imsl_datetodays(31,12,out_year_fix-1)imsl_daystodate,date_julian + date, day, month, yearout_month = monthout_day = dayprint,out_year,out_month,out_dayprint,file_list[file_i]help,file_list[file_i]modis_lon_data = hdf4_data_get(file_list[file_i],'Longitude')modis_lat_data = hdf4_data_get(file_list[file_i],'Latitude')modis_aod_data = hdf4_data_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean')scale_factor=hdf4_attdata_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean','scale_factor')fill_value = hdf4_attdata_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean','_FillValue')modis_aod_data = (modis_aod_data ne fill_value[0])*modis_aod_data*scale_factor[0]x = modis_lon_data - extract_lony = modis_lat_data - extract_latdistance = sqrt(x^2 + y^2)min_dis = min(distance)pos = where(distance eq min_dis)extract_aod = modis_aod_data[pos]if extract_aod gt 0.0 then beginprint,out_data,modis_lon_data[pos],modis_lat_data[pos],extract_aod,format = '(A,",",3(F0.3,:,","))'print,out_year,out_month,out_day,day, modis_lon_data[pos],modis_lat_data[pos],format ='(I0,"-",I02,"-",I02,",",3(F0.3,:,","))'endifendforfree_lun,1end
注意变量名不要写错,不要漏写“-”,注意英文标点不要写成中文。
其中将日期转换功能单独写为一个功能函数为:
function hdf4_modis_data_read,file_base_nameout_date=strmid(file_basename(file_base_name),10,7)date=fix(strmid(file_basename(file_base_name),14,3))out_year=fix(strmid(file_basename(file_base_name),10,4))date_julian=imsl_datetodays(31,12,out_year-1) imsl_daystodate,date_julian+date,day,month,yearout_month=monthout_day=dayreturn,[out_year,out_month,out_day]end
调用函数为:
for file_i = 0, file_n-1 do begindata= hdf4_modis_data_read(file_list[file_i])out_year=data[0]out_month=data[1]out_day=data[2]print,out_year,out_month,out_dayprint,file_list[file_i]help,file_list[file_i]modis_lon_data = hdf4_data_get(file_list[file_i],'Longitude')modis_lat_data = hdf4_data_get(file_list[file_i],'Latitude')modis_aod_data = hdf4_data_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean')scale_factor=hdf4_attdata_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean','scale_factor')fill_value = hdf4_attdata_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean','_FillValue')modis_aod_data = (modis_aod_data ne fill_value[0])*modis_aod_data*scale_factor[0]x = modis_lon_data - extract_lony = modis_lat_data - extract_latdistance = sqrt(x^2 + y^2)min_dis = min(distance)pos = where(distance eq min_dis)extract_aod = modis_aod_data[pos]if extract_aod gt 0.0 then beginprint,out_year,out_month,out_day, modis_lon_data[pos],modis_lat_data[pos],extract_aod,format = '(A,",",3(F0.3,:,","))'print,out_year,out_month,out_day, modis_lon_data[pos],modis_lat_data[pos],format ='(I0,"-",I02,"-",I02,",",3(F0.3,:,","))'endifendforfree_lun,1end
(多数据)筛选数据
function hdf4_data_get, file_name,sds_namesd_id = hdf_sd_start(file_name,/read)sds_index = hdf_sd_nametoindex(sd_id,sds_name)sds_id = hdf_sd_select(sd_id,sds_index)hdf_sd_getdata,sds_id,datahdf_sd_endaccess,sds_idhdf_sd_end,sd_idreturn,dataendfunction hdf4_attdata_get, file_name, sds_name, att_namesd_id = hdf_sd_start(file_name)sds_index = hdf_sd_nametoindex(sd_id,sds_name)sds_id = hdf_sd_select(sd_id, sds_index)att_index = hdf_sd_attrfind(sds_id,att_name)hdf_sd_attrinfo, sds_id,att_index,data=att_datahdf_sd_endaccess,sds_idhdf_sd_end,sd_idreturn, att_dataendfunction hdf4_modis_data_read,file_base_nameout_date=strmid(file_basename(file_base_name),10,7)date=fix(strmid(file_basename(file_base_name),14,3))out_year=fix(strmid(file_basename(file_base_name),10,4))date_julian=imsl_datetodays(31,12,out_year-1) ;IMSL相关的函数说明在ENVI安装目录../Exelis/IDL85/help/pdf/advmathstats.pdf中imsl_daystodate,date_julian+date,day,month,yearout_month=monthout_day=dayreturn,[out_year,out_month,out_day]endpro mod04_nearest_point_value_extracting;程序功能:从modis-mod04气溶胶数据集中提取出特定经纬度点位的产品结果;待提取点位坐标extract_lon=[116.40,121.47,104.06]extract_lat=[39.90,31.23,30.67]point_name = ['BeiJing','ShangHai','ChengDu']data_path = 'E:/Data/IDL/chapter_1/MODIS_2018_mod04_3k/'file_list = file_search(data_path,'*.hdf',count = file_n) ;查找data_path路径下,所有以hdf结尾的文件(包括子路径下的);print,file_list;print,file_nfile_n = n_elements(file_list) ;计算文件数量;print,file_n ;两种方式获取 file_nfor num_point_i = 0, n_elements(point_name)-1 do beginout_file = data_path+'point_value_'+point_name[num_point_i]+'.txt'print,out_fileopenw,1,out_file,/append ;width = 80000,/appendfor file_i = 0, file_n-1 do beginout_data= hdf4_modis_data_read(file_list[file_i])out_year=out_data[0]out_month=out_data[1]out_day=out_data[2]print,out_year,out_month,out_dayprint,file_list[file_i]help,file_list[file_i]modis_lon_data = hdf4_data_get(file_list[file_i],'Longitude')modis_lat_data = hdf4_data_get(file_list[file_i],'Latitude')modis_aod_data = hdf4_data_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean')scale_factor=hdf4_attdata_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean','scale_factor')fill_value = hdf4_attdata_get(file_list[file_i],'Image_Optical_Depth_Land_And_Ocean','_FillValue')modis_aod_data = (modis_aod_data ne fill_value[0])*modis_aod_data*scale_factor[0];最小距离像元位置下标计算lon_minus = abs(modis_lon_data - extract_lon[num_point_i])lat_minus = abs(modis_lat_data - extract_lat[num_point_i])distance = sqrt(lon_minus^2+lat_minus^2)min_pos = where(distance eq min(distance)) ;不是直接输出min(distance)if (modis_aod_data[min_pos] le 0.0) then continueprint,'The three output formats of the nearest point to' + point_name[num_point_i] + 'in file' + file_basename(file_list[file_i]) + ':'print,out_year,out_month,out_day, string([modis_lon_data[min_pos[0]],modis_lat_data[min_pos[0]],modis_aod_data[min_pos[0]]])print,out_year,out_month,out_day, modis_lon_data[min_pos],modis_lat_data[min_pos],format = '(A,",",3(F0.3,:,","))'print,out_year,out_month,out_day, modis_lon_data[min_pos],modis_lat_data[min_pos],format ='(I0,"-",I02,"-",I02,",",3(F0.3,:,","))'print,'*************************************************************************************************************************************************************************'if min(distance) gt 0.1 then continueprint,1,out_year,out_month,out_day, modis_lon_data[min_pos[0]],modis_lat_data[min_pos[0]],format ='(I0,"-",I02,"-",I02,",",3(F0.3,:,","))'; 注意写入的是数组里的数值,而不是数组!否则文件中大概率为空值!endforfree_lun,1endforend
相关文章:
IDL学习笔记(二)IDL处理卫星数据
IDL处理卫星数据 HDF文件数据集属性通用属性 常用HDF4操作函数常用的HDF5操作函数读取HDF文件的一般步骤 HDF4文件读取-----数据信息查询HDF4文件读取示例-----目标数据TIFF输出提取modis产品中数据,与某一点经纬度最接近的点有效结果,并按每行内容为日期…...
用点云信息来进行监督目标检测
🍑个人主页:Jupiter. 🚀 所属专栏:传知代码 欢迎大家点赞收藏评论😊 目录 概述问题分析Making Lift-splat work well is hard深度不准确深度过拟合不准确的BEV语义 模型总体框架显性深度监督 深度细化模块演示效果核心…...
Python编写api接口读取电商商品详情数据示例
以下是一个使用 Python 的 Flask 框架来编写一个简单的 API 接口,用于读取模拟的电商商品详情数据的示例代码。这里假设商品详情数据是存储在一个简单的字典中模拟数据库存储,实际应用中你需要连接真正的数据库(如 MySQL、MongoDB 等…...
用纯 CSS 实现网格背景
是不是在日常开发中经常遇到实现网格的需求,网格通常对网页中展示的元素能起到很好的定位和对齐作用。 这里介绍如何只通过 CSS 来实现这个需求? 使用背景图 这里我们的背景图使用 SVG 来创建,首先,创建绘出一个正方形ÿ…...
CNN+LSTM+AM研究方向初尝试
CNNLSTMAM研究方向初尝试 简单介绍 CNN CNN 的基本结构 卷积层(Convolutional Layer): 该层通过卷积操作提取输入数据的特征。卷积操作使用多个卷积核(滤波器)对输入图像进行局部感知,从而识别出边缘、纹…...
对比 LiveData 和 Flow 的实现方式
前一段忙完了鸿蒙,现在又开始 Android 开发了。由于之前公司都是都是偏传统开发方式,基本都是 Java 开发 Android 那一套。现在开始学习现代 Android 开发了。 对比 LiveData 和 Flow 的实现方式 在 Android 开发中,LiveData 和 Flow 都可以用来管理异步数据流和实现 UI 的…...
React.memo 和useMemo 的区别
React.memo 和 useMemo 都是 React 中的性能优化工具,但它们的用途和工作原理不同。以下是它们的主要区别: 1. React.memo React.memo 是一个高阶组件(HOC),用于优化组件的渲染,防止不必要的重新渲染。当组…...
视频码率到底是什么?详细说明
视频码率(Video Bitrate)是指在单位时间内(通常是每秒)传输或处理的视频数据量,用比特(bit)表示。它通常用来衡量视频文件的压缩程度和质量,码率越高,视频质量越好&#…...
CentOS7停更后,如何配置国内Yum源、镜像源
CentOS7停更后,如何配置国内Yum源、镜像源 yum介绍步骤1. 备份原有的yum源文件2. 下载国内Yum源文件3. 清除缓存并更新Yum源4. 使用国内Yum源 yum介绍 Yum(Yellowdog Updater Modified)是一个在CentOS和Red Hat Enterprise Linux(…...
黑石云|Linux-基础口令
在Linux系统中,设置和管理口令(密码)是确保系统安全性的重要环节。以下是一些关于Linux基础口令的详细解释和操作指南: 一、口令设置命令 passwd命令 功能:用于更改当前用户的密码。 使用方法:在终端中输…...
如何配置Github并在本地提交代码
前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…...
UiPath API接口说明
Swagger网址 私有云网址(企业版) https://企业/swagger/index.html 公有云网址(社区版) https://cloud.uipath.com/linan/LinanZhang/orchestrator_/swagger/index.html#/ 常见问题 Swagger页面测试请求时报错“You are not a…...
Ubuntu22.04上kdump和crash的使用
0.前言 1.引用: 解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存-腾讯云开发者社区-腾讯云 解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云 ubuntu内核转储分析——kdump和crash的下载和使用_ubuntu kdump-CSDN博客 U…...
【2025最新计算机毕业设计】基于SSM+Vue中华传统文化吟诵知识学习系统
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
智能社区服务小程序+ssm(lw+演示+源码+运行)
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了智能社区服务小程序的开发全过程。通过分析智能社区服务小程序管理的不足,创建了一个计算机管理智能社区服务小程序的方案。文章介绍了智能社区服务…...
windows10电脑缺少dll文件的解决方案,系统缺少dll修复指南
在使用Windows 10操作系统时,有时会遇到由于缺少某些动态链接库(Dynamic Link Library, 简称DLL)文件而导致程序无法正常运行的问题。本指南将介绍几种解决此类问题的方法。 什么是DLL文件? DLL文件是Windows系统中的一种特殊类型…...
【设计模式系列】工厂方法模式(二十一)
一、什么是工厂方法模式 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,其核心目的是定义一个创建对象的接口,但让实现这个接口的子类来决定实例化哪一个类。工厂方法模式让类的实例化推迟到子类中进行,…...
etcd资源超额
集群内apiserver一直重启,重启kubelet服务后查看日志发现一下报错: Error from server: etcdserver: mvcc: database space exceeded 报错原因: etcd服务未设置自动压缩参数(auto-compact) etcd 默认不会自动 compa…...
数据结构与算法学习笔记----DFS
数据结构与算法学习笔记----DFS author: 明月清了个风 first publish time: 2024.12.4 revised: 2024.12.5 - 加了Acwing 843. n-皇后问题 。 ps⛹感觉DFS的题基本的思想就是递归,但是每题都有不一样的地方,每一题的思路和模拟过程都单独写在每一题里…...
力扣54.螺旋矩阵
题目描述 题目链接54. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2:…...
【原生js案例】webApp实现一个分享到的功能
这种分享到的效果很常见,在我们的网站上。鼠标滑入展示,滑出就隐藏。现在我们使用定时器功能来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】,里面有大量的css3动画效果制作原生知识分析,讲解…...
iPhone手机清理软件:相册清理大师推荐
随着智能手机成为我们日常生活的必需品,手机中的数据日益膨胀,尤其是照片和视频这类容易积累的文件。对于iPhone用户来说,管理这些文件,特别是清理相册变得尤为重要。本文将介绍一款备受推崇的iPhone手机清理软件——CleanMyPhone…...
Javaweb梳理21——Servlet
Javaweb梳理21——Servlet 21 Servlet21.1 简介21.3 执行流程21.4 生命周期4.5 方法介绍21.6 体系结构21.7 urlPattern配置21.8 XML配置 21 Servlet 21.1 简介 Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。使用Servlet就可以实现&…...
Serverless 时代
前端的边界探索,从客户端展开,以跨端为目标,用一套 JavaScript 代码生成多端平台,以此来实现大前端的统一。虽然在这条路上还不算尽善尽美,但各家公司的跨端方案已基本趋于成熟,并且已经运用到生产环境中。…...
docker安装clickhouse副本集群
docker安装clickhouse副本集群 1、clickhouse副本集群搭建1.1、docker安装zookeeper集群1.1.1、zookeeper第一个节点安装1.1.2、zookeeper第二个节点安装1.1.3、zookeeper第三个节点安装1.1.4、zookeeper客户端命令 2、Clickhouse副本集群搭建2.1、clickhouse搭建2.2、验证集群…...
详解AI网关助力配电房实现智能化管控应用
对于一些建设年份久远的老旧配电房,由于配套降温散热设施设备不完善、线路设备老化等因素,极易出现因环境过热而影响设备正常稳定运行,进而导致电气故障甚至火灾等事故产生。 基于AI网关的配电房智能监控及管理 针对配电房的实时安全监测及…...
uniapp调用腾讯定位api
1、注册腾讯地址api接口,创建应用获取key WebService API | 腾讯位置服务 2、配置获取方法getCity // 定位服务getCity(latitude, longitude) {const key XXXX-XXXX-XXXX-XXXX-XXXX; // 替换为你的腾讯位置服务密钥const url /apis.map.qq.com/ws/geocoder/v1/…...
映射vim键位,基本功能键位表(未更完)
键位映射:建议使用jj代替esc,毕竟esc离手那么远 linux下修改方法是:vim /etc/vim/vimrc 在该文件尾添加inoremap jj <Esc>该方法可以同样可以用到其他键位映射上 i:表示这个映射是在插入模式(insert mode)下有效…...
【Python】爬虫实战03:自动化抢票脚本【某麦网】
1. 脚本介绍 1.1 背景介绍 在这个数字化时代,演唱会、体育赛事和各种活动的门票销售往往在线上进行。由于热门活动的高需求和门票的有限供应,抢票成为了一场激烈的竞争。许多粉丝和爱好者经常因为手速不够快或网络延迟而错失购票机会。为了提高抢票的成…...
AspNet WebAPI 模型绑定问题
继承System.Web.Http.ApiController的Action的Model如果被[Serializable]定义,会导致Model的字段无法绑定。 Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll [Serializable] public class Model {public string id { get; set; } }public MyA…...
ISAAC SIM踩坑记录--添加第三方3D场景
ISAAC SIM仿真首先就是要有合适的3D场景,官方提供了一些场景,如果不能满足要求,那就只能自己建。 对于我这种不会3D建模的菜鸟,只能到网上下载了,sketchfab就是一个不错的平台,有不少免费资源可以下载。 …...
Linux中Crontab(定时任务)命令详解
文章目录 Linux中Crontab(定时任务)命令详解一、引言二、Crontab的基本使用1、Crontab命令格式2、Crontab常用操作 三、Crontab的配置与服务管理1、配置Crontab2、服务管理 四、使用示例1、每天凌晨2点备份网站数据2、每周一凌晨3点清理临时文件3、每月的…...
在Ubuntu中运行和管理AppImage
文章目录 什么是AppImage?如何在Ubuntu中运行AppImage?如何管理AppImage?安装AppImageLauncher如何添加AppImage到系统?如何从系统中移除AppImage? 总结 什么是AppImage? AppImage是一种将应用程序打包为单…...
2024年12月大语言模型最新对比:GPT-4、Claude 3、文心一言等详细评测
前言 随着人工智能技术的快速发展,大语言模型(LLM)已经成为了技术领域最热门的话题。本文将详细对比目前主流的大语言模型,帮助大家选择最适合的工具。 一、OpenAI GPT系列 1. GPT-4 核心优势: 多模态理解能力强 逻辑推理能力出色 创造…...
上下位关系自动检测方法
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
Linux入门攻坚——40、Linux集群系统入门-lvs(1)
Cluster,集群,为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展,系统扩展的方式:scale up,向上扩展,更换更好的主机;scale out,向外扩展&…...
结构篇| 浅析LLaMA网络架构
01 前言 LLaMA(Large Language Model Meta AI)是由Meta AI 发布的一个开放且高效的大型基础语言模型。为什么突然讲这个模型,主要LLaMA 已经成为了最受欢迎的开源大语言模型之一,LLaMA 系列模型在学术界和工业界引起了广泛的 关注,对于推动大语言模型技术的开源发展做出了…...
CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(不会)
通过网盘分享的文件:如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…...
openEuler卸载 rpm安装的 redis
停止 Redis 服务 sudo systemctl stop redis禁用 Redis 服务 sudo systemctl disable redis 卸载 Redis 软件包 sudo yum remove redis查找并删除 Redis 的残留文件 find / -name red*删除 Redis 配置文件 删除 Redis 数据文件 sudo rm -rf /var/lib/redis检查 Redis 是否…...
xxl-job分布式任务调度
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 GitHub:https://github.com/xuxueli/xxl-job 码云:https://gitee.com/xuxue…...
flutter_quill如何设置Editor中的文字为富文本
比如一个场景 在输入框中,某某某 是一个颜色,其他文本是一个颜色 这里要注意 const QuillEditor({required this.controller,required this.focusNode,required this.scrollController,required this.scrollable,required this.padding,required this…...
shell语法(1)bash
shell是我们通过命令行与操作系统沟通的语言,是一种解释型语言 shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用 Linux系统中一般默认使用bash为脚本解释器 在Linux中创建一个.sh文件,例如vim test.sh…...
AgGrid 组件封装设计笔记:自定义 icon 以及每个 icon 的点击事件处理
文章目录 问题目前解决效果 v1思路 目前解决效果 v0思路 代码V1 问题 自己封装的 AgGrid 如何自定义传递 icon ,以及点击事件的处理? 目前解决效果 v1 思路 目前解决效果 v0 思路 一张图片说明一下 代码 V1 父组件使用 <template><MyPageL…...
什么是TCP的三次握手
TCP(传输控制协议)的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据,并且初始化双方的序列号。以下是三次握手的详细步骤: 第一次握手(SYN)&…...
ElasticSearch学习记录
服务器操作系统版本:Ubuntu 24.04 Java版本:21 Spring Boot版本:3.3.5 如果打算用GUI,虚拟机安装Ubuntu 24.04,见 虚拟机安装Ubuntu 24.04及其常用软件(2024.7)_ubuntu24.04-CSDN博客文章浏览阅读6.6k次࿰…...
10.在 Vue 3 中使用 OpenLayers 加载引用 Stamen 地图(多种形式)
在 Web 地图开发中,OpenLayers 是一个非常强大且灵活的 JavaScript 库,它可以帮助我们加载各种地图层(如 OpenStreetMap、Google Maps、Bing Maps 等)。而 Stamen 地图是一个非常常见的地图样式,它提供了多种地图样式&…...
json与proto序列化,反序列化性能对比
1. 说proto快,必须知道他快多少?为什么快? 快多少? // 测试proto序列化和反序列化的性能func BenchmarkProtobufMarshal(b *testing.B) {// 创建一个 Request 对象req : &demo.Request{Ping: "ping",}// 测试序列化的性能b.ResetTimer()for i : 0; i < b…...
[Redis#14] 持久化 | RDB | bgsave | check-rdb | 灾备
目录 0.概述 持久化的策略 1 RDB 1.1 触发机制 1.2 流程说明 1.3 RDB 的优缺点 0.概述 在学习 MySQL 数据库时,我们了解到事务的四个核心特性:原子性、一致性、持久性和隔离性。这些特性确保了数据库操作的安全性和可靠性。当我们转向 Redis 时&a…...
ubuntu部署RocketMQ
Quick Start RocketMQ 下载 解压 把下载的文件解压重命名,放在想放的位置 需要提前配置JDK环境变量,或者直接在配置文件中指定JAVA_HOME 编辑 编辑 rocketmq/bin下的 runserver.sh 和runbroker.sh文件,把内存大小改小一点,因为…...
深入浅出:PHP中的变量与常量全解析
文章目录 引言理解变量普通变量赋值操作变量间赋值引用赋值取消引用 可变变量预定义变量 理解常量声明常量使用define()函数const关键字 使用常量预定义常量 扩展话题:作用域与生命周期实战案例总结与展望参考资料 引言 在编程的世界里,变量和常量是两种…...