2017-05-09 52 views
0

libtiff.netを使用してGeoTIFFファイルから標高データを読み込もうとしています。 これまでのところ、libtiff.netのWebページの例を使って、ファイルからメタデータを読み込むことがほとんどできました。GeoTIFF libtiff.net標高データを取得する#

しかしHOWTO説明したように、私はhereTiff.ReadScanline()で読んまず試みたが、(私はそれを正しく理解すれば、おそらくタイルに)私が持っているファイルを異なる保存されているようだ...私は理解していない標高データを読み込む

ここメタデータは(私の知る限り読むことができたとして)である(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

データ型のSystem.Int16 :3

GEOTIFF_MODELPIXELSCALETAGシステム.Int32:3 GEOTIFF_MODELPIXELSCALETAG System.Byte []:Ù?Ù?

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システム。バイト[]: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でエンコードします。これはアドビ独自のものでした。私は復号化するコードを探していたPREDICTOR_FLOATINGPOINT、自分。私はthis github link はそれを読んでデコードするライブラリコードを持っていると思う。

関連する問題