2016-04-19 4 views
0

ラスタをC#コードにロードするための「クリーン」な方法を探しています。ラスターとは、QGisやArcGisがロードできるXYZファイル(.tif、.rrdなど)を意味します。Cで地理ラスタを読み取る方法#

私はを使用しています。このライブラリはシェープファイルには完全に対応しているので、ラスタリーダーがあると思うようになります。私はかなり多くの読者を含むNetTopologySuite.IO名前空間の下で自分の研究に集中しようとしています。

私はこの記事をNetTopologySuiteとタグ付けしていますが、この特定のライブラリに関するC#-savvyのほうが少しわかりやすいと思っています。

+0

私は、私はこの質問は、プログラミングとし、特定のC#で行うには何を持っている疑いので、オフトピックとして、この質問を閉じるために投票していますので、私はここに投稿をお勧めします:gis.stackexchange.com – HimBromBeere

+1

@HimBromBeereでその場合、NetTopologySuiteのみについての質問(Stackoverflowにはタグがあります)に焦点を当てて、それを維持しようとします。私の問題は純粋にC#に関連しており、これが私がStackoverflowを選んだ理由です。私は完全に同意しないと言っているわけではありませんが、少なくともそれは少し微妙だと思います。 –

答えて

1

私は.tifにLibTiff.Netを使用しましたが、他のフォーマットは必要ありませんでした。 UpperLeftおよびBottomRightプロパティは、ワールドマップ上にイメージを配置するために使用されます。私はモデルの変換ケースを扱っていません。なぜなら、それは非常に複雑であり、現時点ではそうする必要はないからです。

 var imageStreamSource = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.Read); 
     var decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
     var bitmapSource = decoder.Frames[0]; 

     // Draw the Image 
     Image = bitmapSource.ToBitmap(); 

     using (var tiff = Tiff.Open(Filename, "r")) 
     { 
      Height = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 
      Width = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 

      // see http://www.remotesensing.org/geotiff/spec/geotiff2.6.html#2.6.1 

      var modelPixelScaleTag = tiff.GetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG); 
      var modelTiepointTag = tiff.GetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG); 
      //var modelTransformTag = tiff.GetField(TiffTag.GEOTIFF_MODELTRANSFORMATIONTAG); 

      var modelPixelScale = modelPixelScaleTag[1].GetBytes(); 
      var ScaleX = BitConverter.ToDouble(modelPixelScale, 0); 
      var ScaleY = BitConverter.ToDouble(modelPixelScale, 8) * -1; 

      if (modelTiepointTag != null) 
      { 
       var modelTransformation = modelTiepointTag[1].GetBytes(); 
       var originLon = BitConverter.ToDouble(modelTransformation, 24); 
       var originLat = BitConverter.ToDouble(modelTransformation, 32); 

       // origin is the center of the pixel, so offset to 
       var startLat = originLat + (ScaleY/2.0); 
       var startLon = originLon + (ScaleX/2.0); 

       UpperLeft = new Position(startLat, startLon); 
       BottomRight = new Position(startLat + ScaleY * Height, startLon + ScaleX * Width); 
      } 
      //else if (modelTransformTag != null) 
      //{ 
      // this is very complicated 
      //} 
      else 
      { 
       throw new Exception("Couldn't understand the TIFF format"); 
      } 
     } 
関連する問題