转载请注明原文地址

本文纯属交流学习,请勿用作其他用途。匿名登录ModisFTP站点可能导致侵权,所造成的一切法律后果,本人概不负责。

一 介绍

Modis免费分发,光谱通道丰富,产品体系成熟,在多个行业和领域有广泛成功的应用。已成为重要的遥感数据源之一。一般若需获取modis数据,要注册wist账号,查询订购(免费)并等待回复mail,整个流程一般约需数小时。为了避免等待,本文用IDL语言实现了modis产品的地理范围查询,返回的url直接添加到迅雷下载任务列表。

图 迅雷添加modis 下载任务

运行环境:IDL7.0以上版本,迅雷5.0版本以上

二 原理背景

  • Modis官方ftp站点实时记录了5分钟产品的经纬度范围,并保存在txt文件中。Txt各列以逗号分隔,可以用记事本查看。
  • Modis官方ftp站点还保存有全部常规产品hdf格式文件。
  • IDL对象IDLnetUrl可以获取ftp站点目录列表,运行ftp命令,获得http协议url指向的文件。
  • IDL对象IDLcomIDispatch对象可以调用com /ole对象;迅雷ThunderAgent.Agent是一种ole组件,可用于新建添加迅雷下载任务。

三 流程步骤

  • 1) 指定日期、经纬度多边形polygon
  • 2) 获得指定日期5分钟产品的地理范围txt文件,获得指定日期5分钟产品列表(简洁模式)
  • 3) 解析txt中各5分钟产品经纬度范围、日夜模式,判断与指定的经纬度polygon是否相交;有交集则记录5分钟产品的url
  • 4) 将所有符合要求的hdf文件url添加为迅雷下载任务

四 源码

  1. IDL 源码;-----------------------------------------------------------------
  2.  
  3. pro ModisTest
  4. QUERY_DOWNLOAD,2010,7,18,[110,110,117,117],[34,30,30,34],PRODUCTNAME='021KM'
  5. end
  6. ;-----------------------------------------------------------------
  7.  
  8. PRO QUERY_DOWNLOAD,YEAR,MONTH,DAY,XPOLY,YPOLY,PRODUCTNAME=PRODUCTNAME
  9.  
  10. GET_MODIS_METAFILE,YEAR,MONTH,DAY,geometa1,MODLIST,/TERRA,PRODUCTNAME=PRODUCTNAME
  11. QUERY_MODIS,geometa1,MODLIST,XPOLY,YPOLY
  12.  
  13. GET_MODIS_METAFILE,YEAR,MONTH,DAY,geometa2,MYDLIST,/AQUA,PRODUCTNAME=PRODUCTNAME
  14. QUERY_MODIS,geometa2,MYDLIST,XPOLY,YPOLY
  15.  
  16. IF SIZE(MODLIST,/TYPE) EQ 7 THEN L = [MODLIST]
  17. IF SIZE(MYDLIST,/TYPE) EQ 7 THEN L = [L,MYDLIST]
  18. IF N_ELEMENTS(L) GT 0 THEN ADD_DOWNLOAD,L
  19.  
  20. END
  21. ;-----------------------------------------------------------------
  22.  
  23. PRO QUERY_MODIS,DATA,FILELIST,XPOLY,YPOLY
  24.  
  25. FLIST =FILELIST
  26. FILELIST = -1
  27. IF SIZE(DATA,/TYPE) NE 7 OR SIZE(FLIST,/TYPE) NE 7 OR N_ELEMENTS(XPOLY) NE N_ELEMENTS(YPOLY) THEN RETURN
  28.  
  29. G = {GEOMETA,G_ID:'',STARTTIME:'',SET:0B,ORBIT_NUMBER:1L,DAYNIGHT:0B,BOX:DINDGEN(4),X:DINDGEN(4),Y:DINDGEN(4)}
  30. META = [G]
  31.  
  32. FOR I = 3,N_ELEMENTS(DATA)-1 DO BEGIN
  33. IF N_ELEMENTS(DATA) LE 3 THEN RETURN;
  34.  
  35. TMP = STRSPLIT(DATA[I],",",/EXTRACT)
  36. IF N_ELEMENTS(TMP) EQ 17 THEN BEGIN
  37. G.G_ID = (STRSPLIT(TMP[0],'.',/EXTRACT))[2]
  38. G.STARTTIME = TMP[1]
  39. G.SET = TMP[2]
  40. G.ORBIT_NUMBER = TMP[3]
  41. G.DAYNIGHT = BYTE(TMP[4])
  42. G.BOX = TMP[5:8]
  43. G.X = TMP[9:12]
  44. G.Y = TMP[13:16]
  45. META = [META,G]
  46. ENDIF
  47. ENDFOR
  48.  
  49. IF N_ELEMENTS(META) GT 1 THEN META = META[1:*] ELSE RETURN
  50.  
  51. IDX = INTARR(480);
  52. I = FIX(STRMID(FILE_BASENAME(FLIST),18,4))/5
  53. IDX[I] = INDGEN(N_ELEMENTS(I))
  54.  
  55. ret = ['']
  56. FOR I = 0,N_ELEMENTS(META)-1 DO BEGIN
  57. id = IDX[FIX(META[I].G_ID)/5]
  58. ;
  59. ;换日线附近一般不满足要求
  60. IF (MAX(META[I].X) - MIN(META[I].X)) GT 300 THEN CONTINUE
  61. ;
  62. IF TOTAL(INSIDE(XPOLY,YPOLY,META[I].X,META[I].Y)) GT 0 $
  63. AND META[I].DAYNIGHT LT BYTE('N') $
  64. AND ID GT 0 THEN RET = [RET,FLIST[ID]]
  65. ENDFOR
  66.  
  67. FILELIST = N_ELEMENTS(RET) GT 1 ? RET[1:*] : -1
  68.  
  69. END
  70. ;-----------------------------------------------------------------
  71.  
  72. PRO GET_MODIS_METAFILE,YEAR,MONTH,DAY,GEOMETA,FLIST,TERRA=TERRA,AQUA=AQUA,PRODUCTNAME=PRODUCTNAME
  73. GEOMETA = -1
  74. FLIST = -1;
  75.  
  76. CATCH, errorStatus
  77. IF (errorStatus NE 0) THEN BEGIN
  78. CATCH, /CANCEL
  79. r = DIALOG_MESSAGE(!ERROR_STATE.msg, TITLE='URL Error', $
  80. /ERROR)
  81. PRINT, !ERROR_STATE.msg
  82. RETURN
  83. ENDIF
  84.  
  85. CASE 1 OF
  86. KEYWORD_SET(TERRA):BEGIN
  87. prefix = 'MOD'
  88. SATELLITE = 'TERRA'
  89. BREAK
  90. END
  91. KEYWORD_SET(AQUA):BEGIN
  92. prefix = 'MYD'
  93. SATELLITE = 'AQUA'
  94. BREAK
  95. END
  96. ELSE:RETURN
  97. ENDCASE
  98. PRODUCTNAME = KEYWORD_SET(PRODUCTNAME) ? PRODUCTNAME : '021KM'
  99.  
  100. site = 'ftp://ladsweb.nascom.nasa.gov'
  101. JDAY = JULDAY(MONTH,DAY,YEAR,0,0,0) - JULDAY(1,1,YEAR,0,0,0)
  102. FORMAT = '("geoMeta/6/'+SATELLITE+'/",i4,"/","'+PREFIX+'03_",I4,"-",I02,"-",I02,".txt")
  103. DIR_FMT = '("/allData/5/","'+prefix+PRODUCTNAME+'/",I4,"/",I03,"/")'
  104.  
  105. url = STRING([year,year,month,day],format=FORMAT)
  106. DIR = site+ STRING([YEAR,JDAY],FORMAT = DIR_FMT)
  107.  
  108. ; create a new url object
  109. oUrl = OBJ_NEW('IDLnetUrl',$
  110. CALLBACK_FUNCTION ='ddcall',$
  111. URL_SCHEME = 'ftp',$
  112. URL_HOST = 'ladsweb.nascom.nasa.gov',$
  113. URL_PATH = url,$
  114. URL_USERNAME = 'Anonymous',$
  115. URL_PASSWORD = '',$
  116. FTP_CONNECTION_MODE = 0)
  117.  
  118. GEOMETA = oUrl->Get( /STRING_ARRAY )
  119. FLIST = dir + oUrl->GetFtpDirList(url=DIR,/short)
  120.  
  121. oUrl->CloseConnections
  122. OBJ_DESTROY, oUrl
  123.  
  124. END
  125. ;-----------------------------------------------------------------
  126.  
  127. FUNCTION ddcall, status, progress, data
  128. PRINT, status
  129. RETURN, 1
  130. END
  131. ;-----------------------------------------------------------------
  132.  
  133. PRO ADD_DOWNLOAD,URL
  134.  
  135. oThunder = OBJ_NEW('IDLcomIDispatch$ProgId$ThunderAgent_Agent');
  136.  
  137. IF OBJ_VALID(oThunder) THEN BEGIN
  138. FOR I = 0,N_ELEMENTS(URL)-1 DO oThunder->ADDTASK,url[I],"","","","",1,0,5
  139. oThunder->COMMITTASKS,1
  140. OBJ_DESTROY ,oThunder
  141. ENDIF
  142. END
  143. ;-----------------------------------------------------------------
  144.  
  145. FUNCTION Inside, x, y, xpts, ypts, INDEX=index
  146.  
  147. On_Error, 1
  148.  
  149. sx = Size(xpts)
  150. sy = Size(ypts)
  151. IF (sx[0] EQ 1) THEN NX=sx[1] ELSE Message, 'X coordinates of polygon not a vector.'
  152. IF (sy[0] EQ 1) THEN NY=sy[1] ELSE Message, 'Y coordinates of polygon not a vector.'
  153. IF (NX EQ NY) THEN N = NX ELSE Message, 'Incompatable vector dimensions.'
  154.  
  155. ; Close the polygon.
  156. tmp_xpts = [xpts, xpts[0]]
  157. tmp_ypts = [ypts, ypts[0]]
  158.  
  159. ; Set up counters.
  160. i = indgen(N)
  161. ip = indgen(N)+1
  162.  
  163. nn = N_Elements(x)
  164. X1 = tmp_xpts(i) # Replicate(1,nn) - Replicate(1,n) # Reform([x],nn)
  165. Y1 = tmp_ypts(i) # Replicate(1,nn) - Replicate(1,n) # Reform([y],nn)
  166. X2 = tmp_xpts(ip) # Replicate(1,nn) - Replicate(1,n) # Reform([x],nn)
  167. Y2 = tmp_ypts(ip) # Replicate(1,nn) - Replicate(1,n) # Reform([y],nn)
  168.  
  169. dp = X1*X2 + Y1*Y2 ; Dot-product
  170. cp = X1*Y2 - Y1*X2 ; Cross-product
  171. theta = Atan(cp,dp)
  172.  
  173. ret = Replicate(0L, N_Elements(x))
  174. i = Where(Abs(Total(theta,1)) GT 0.01, count)
  175. IF (count GT 0) THEN ret(i)=1
  176.  
  177. ; Make this a scalar value if there is only one value.
  178. IF (N_Elements(ret) EQ 1) THEN ret=ret[0]
  179.  
  180. ; If the index keyword is set, then return indices.
  181. IF (Arg_Present(index)) THEN ret=(Indgen(/Long, N_Elements(x)))(Where(ret eq 1))
  182.  
  183. RETURN, ret
  184.  
  185. END
五 感谢

感谢 qqz的【原】根据Modis 分块计算经纬度程序 给我的启示。

IDL实现 Modis经纬度查询、迅雷下载的更多相关文章

  1. C# 调用迅雷 7 迅雷下载开放引擎

    最近有个项目需要用winform调用迅雷下载.上网百度后发现迅雷自带的com组件从迅雷5之后就废掉了,除了能添加任务,其余功能全不能用.后来又发现了迅雷下载开放引擎这么个东西 http://thund ...

  2. (原创)提取Xilinx开发工具的迅雷下载地址

    ①进入Xilinx官网,进入Device->Design Tools,选择你想要下载的任意工具. ②进入新web页面,右方点击“Downloads”.③进入版本选择页面,选择想要的版本号,点击相 ...

  3. Sql Server 2012 Enterprise Edition 企业版 迅雷 下载地址

    Sql Server 2012 Enterprise Edition 企业版 迅雷 下载地址 版本号 cn_sql_server_2012_enterprise_edition_x86_x64_dvd ...

  4. 解决jsp下载文件,迅雷下载路径不显示文件名称的问题

    如果浏览器安装了迅雷的插件,在jsp页面调用java后台实现文件下载功能时,会自动弹出迅雷下载,迅雷的下载路径会显示.do或者.xhtml之类的,为了解决这个问题,jsp页面修改如下: 写一个< ...

  5. htaccess高级应用:防盗链阻止迅雷下载以及限制访问

    导读: 合理利用htaccess文件,即使没有服务器的管理权限可以解决很多问题:比如用htaccess防盗链,阻止迅雷下载,限制用户访问指定类型的文件.判断User-agent阻止迅雷下载. Rewr ...

  6. 百度地图JavaScript API经纬度查询-MAP

    百度地图JavaScript API经纬度查询-MAP-ABCDEFGHIJKMHNOPQRSTUVWXYZ: 搜索:<input type="text" size=&quo ...

  7. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影<海王>详细信息[电影名称.电影迅雷下载地址列表] 2. 爬取最新动作片列表 获取电影列表页面数据来源地址 访问http:// ...

  8. genymotion virtual device 用迅雷下载

    找到虚拟机下载Log文件 打开后,找到原来下载的地址 以ova结尾的文件,然后用迅雷下载这个文件. 下载好的文件放在 C:\Users\用户名\AppData\Local\Genymobile\Gen ...

  9. C# 之 下载EXCEL文件,自动用迅雷下载aspx

    在浏览器中导出 Excel 得时候,如果浏览器绑定了迅雷,则会下载aspx文件. 解决:下载EXCEL文件,自动用迅雷下载aspx if (Request.QueryString["id&q ...

随机推荐

  1. erlang程序优化点的总结(持续更新)

    转自:http://wqtn22.iteye.com/blog/1820587 转载请注明出处 注意,这里只是给出一个总结,具体性能需要根据实际环境和需要来确定 霸爷指出,新的erlang虚拟机有很多 ...

  2. js数据转换

    javascript有如下数据类型的转换方法:一,转换成数字 xxx*1.0 转换成字符串 xxx+"" 二,从一个值中提取另一种类型的值,并完成转换工作. 1.提取字符串中的整数 ...

  3. jquery倒计时过几秒页面跳转 js倒计时

    //银行认证成功跳转 var time=setInterval (showTime, 1000); var second=5; function showTime() { if(second==0) ...

  4. BJFU 1397 致我们终将逝去的爱情

      LIS 由于要记录轨迹,所以不能用O(nlogn)优化,直接dp加father记录每个节点的转移. #include<cstdio> #include<algorithm> ...

  5. Oracle SQL 内置函数大全

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ...

  6. HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)

    这个题目的数据应该是比较弱的,赛场上的时候我们暴力也过了,而且我的kmp居然比暴力还要慢-- 这个变形并不难,跳着选数,把漏掉的位置补上就可以了. 代码如下: #include<iostream ...

  7. hive学习之WordCount单词统计

    看hive目录下就可以了,程序在hdfs里创建一个hive的大文件夹,相当于数据库吧.上面就是一个完整的利用hive来做单词统计,其中的优劣也能看出一点.

  8. 批处理 取得当前路径 %CD%

    在DOS的批处理中,有时候需要知道当前的路径.在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容一般是不同的. 1. %cd% 可以用在批 ...

  9. thinkphp的目录结构设计经验总结1

    ---恢复内容开始--- 用thinkphp开发了好些项目了:最近准备抽空写一些经验总结: 希望能给刚开始接触tp的童鞋们提供一些开发的方案:少走一些弯路:少踩一些坑: 这些绝对都是些精华干货:耐着性 ...

  10. H5的新应用-指定视频的播放进度

    <!DOCTYPE html> <html> <head> <title>指定视频的播放进度</title> <meta http-e ...