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_extract
  modis_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_num
  
  for sds_i = 0, sds_num - 1 do begin
    sds_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_num
    print,'The include attributes name:'
    if sds_att_num gt 0 then begin ;循环获取属性信息
      for att_i=0,sds_att_num-1 do begin
        hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name;通过name关键字传递属性名称给右边的sds_att_name
        print,sds_att_name
      endfor
      print,string('****************************************')
    endif
    hdf_sd_endaccess, sds_id;关闭释放数据集
  endfor
  
end
  1. sds_id = hdf_sd_select(sd_id, sds_i)选中数据集.在sd_id文件下,sds_i的地址id是多少传递给sds_id
  2. hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num获取在sds_id位置上,文件的名字是什么,在这个文件下,又有多少数据集的属性att_num,赋值给natts
  3. hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例
  4. hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name;通过name关键字传递属性名称给右边的sds_att_name
  5. hdf_sd_endaccess, sds_id;关闭释放数据集
  6. hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name只是显示了数据集名字,如果想显示内容,可以加一个关键词,data = sds_data_info,获取到的信息很多时候是一个数组
pro hdf4_file_info_extract
  modis_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_num
  
  for sds_i = 0, sds_num - 1 do begin
    sds_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_num
    print,'The include attributes name:'
    if sds_att_num gt 0 then begin ;循环获取属性信息
      for att_i=0,sds_att_num-1 do begin
        hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_name
        print,sds_att_name
        help,sds_attname
        help,sds_data_info
      endfor
      print,string('****************************************')
    endif
    hdf_sd_endaccess, sds_id;关闭释放数据集
  endfor
  end

在这里插入图片描述
如果想把sds_att_name、sds_attname同时输出的时候呢?

    if sds_att_num gt 0 then begin ;循环获取属性信息
      for att_i=0,sds_att_num-1 do begin
        hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_name
        print,sds_att_name + sds_data_info
      endfor
      print,string('****************************************')
    endif

此时有内部转换错误,因为字符串和数据集内变量相加,不能直接相加,需要强制类型转换为string

    if sds_att_num gt 0 then begin ;循环获取属性信息
      for att_i=0,sds_att_num-1 do begin
        hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_name
        print,sds_att_name + string(sds_data_info)
      endfor
      print,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 begin
        hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_name
        print,sds_att_name + strcompress(string(sds_data_info))
      endfor
      print,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 begin
        hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_name
        print,sds_att_name + strcompress(string(sds_data_info),/remove_al)
      endfor
      print,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_extract
  modis_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_num
  
  for sds_i = 0, sds_num - 1 do begin
    sds_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_num
    print,'The include attributes name:'
    if sds_att_num gt 0 then begin ;循环获取属性信息
      for att_i=0,sds_att_num-1 do begin
        hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_name
        print,sds_att_name + ':'+strcompress(string(sds_data_info),/remove_al)
      endfor
      print,string('****************************************')
    endif
    hdf_sd_endaccess, sds_id;关闭释放数据集
  endfor
  
  for att_i = 0, att_num-1 do begin
    hdf_sd_attrinfo,sd_id,att_i, name = att_name
    print,'global att name:'
    print,att_name
  endfor
  hdf_Sd_end,sd_id
  end

HDF4文件读取示例-----目标数据TIFF输出

数组和数字 sf[0] 相乘 VS 数组和数组 sf 相乘 注意区分!

pro hdf4_dataset_read

  filename = '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_band2
  
  modis_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_band3
  
  modis_att_index = hdf_sd_attrfind(modis_sds_id,'scale_factor')
  hdf_sd_attrinfo, modis_sds_id,modis_att_index,data=sf
  modis_att_index = hdf_sd_attrfind(modis_sds_id,'_FillValue')
  hdf_sd_attrinfo,modis_sds_id,modis_att_index,data=fv
  
  hdf_sd_endaccess,modis_sds_id
  hdf_SD_end,modis_sd_id
  
  modis_target_data = modis_band2

  modis_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_name
  sd_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,data
  hdf_sd_endaccess,sds_id
  hdf_sd_end,sd_id
  return,data
 end
 
 function hdf4_attdata_get, file_name, sds_name, att_name
  sd_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_data
  hdf_sd_endaccess,sds_id
  hdf_sd_end,sd_id
  return, att_data
  end
  
  pro mod04_nearest_point_value_extracting
    ;程序功能:从modis-mod04气溶胶数据集中提取出特定经纬度点位的产品结果
    ;待提取点位坐标
    extract_lon = 116.40
    extract_lat = 39.90
    point_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_list
    print,file_n
    file_n = n_elements(file_list) ;计算文件数量
    print,file_n ;两种方式获取 file_n
    out_file = data_path+'point_value_'+point_name+'.txt'
    openw,1,out_file ;width = 80000,/append
  
    for file_i = 0, file_n-1 do begin
      out_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, year
      out_month = month
      out_day = day
      print,out_year,out_month,out_day
      
      print,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_lon
      y = modis_lat_data - extract_lat
      distance = 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 begin
        print,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,:,","))'
      endif
     endfor
    free_lun,1
  end

注意变量名不要写错,不要漏写“-”,注意英文标点不要写成中文。

其中将日期转换功能单独写为一个功能函数为:

  function hdf4_modis_data_read,file_base_name
      out_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,year
      out_month=month
      out_day=day
    return,[out_year,out_month,out_day]
  end

调用函数为:

for file_i = 0, file_n-1 do begin
      data= 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_day
      
      print,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_lon
      y = modis_lat_data - extract_lat
      distance = 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 begin
        print,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,:,","))'
      endif
     endfor
    free_lun,1
  end
  

(多数据)筛选数据

function hdf4_data_get, file_name,sds_name
  sd_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,data
  hdf_sd_endaccess,sds_id
  hdf_sd_end,sd_id
  return,data
 end
 
 function hdf4_attdata_get, file_name, sds_name, att_name
  sd_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_data
  hdf_sd_endaccess,sds_id
  hdf_sd_end,sd_id
  return, att_data
  end
  
  function hdf4_modis_data_read,file_base_name
      out_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,year
      out_month=month
      out_day=day
    return,[out_year,out_month,out_day]
  end
  
  
  pro 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_n
    file_n = n_elements(file_list) ;计算文件数量
    ;print,file_n ;两种方式获取 file_n
    for num_point_i = 0, n_elements(point_name)-1 do begin
       out_file = data_path+'point_value_'+point_name[num_point_i]+'.txt'
       print,out_file
       openw,1,out_file,/append ;width = 80000,/append
       
       for file_i = 0, file_n-1 do begin
         out_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_day

         print,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 continue
       print,'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 continue
       print,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,:,","))'; 注意写入的是数组里的数值,而不是数组!否则文件中大概率为空值!
 endfor
 free_lun,1
 endfor
 end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态规划-----路径问题

动态规划-----路径问题 下降最小路径和1:状态表示2:状态转移方程3 初始化4 填表顺序5 返回值6 代码实现 总结: 下降最小路径和 1:状态表示 假设:用dp[i][j]表示:到达[i,j]的最小路径 2:状态转…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战,文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能,但是可能会出现缓存一致性问题。如果数据频繁的变更,可能会导…

2024年大热,Access平替升级方案,也适合Excel用户

欢迎各位看官,您来了,就对了! 您多半是Access忠实粉丝,至少是excel用户,亦或是WPS用户吧。那就对了,今天的分享肯定对您有用。 本文1100字,阅读时长2分50秒! 现实总是不尽人意&am…

解决idea使用maven打包时无法将本地lib库文件和resource目录中的资源文件打包进jar文件的问题!!!

一、问题复现 1)项目结构如下 我们看到项目中手动添加了本地lib资源,同时bootspring的配置文件和mapper文件也放在了resouces目录中。 2)上述结构的项目在使用maven打包时,最终生成的jar文件中将不包含lib库文件,甚…

PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模型

PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模型 目录 PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模…

FPGA实战篇(呼吸灯实验)

1.呼吸灯简介 呼吸灯采用 PWM 的方式,在固定的频率下,通过调整占空比的方式来控制 LED 灯亮度的变化。 PWM(Pulse Width Modulation ),即脉冲宽度调制,它利用微处理器输出的 PWM 信号,实现对…

家政小程序开发,打造便捷家政生活小程序

目前,随着社会人就老龄化和生活压力的加重,家政服务市场的需求正在不断上升,家政市场的规模也正在逐渐扩大,发展前景可观。 在市场快速发展的影响下,越来越多的企业开始进入到市场中,同时家政市场布局也发…

《Python基础》之Pandas库

目录 一、简介 二、Pandas的核心数据结构 1、Series 2、DataFrame 三、数据读取与写入 1、数据读取 2、数据写入 四、数据清洗与处理 1、处理缺失值 2、处理重复值 3、数据转换 五、数据分析与可视化 1、统计描述 2、分组聚合 3、数据可视化 六、高级技巧 1、时…

Elasticsearch在liunx 中单机部署

下载配置 1、下载 官网下载地址 2、上传解压 tar -zxvf elasticsearch-XXX.tar.gz 3、新建组和用户 (elasticsearch 默认不允许root账户) #创建组 es groupadd es #新建用户 useradd ryzhang -g es 4、更改文件夹的用户权限 chown -R ryzhang …

基于 MVC 的 SpringBoot 高校行政事务管理系统:设计思路与实现步骤详解

2系统开发环境 2.1vue技术 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第…

不敢相信,Nginx 还能这么玩?

大家好,我是程序员鱼皮。今天来聊聊 Nginx 技术,这是一个企业项目必用,但是却经常被程序员忽略的技术。学好 Nginx,可以助你在求职中脱颖而出。 或许你会想:“Nginx 不就是用来部署网站的服务器嘛?这有何难…

【AI系统】指令和存储优化

指令和存储优化 除了应用极广的循环优化,在 AI 编译器底层还存在指令和存储这两种不同优化。 指令优化 指令优化依赖于硬件提供的特殊加速计算指令。这些指令,如向量化和张量化,能够显著提高计算密度和执行效率。向量化允许我们并行处理数…

底部导航栏新增功能按键

场景需求: 在底部导航栏添加power案件,单击息屏,长按 关机 如下实现图 借此需求,需要掌握技能: 底部导航栏如何实现新增、修改、删除底部导航栏流程对底部导航栏部分样式如何修改。 比如放不下、顺序排列、坑点如…

基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现

随着智能交通和无人驾驶技术的迅猛发展,精确可靠的导航系统已成为提升车辆定位精度与安全性的重要技术。全球定位系统(GPS)和惯性导航系统(INS)在导航应用中各具优势:GPS提供全球定位信息,而INS…

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后,后台无法启动jenkins服务,服务状态如下: 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…

shell编程 1 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了…

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段:1.Qfile Pro和2.Qsync Pro,实践使用中存在一些区别,针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…

【机器学习】分类任务: 二分类与多分类

二分类与多分类:概念与区别 二分类和多分类是分类任务的两种类型,区分的核心在于目标变量(label)的类别数: 二分类:目标变量 y 只有两个类别,通常记为 y∈{0,1} 或 y∈{−1,1}。 示例&#xff…

GaussDB(类似PostgreSQL)常用命令和注意事项

文章目录 前言GaussDB(类似PostgreSQL)常用命令和注意事项1. 连接到GaussDB数据库2. 查看当前数据库中的所有Schema3. 进入指定的Schema4. 查看Schema下的表、序列、视图5. 查看Schema下所有的表6. 查看表结构7. 开始事务8. 查询表字段注释9. 注意事项&a…

点灯大师——WIFI控制灯

在之前的教程中,我们学习了 ESP6266 的原理,并动手写了驱动,实现了串口的通讯和 STA、AP、STAAP 三种模式。本次我们就来教大家如何使用 ESP8266 控制灯。这是一个简单的示例,展示了如何将 WIFI 通信与硬件控制相结合,…