2017-05-09 43 views
0

我正在尝试使用libtiff.net从GeoTIFF文件读取高程数据。 到目前为止,我大部分时间都只能使用libtiff.net网页上的示例从文件中读取元数据。GeoTIFF libtiff.net获取c中的高程数据#

但HOWTO读取高程数据,我不知道......我第一次尝试用Tiff.ReadScanline()阅读描述here,但我有一个文件,似乎以不同的方式存储(可能在瓷砖,如果我理解正确)

这里是元数据(据我已经能够读)(TIFF文件是从丹麦地形高程数据集):

TIFF文件C:\用户*** \ DTM_1km_6170_500.tif,0页有以下标签设置:

IMAGEWIDTH System.Int32:2500

IMAGELENGTH System.Int32:2500

BITSPERSAMPLE System.Int16:32

COMPRESSION BitMiracle.LibTiff.Classic.Compression:ADOBE_DEFLATE

光度法BitMiracle.LibTiff.Classic。光度:MINISBLACK

STRIPOFFSETS System.UInt64形式[]:System.UInt64形式[]

SAMPL ESPERPIXEL System.Int16:1

STRIPBYTECOUNTS System.UInt64形式[]:System.UInt64形式[]

PLANARCONFIG BitMiracle.LibTiff.Classic.PlanarConfig:重叠群

PREDICTOR BitMiracle.LibTiff.Classic.Predictor:浮点

TILEWIDTH System.Int32:256

TILELENGTH System.Int32:256

TILEOF FSETS System.UInt64形式[]:System.UInt64形式[]

TILEBYTECOUNTS System.UInt64形式[]:System.UInt64形式[]

SAMPLEFORMAT BitMiracle.LibTiff.Classic.SampleFormat:IEEEFP

DATATYPE System.Int16 :3

GEOTIFF_MODELPIXELSCALETAG System.Int32:3 GEOTIFF_MODELPIXELSCALETAG System.Byte []:U U?

GEOTIFF_MODELTIEPOINTTAG System.Int32:6 GEOTIFF_MODELTIEPOINTTAG System.Byte []:a^WA

34735 System.Int32:36 34735 System.Byte []: ±±#°ED)#

34736 System.Int32:3 34736 System.Byte []:

34737 System.Int32:30 34737 System。字节[]:ETRS89/UTM区域 32N | ETRS89 |

42113 System.Int32:6 42113 System.Byte []:-9999

到目前为止,我写的代码如下:

namespace GeoTIFFReader 
{ 
    public class GeoTIFF 
    { 
    private double[,] heightmap; 
    private double dx; 
    private double dy; 
    private double startx; 
    private double starty; 


    public GeoTIFF(string fn) 
    { 
     using (Tiff tiff = Tiff.Open(fn, "r")) 
     { 
     if (tiff == null) 
     { 
      // Error - could not open 
      return; 
     } 



     int width = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
     int height = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 
     heightmap = new double[width, height]; 
     FieldValue[] modelPixelScaleTag = tiff.GetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG); 
     FieldValue[] modelTiePointTag = tiff.GetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG); 

     byte[] modelPixelScale = modelPixelScaleTag[1].GetBytes(); 
     dx = BitConverter.ToDouble(modelPixelScale, 0); 
     dy = BitConverter.ToDouble(modelPixelScale, 8) * -1; 

     byte[] modelTransformation = modelTiePointTag[1].GetBytes(); 
     double originLon = BitConverter.ToDouble(modelTransformation, 24); 
     double originLat = BitConverter.ToDouble(modelTransformation, 32); 

     startx = originLon + dx/2.0; 
     starty = originLat + dy/2.0; 

     double curx = startx; 
     double cury = starty; 

     FieldValue[] bitsPerSampleTag = tiff.GetField(TiffTag.BITSPERSAMPLE); 

     FieldValue[] tilewtag = tiff.GetField(TiffTag.TILEWIDTH); 
     FieldValue[] tilehtag = tiff.GetField(TiffTag.TILELENGTH); 
     int tilew = tilewtag[0].ToInt(); 
     int tileh = tilehtag[0].ToInt(); 

     var tile = new byte[tilew*tileh]; 

     //var scanline = new byte[tiff.ScanlineSize()]; Does not work... wrong format 
     for (int il = 0; il < height; il++) 
     { 
      //tiff.ReadScanline(scanline, il); // Load il'th line of data 
      for (int ir = 0; ir < width; ir++) 
      { 

      // Here I would like to read each pixel data that contains elevation in gray-scale in f32 as far I as I understand from metadata 

      //object value = scanline[ir]; 
      //heightmap[ir, il] = double.Parse(value.ToString()); 
      } 
     } 

     Console.WriteLine(heightmap.ToString()); 
     } 

    } 
    } 
} 

所以,如果有人知道HOWTO提取此数据,这将非常感激。

回答

0

所以我碰到一些暗示,使我找到答案的具体问题,迷迷糊糊..:

int tileSize = tiff.TileSize(); 
    for (int iw = 0; iw < nWidth; iw += tilew) 
    { 
     for (int ih = 0; ih < nHeight; ih += tileh) 
     { 
     byte[] buffer = new byte[tileSize]; 
     tiff.ReadTile(buffer, 0, iw, ih, 0, 0); 
     for (int itw = 0; itw < tilew; itw++) 
     { 
      int iwhm = ih + itw; 
      if (iwhm > nWidth - 1) 
      { 
      break; 
      } 
      for (int ith = 0; ith < tileh; ith++) 
      { 
      int iyhm = iw + ith; 
      if (iyhm > nHeight - 1) 
      { 
       break; 
      } 
      heightMap[iwhm, iyhm] = 
       BitConverter.ToSingle(buffer, (itw * tileh + ith) * 4); 
      } 
     } 
     } 
    } 
0

我相信问题是PREDICTOR。不是将数据放入文件中,而是使用FLOATINGPOINT预测变量对数据差异进行LZW编码。这是Adobe专有的。我一直在寻找代码解密PREDICTOR_FLOATINGPOINT,我自己。我认为this github link 可能有库代码,将读取和解码它。