IDL实现 Modis经纬度查询、迅雷下载
转载请注明原文地址
本文纯属交流学习,请勿用作其他用途。匿名登录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添加为迅雷下载任务
四 源码
IDL 源码;----------------------------------------------------------------- pro ModisTest QUERY_DOWNLOAD,2010,7,18,[110,110,117,117],[34,30,30,34],PRODUCTNAME='021KM' end ;----------------------------------------------------------------- PRO QUERY_DOWNLOAD,YEAR,MONTH,DAY,XPOLY,YPOLY,PRODUCTNAME=PRODUCTNAME GET_MODIS_METAFILE,YEAR,MONTH,DAY,geometa1,MODLIST,/TERRA,PRODUCTNAME=PRODUCTNAME QUERY_MODIS,geometa1,MODLIST,XPOLY,YPOLY GET_MODIS_METAFILE,YEAR,MONTH,DAY,geometa2,MYDLIST,/AQUA,PRODUCTNAME=PRODUCTNAME QUERY_MODIS,geometa2,MYDLIST,XPOLY,YPOLY IF SIZE(MODLIST,/TYPE) EQ 7 THEN L = [MODLIST] IF SIZE(MYDLIST,/TYPE) EQ 7 THEN L = [L,MYDLIST] IF N_ELEMENTS(L) GT 0 THEN ADD_DOWNLOAD,L END ;----------------------------------------------------------------- PRO QUERY_MODIS,DATA,FILELIST,XPOLY,YPOLY FLIST =FILELIST FILELIST = -1 IF SIZE(DATA,/TYPE) NE 7 OR SIZE(FLIST,/TYPE) NE 7 OR N_ELEMENTS(XPOLY) NE N_ELEMENTS(YPOLY) THEN RETURN G = {GEOMETA,G_ID:'',STARTTIME:'',SET:0B,ORBIT_NUMBER:1L,DAYNIGHT:0B,BOX:DINDGEN(4),X:DINDGEN(4),Y:DINDGEN(4)} META = [G] FOR I = 3,N_ELEMENTS(DATA)-1 DO BEGIN IF N_ELEMENTS(DATA) LE 3 THEN RETURN; TMP = STRSPLIT(DATA[I],",",/EXTRACT) IF N_ELEMENTS(TMP) EQ 17 THEN BEGIN G.G_ID = (STRSPLIT(TMP[0],'.',/EXTRACT))[2] G.STARTTIME = TMP[1] G.SET = TMP[2] G.ORBIT_NUMBER = TMP[3] G.DAYNIGHT = BYTE(TMP[4]) G.BOX = TMP[5:8] G.X = TMP[9:12] G.Y = TMP[13:16] META = [META,G] ENDIF ENDFOR IF N_ELEMENTS(META) GT 1 THEN META = META[1:*] ELSE RETURN IDX = INTARR(480); I = FIX(STRMID(FILE_BASENAME(FLIST),18,4))/5 IDX[I] = INDGEN(N_ELEMENTS(I)) ret = [''] FOR I = 0,N_ELEMENTS(META)-1 DO BEGIN id = IDX[FIX(META[I].G_ID)/5] ; ;换日线附近一般不满足要求 IF (MAX(META[I].X) - MIN(META[I].X)) GT 300 THEN CONTINUE ; IF TOTAL(INSIDE(XPOLY,YPOLY,META[I].X,META[I].Y)) GT 0 $ AND META[I].DAYNIGHT LT BYTE('N') $ AND ID GT 0 THEN RET = [RET,FLIST[ID]] ENDFOR FILELIST = N_ELEMENTS(RET) GT 1 ? RET[1:*] : -1 END ;----------------------------------------------------------------- PRO GET_MODIS_METAFILE,YEAR,MONTH,DAY,GEOMETA,FLIST,TERRA=TERRA,AQUA=AQUA,PRODUCTNAME=PRODUCTNAME GEOMETA = -1 FLIST = -1; CATCH, errorStatus IF (errorStatus NE 0) THEN BEGIN CATCH, /CANCEL r = DIALOG_MESSAGE(!ERROR_STATE.msg, TITLE='URL Error', $ /ERROR) PRINT, !ERROR_STATE.msg RETURN ENDIF CASE 1 OF KEYWORD_SET(TERRA):BEGIN prefix = 'MOD' SATELLITE = 'TERRA' BREAK END KEYWORD_SET(AQUA):BEGIN prefix = 'MYD' SATELLITE = 'AQUA' BREAK END ELSE:RETURN ENDCASE PRODUCTNAME = KEYWORD_SET(PRODUCTNAME) ? PRODUCTNAME : '021KM' site = 'ftp://ladsweb.nascom.nasa.gov' JDAY = JULDAY(MONTH,DAY,YEAR,0,0,0) - JULDAY(1,1,YEAR,0,0,0) FORMAT = '("geoMeta/6/'+SATELLITE+'/",i4,"/","'+PREFIX+'03_",I4,"-",I02,"-",I02,".txt") DIR_FMT = '("/allData/5/","'+prefix+PRODUCTNAME+'/",I4,"/",I03,"/")' url = STRING([year,year,month,day],format=FORMAT) DIR = site+ STRING([YEAR,JDAY],FORMAT = DIR_FMT) ; create a new url object oUrl = OBJ_NEW('IDLnetUrl',$ CALLBACK_FUNCTION ='ddcall',$ URL_SCHEME = 'ftp',$ URL_HOST = 'ladsweb.nascom.nasa.gov',$ URL_PATH = url,$ URL_USERNAME = 'Anonymous',$ URL_PASSWORD = '',$ FTP_CONNECTION_MODE = 0) GEOMETA = oUrl->Get( /STRING_ARRAY ) FLIST = dir + oUrl->GetFtpDirList(url=DIR,/short) oUrl->CloseConnections OBJ_DESTROY, oUrl END ;----------------------------------------------------------------- FUNCTION ddcall, status, progress, data PRINT, status RETURN, 1 END ;----------------------------------------------------------------- PRO ADD_DOWNLOAD,URL oThunder = OBJ_NEW('IDLcomIDispatch$ProgId$ThunderAgent_Agent'); IF OBJ_VALID(oThunder) THEN BEGIN FOR I = 0,N_ELEMENTS(URL)-1 DO oThunder->ADDTASK,url[I],"","","","",1,0,5 oThunder->COMMITTASKS,1 OBJ_DESTROY ,oThunder ENDIF END ;----------------------------------------------------------------- FUNCTION Inside, x, y, xpts, ypts, INDEX=index On_Error, 1 sx = Size(xpts) sy = Size(ypts) IF (sx[0] EQ 1) THEN NX=sx[1] ELSE Message, 'X coordinates of polygon not a vector.' IF (sy[0] EQ 1) THEN NY=sy[1] ELSE Message, 'Y coordinates of polygon not a vector.' IF (NX EQ NY) THEN N = NX ELSE Message, 'Incompatable vector dimensions.' ; Close the polygon. tmp_xpts = [xpts, xpts[0]] tmp_ypts = [ypts, ypts[0]] ; Set up counters. i = indgen(N) ip = indgen(N)+1 nn = N_Elements(x) X1 = tmp_xpts(i) # Replicate(1,nn) - Replicate(1,n) # Reform([x],nn) Y1 = tmp_ypts(i) # Replicate(1,nn) - Replicate(1,n) # Reform([y],nn) X2 = tmp_xpts(ip) # Replicate(1,nn) - Replicate(1,n) # Reform([x],nn) Y2 = tmp_ypts(ip) # Replicate(1,nn) - Replicate(1,n) # Reform([y],nn) dp = X1*X2 + Y1*Y2 ; Dot-product cp = X1*Y2 - Y1*X2 ; Cross-product theta = Atan(cp,dp) ret = Replicate(0L, N_Elements(x)) i = Where(Abs(Total(theta,1)) GT 0.01, count) IF (count GT 0) THEN ret(i)=1 ; Make this a scalar value if there is only one value. IF (N_Elements(ret) EQ 1) THEN ret=ret[0] ; If the index keyword is set, then return indices. IF (Arg_Present(index)) THEN ret=(Indgen(/Long, N_Elements(x)))(Where(ret eq 1)) RETURN, ret END
感谢 qqz的【原】根据Modis 分块计算经纬度程序 给我的启示。
IDL实现 Modis经纬度查询、迅雷下载的更多相关文章
- C# 调用迅雷 7 迅雷下载开放引擎
最近有个项目需要用winform调用迅雷下载.上网百度后发现迅雷自带的com组件从迅雷5之后就废掉了,除了能添加任务,其余功能全不能用.后来又发现了迅雷下载开放引擎这么个东西 http://thund ...
- (原创)提取Xilinx开发工具的迅雷下载地址
①进入Xilinx官网,进入Device->Design Tools,选择你想要下载的任意工具. ②进入新web页面,右方点击“Downloads”.③进入版本选择页面,选择想要的版本号,点击相 ...
- Sql Server 2012 Enterprise Edition 企业版 迅雷 下载地址
Sql Server 2012 Enterprise Edition 企业版 迅雷 下载地址 版本号 cn_sql_server_2012_enterprise_edition_x86_x64_dvd ...
- 解决jsp下载文件,迅雷下载路径不显示文件名称的问题
如果浏览器安装了迅雷的插件,在jsp页面调用java后台实现文件下载功能时,会自动弹出迅雷下载,迅雷的下载路径会显示.do或者.xhtml之类的,为了解决这个问题,jsp页面修改如下: 写一个< ...
- htaccess高级应用:防盗链阻止迅雷下载以及限制访问
导读: 合理利用htaccess文件,即使没有服务器的管理权限可以解决很多问题:比如用htaccess防盗链,阻止迅雷下载,限制用户访问指定类型的文件.判断User-agent阻止迅雷下载. Rewr ...
- 百度地图JavaScript API经纬度查询-MAP
百度地图JavaScript API经纬度查询-MAP-ABCDEFGHIJKMHNOPQRSTUVWXYZ: 搜索:<input type="text" size=&quo ...
- java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址
1. 目标 使用webmagic爬取动作电影列表信息 爬取电影<海王>详细信息[电影名称.电影迅雷下载地址列表] 2. 爬取最新动作片列表 获取电影列表页面数据来源地址 访问http:// ...
- genymotion virtual device 用迅雷下载
找到虚拟机下载Log文件 打开后,找到原来下载的地址 以ova结尾的文件,然后用迅雷下载这个文件. 下载好的文件放在 C:\Users\用户名\AppData\Local\Genymobile\Gen ...
- C# 之 下载EXCEL文件,自动用迅雷下载aspx
在浏览器中导出 Excel 得时候,如果浏览器绑定了迅雷,则会下载aspx文件. 解决:下载EXCEL文件,自动用迅雷下载aspx if (Request.QueryString["id&q ...
随机推荐
- 虚拟机 centos 7 nginx安装
1下载vmware 12,并安装.百度即可 2下载centos 7,将其安装在vmware 12中.百度即可,无复杂设置. 3设置vmware 中centos7能上网: a.右键计算机->管理- ...
- Linux RSS/RPS/RFS/XPS对比
RSS适合于多队列网卡,把不同的流分散的不同的网卡多列中,至于网卡队列由哪个cpu处理还需要绑定网卡队列中断与cpu RPS:适合于单队列网卡或者虚拟网卡,把该网卡上的数据流让多个cpu处理 RFS: ...
- @ResponseBody返回json时,json数据丢失或者报错
现象: 1.报错:There is a cycle in the hierarchy! 2.返回至前台的json不完整,字段丢失. 错误原因: eg:entity1的属性有list<entiti ...
- radiobutton以及checkbox背景图片拉伸变形的问题
设置RadioButton的text属性,只需要有这个属性就可以(设置“”内容就行),然后再添加textsize属性,将字体大小属性值设置为比较小,我设置为2sp.运行后我们会发现图片变形问题不复存在 ...
- 初次使用IntelliJ IDEA 2016.2
换电脑的还有一个目的就是我准备采用新的IDE了 之前一直用的是myeclipse,但是现在准备尝试idea 这边做个记录,idea的破解参考下面这个网址:http://blog.csdn.net/u0 ...
- ASP.NET 修改密码代码
using System; using System.Data; using System.Configuration; using System.Collections; using System. ...
- CSS3秘笈:第五章
第五章 层叠管理样式 1.层叠是决定哪些样式属性要被应用到某一个元素的一套规则. 2.最近的祖先样式胜出:浏览器会采用离相关标签最近的样式. 3.直接应用的样式胜出:任何直接应用于指定标签的样式都战 ...
- hdu_2608_0 or 1_数论
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2608 反正我是没找出这个规律的,规律参考的别人的! /* 分析:假设数n=2^k*p1^s1*p2^s ...
- HDU2629:Identity Card
Problem Description Do you own an ID card?You must have a identity card number in your family's Hous ...
- 第13章 Swing程序设计----JFrame窗体
JFrame窗体是一个容器,它是Swing程序中各个组件的载体,可以将JFrame看作是承载这些Swing组件的容器. 在开发应用程序时可以通过继承java.swing.JFrame类创建一个窗体,在 ...