Monday, November 16, 2015

ENVI+IDL:经纬坐标提取影像的DN值

野外定点工作,常常需要和影像数据相匹配,就是以野外采样数据与影像的DN值两者之间进行比较、分析。那么,野外的样点坐标信息是已知的,剩下的就是依照样地地理坐标提取影像上的对应DN值。
有两种方法可以实现提取DN值的目的,ENVI手动获取和ENVI+IDL编程提取。下面,分别介绍这两种方法的步骤和特点:

ENVI手动方法

打开影像,Load Band一下,在主图像窗口双击打开CursorLocation/Value窗口,动态显示鼠标在图像上游艺的位置。接下来,还是在主图像窗口右键打开Pixel Locator,如图 1设置经度、纬度,注意图 1中的Sample表示列,Line表示行,均从1开始计算。
图 1
设置好后单击左下角Apply,查看之前打开的CursorLocation/Value窗口,Data显示0.152500即为图 1对应经纬度像元的DN值。
图 2
ENVI手动方法比较简单,容易上手。但是对于多组坐标和多幅图像,这个方法就太吃力了。

ENVI+IDL提取DN值

提取思路:将经纬度坐标转换为图像上对应的行列号,最后提取之。
代码运行的准确性,以方法1中的坐标检验代码提取的DN与ENVI是否相同?
如图 3,红框中的数值与方法1提取结果一致,其他坐标也是一样,证明这个方法还是有效的。
图 3
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;;Created by LI Xu
;;15 April, 2014
;;Version 1.0

;;Extraction based on the known GeoInformation(Lat&Long)
;;Description: csv, a fullpath of an .csv
;;                      inImage, a fullpath of an image
;;                      otDN, returned DNs

;;Reference Website: http://www.gisall.com/wordpress/?p=8319
;;Modification Record
;;22 October, 2014
;;Version 1.1 Add output the No(Column, Row)=Value in the Console  Column and Row start from 0



pro ExtratDN, csv, inImage, otDN
  ;;Debug Block
  ;;csv='F:\Test\Practice\DNVI\h27v06.csv'
  ;;inImage='F:\Test\Practice\DNVI\MOD13A3.2008.h27v06.tif'
  csv='F:\Test\Practice\Exercise\GeoInfo.csv'
  inImage='F:\Test\Practice\Exercise\MOD_2011_EVI.tif'
  
  
  ;;Retrieve long&lat from .csv
  txt=Read_Csv(csv, header=header)
  no=txt.field1
  lon=txt.field2 ;;Longtitude
  lat=txt.field3  ;;Latitude 
  
  ;;Convert to the Projection as same as the Imput Image
  ;1. Retrieve the Pojection Info from Input Image
  ENVI_OPEN_FILE, inImage, r_fid=fid
  ProjInfo=ENVI_GET_PROJECTION(fid=fid)
  ;2. Original projection of Lon/Lat
  OriProj=ENVI_PROJ_CREATE(/geographic)
  ;3. Process of Convert
  ENVI_CONVERT_PROJECTION_COORDINATES, $
    lon, lat, OriProj, $
    otX, otY, ProjInfo
    
  ;;Extract the Col & Row for the input Geoinfo
  ;1. Geolocation of Upper Left Point (0, 0) of the Input Image
  mapinfo=ENVI_GET_MAP_INFO(fid=fid)
  ULlon=mapinfo.mc(2)
  ULlat=mapinfo.mc(3)
  ;2. X/Y Size of the Input Image
  Xsize=mapinfo.PS(0)
  Ysize=mapinfo.PS(1)
  ;3. Calculate the Number of Col & Row
  Coll=(otX-ULlon)/Xsize
  Row=(otY-ULlat)/Ysize
  Row=fix(abs(Row)) ;;Subscript directly from 0 
  Coll=fix(abs(coll))
  
  ;;Extraction of DN
  ;1. Number of DNs
  N_DN=N_Elements(Row)
  otDN=fltarr(N_DN)
  ;2. Retrieve the DN one by one
  tiff=Read_Tiff(inImage, GeoTIFF=GeoVar)
  for ii=0, N_DN-1 do begin
    otDN(ii)=tiff(Coll(ii), Row(ii)) 
    print, strtrim(string(no(ii)),2)+'('+ strtrim(string(Coll(ii)), 2)+','+strtrim(string(Row(ii)), 2)+'):='+strtrim(string(otDN(ii)), 2)
  endfor
  

  
end

No comments:

Post a Comment