⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regionlook.pro

📁 用idl开发的实现显示卫星图片在地球上位置的程序
💻 PRO
字号:
;$
; NAME    :
;   regionlook
;
; PURPOSE :
;   快视查看影像数据所在区域
;
; CATEGORY:
;    utility tools
;
; AUTHOR  :
;   QQz(Xinyuan QU)
;   E-mail: qqzwind@gmail.com
;   BLog  : www.qqzwind.cn     hi.baidu.blog/qqzwind
;
; CALLING SEQUENCE:
;    regionlook
;
; MODIFICATION HISTORY:
;   Written by: QQz, 2007-9-6
;   2007-9-9    envi标准 支持
;   2007-9-12   放大缩小
;   2007-9-13   hdf格式支持
;   2007-9-13   envisat格式支持
;   2007-9-18   radarsat格式支持
;$
Pro regionlook_cleanup,wtlb
	widget_control,wtlb,get_uvalue = pstate
	ptr_free, pstate
End
;*
;
;  缩放投影范围
;*
Pro regionlook_zoompoj,wtlb,zoom
	;
	compile_opt STRICTARR
	;
	if n_elements(zoom) eq 0 then return
	widget_control,wtlb,get_uvalue=pstate
	if (*pstate).filetype eq '' then return
	ratio = 0.2*zoom
	(*pstate).offsetx = (*pstate).offsetx*(1+ratio)
	(*pstate).offsety = (*pstate).offsety*(1+ratio)
	leftup            = (*pstate).leftup
	rightup           = (*pstate).rightup
	rightdown         = (*pstate).rightdown
	leftdown          = (*pstate).leftdown
	filetype          = (*pstate).filetype
	regionlook_drawmap,windowid =(*pstate).win,filetype=(*pstate).filetype,leftup,rightup,rightdown,leftdown,$
						offsetx = (*pstate).offsetx,offsety=(*pstate).offsety
End
;*
;
;直接图形法绘制影像和投影
;*
Pro regionlook_drawmap,windowid = windowid,leftup,rightup,rightdown,leftdown,offsetx=offsetx,offsety=offsety,filetype=filetype
	;
	compile_opt STRICTARR
	;
	;
    ; leftup     +--------+	 rightup
    ;            |        |
    ;            |        |
    ;            |        |
    ; leftdown   +--------+ rightdown
    ;
	data = fltarr(2,5)
	data[0,*] = [leftup[0],rightup[0],rightdown[0],leftdown[0],leftup[0]]
	data[1,*] = [leftup[1],rightup[1],rightdown[1],leftdown[1],leftup[1]]
	xcenter = (max(data[0,*]) + min(data[0,*]))/2
	ycenter = (max(data[1,*]) + min(data[1,*]))/2
	;
	if n_elements(offsetx) eq 0 then offsetx= 10
	if n_elements(offsety) eq 0 then offsety= 6
	if n_elements(filetype) eq 0 then filetype= '--ENVI Standard'
	offsetx = (offsetx+(max(data[0,*])-min(data[0,*]))/2)<180
	offsety = (offsety+(max(data[1,*])-min(data[1,*]))/2)<90

	;
	wset,windowid
	;
	loadct, 40, /silent
	;
	;
	titlecolor    = 100
	countriecolor = 206
	coastcolor    = 65
	rivercolor    = 80
	arrowcolor    = 254
	;
	; High resolution
	!P.FONT=0
	TITLE = '区域快视图' + '('+filetype+')'
	MAP_SET, ycenter,xcenter                                   ,$
;			/STEREOGRAPHIC ,$
			/TRANSVERSE_MERCATOR                               ,$
			/ISOTROPIC, /HORIZON, E_HORIZON={FILL:1, COLOR:100},$
			TITLE =TITLE                                       ,$
			COLOR=titlecolor                                   ,$
			/HIRES                                             ,$
			LIMIT=[ycenter-offsety,xcenter-offsetx,ycenter+offsety,xcenter+offsetx]
	;
	;绘制陆地
	MAP_CONTINENTS, /COUNTRIES, COLOR=countriecolor, MLINETHICK=2, /HIRES, /fill
	;
	;绘制河流
	if offsetx lt 25 then begin
		HIRES=1
		MAP_CONTINENTS, /RIVERS, COLOR=rivercolor, HIRES=HIRES
	endif else begin
		HIRES=0
	endelse
	;
	;绘制海岸
	MAP_CONTINENTS, /COASTS, COLOR=coastcolor,  HIRES=HIRES
	;
	;绘制网格
	map_grid,/LABEL, LATLAB=xcenter, LONLAB=ycenter,CHARSIZE=0.5
	;
	;arrow
	p = convert_coord(xcenter+offsetx*0.85, [ycenter+offsety*0.70, ycenter+offsety*0.8], /TO_NORM)
	ARROW, p[0,0], p[1,0], p[0,1], p[1,1], /NORMAL,color = arrowcolor,thick=2
	XYOUTS,xcenter+offsetx*0.83, ycenter+offsety*0.85, 'North', ALIGNMENT=0.5,color = arrowcolor
	;text
	p = convert_coord([max(data[0,*])+offsetx*0.03,max(data[0,*])+offsetx*0.09], [max(data[1,*])+offsetx*0.03,max(data[1,*])+offsetx*0.09], /TO_NORM)
	ARROW, p[0,1], p[1,1], p[0,0], p[1,0], /NORMAL
	XYOUTS,max(data[0,*])+offsetx*0.11, max(data[1,*])+offsetx*0.1, '影像', ALIGNMENT=0
	;
	;image rectangle
	plots,data,psym=0,symsize=1.5,color=180,thick=3
End
;*
;
;   主事件处理程序
;*
Pro regionlook_event,ev
	;
	compile_opt STRICTARR
	;
	uname = widget_info(ev.id,/uname)
	case uname of
		'wopenenvi'  : begin
			;
			widget_control,ev.top,get_uvalue=pstate
			filename = dialog_pickfile(group = ev.top,/read,title='选择带投影的ENVI数据',path=(*pstate).filepath)
			if filename eq '' then return
				result =envi_read_mapinfo(filename,startlonlat=startlonlat,finishlonlat=finishlonlat)
			if result eq 1 then begin
				(*pstate).leftup    = startlonlat
				(*pstate).rightup   = [finishlonlat[0],startlonlat[1]]
				(*pstate).rightdown = finishlonlat
				(*pstate).leftdown  = [startlonlat[0],finishlonlat[1]]
				(*pstate).filetype  = 'ENVI Standard'
				regionlook_drawmap,windowid =(*pstate).win,startlonlat,[finishlonlat[0],startlonlat[1]],finishlonlat,[startlonlat[0],finishlonlat[1]]
			endif
			(*pstate).filepath=file_dirname(filename)
		end
		'wopenhdf'   : begin
			;
			widget_control,ev.top,get_uvalue=pstate
			filename = dialog_pickfile(group = ev.top,/read,title='选择MODIS数据',filter='*.HDF',path=(*pstate).filepath)
			if filename eq '' then return
			result = HDF_read_lonlat(filename,startlonlat=startlonlat,finishlonlat=finishlonlat)
			if result eq 1 then begin
				(*pstate).leftup    = startlonlat
				(*pstate).rightup   = [finishlonlat[0],startlonlat[1]]
				(*pstate).rightdown = finishlonlat
				(*pstate).leftdown  = [startlonlat[0],finishlonlat[1]]
				(*pstate).filetype  = '--MODIS hdf'
				regionlook_drawmap,windowid =(*pstate).win,filetype=(*pstate).filetype, $
									startlonlat,[finishlonlat[0],startlonlat[1]],finishlonlat,[startlonlat[0],finishlonlat[1]]
			endif
			;
			(*pstate).filepath=file_dirname(filename)
		end
		'wopenensat' : begin
			;
			widget_control,ev.top,get_uvalue=pstate
			filename = dialog_pickfile(group = ev.top,/read,title='选择ENVISAT数据',filter='*.N1*',path=(*pstate).filepath)
			if filename eq '' then return
			result = ENVIsat_read_lonlat(filename,leftup=leftup,rightup=rightup,leftdown=leftdown,rightdown=rightdown)
			if result eq 1 then begin
				(*pstate).leftup    = leftup
				(*pstate).rightup   = rightup
				(*pstate).rightdown = rightdown
				(*pstate).leftdown  = leftdown
				(*pstate).filetype  = '--ENVISAT'
				regionlook_drawmap,windowid =(*pstate).win,filetype=(*pstate).filetype, $
									leftup,rightup,rightdown,leftdown
			endif
			;
			(*pstate).filepath=file_dirname(filename)
		end
		'wopenrdsat' : begin
			;
			widget_control,ev.top,get_uvalue=pstate
			filename = dialog_pickfile(group = ev.top,/read,title='选择Radarsat数据',filter='*.self',path=(*pstate).filepath)
			if filename eq '' then return
			result = Radarsat_read_lonlat(filename,leftup=leftup,rightup=rightup,leftdown=leftdown,rightdown=rightdown)
			if result eq 1 then begin
				(*pstate).leftup    = leftup
				(*pstate).rightup   = rightup
				(*pstate).rightdown = rightdown
				(*pstate).leftdown  = leftdown
				(*pstate).filetype  = '--RadarSAT'
				regionlook_drawmap,windowid =(*pstate).win,filetype=(*pstate).filetype, $
									leftup,rightup,rightdown,leftdown
			endif
			;
			(*pstate).filepath=file_dirname(filename)
		end
		'wsave' : begin
			img = tvrd(TRUE =1)
			filename = dialog_pickfile(/write,title='保存',filter='*.bmp')
			if filename eq '' then return
			name = file_basename(filename,'.bmpf')
			path = file_dirname(filename)
			filename = path+'\'+name+'.bmp'
			write_bmp,filename,img ,/rgb
			;widget_control,ev.top,/destroy
		end
		'zoomout' : begin
			regionlook_zoompoj,ev.top, 1
		end
		'zoomin' : begin
			regionlook_zoompoj,ev.top,-1
		end
		'wquit' : begin
			widget_control,ev.top,/destroy
		end
		else :
	endcase
End
;*
;
;  主程序-创建GUI , 保存系统差数
;*
Pro regionlook, xsize=xsize,ysize=ysize
	;
	screenxy = get_screen_size()
	;
	DEVICE, DECOMPOSED = 0
	;
	if ~n_elements(xsize) then xsize = 650
	if ~n_elements(ysize) then ysize = 480

    ;
    ; 创建界面
    ;
	wregion = widget_base(title='区域快视',$
			;/floating			          ,$
			/toolbar                      ,$
			mbar = mbar                   ,$
			/column                       ,$
			map  = 0                      ,$
			TLB_FRAME_ATTR=1)
	wtoolbar = widget_base(wregion,/row)
		wfile = widget_button(wtoolbar,value = '文件',/menu)
			wopenenvi  = widget_button(wfile,value='打开ENVI标准格式',uname='wopenenvi')
			wopenhdf   = widget_button(wfile,value='打开HDF格式',uname='wopenhdf')
			wopenensat = widget_button(wfile,value='打开ENVISAT格式',uname='wopenensat')
			wopenrdsat = widget_button(wfile,value='打开RADARSAT格式',uname='wopenrdsat')
			wsave      = widget_button(wfile,value='保存',uname='wsave')
			wquit      = widget_button(wfile,value='退出',uname='wquit')
		wproj = widget_button(wtoolbar,value = '投影方式',/menu)
		wzoomin = widget_button(wtoolbar,value='放大',uname='zoomin')
		wzoomout = widget_button(wtoolbar,value='缩小',uname='zoomout')
	;
	regiondraw = widget_draw(wregion,xsize=xsize,ysize=ysize)
	widget_control,wregion,/realize
	widget_control,regiondraw,get_value = owindow
	;
	;界面适应到合适的位置
	;
	basegeo = widget_info(wregion,/geo)
	offset = (screenxy-[basegeo.xsize,basegeo.ysize])/2
	widget_control,wregion,xoffset= offset[0],yoffset = offset[1]-50
	widget_control,wregion,/map
	;
	;保存参数
	;
	temp = {wregion   :wregion    ,$        ; 系统 tlb
			win       :owindow    ,$        ; 窗口 ID
			filepath  :''         ,$        ; 文件路径
			leftup    :[-999.,0.] ,$        ; 左上点坐标
			rightup   :[0.,0.]    ,$        ; 右上点坐标
			rightdown :[0.,0.]    ,$        ; 右下点坐标
			leftdown  :[0.,0.]    ,$        ; 左下点坐标
			offsetx   :10.        ,$        ; x方向显示投影范围
			offsety   :6.         ,$        ; y方向显示投影范围
			filetype  :''         ,$        ; 数据格式
			proj      :''          $        ;
			}
	widget_control,wregion,set_uvalue = ptr_new(temp)
	;
	;启动事件循环
	xmanager,'regionlook',wregion,/no_block,cleanup='regionlook_cleanup'
End

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -