Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何从C中读取GeoTIFF文件#_C# 4.0_Gis_Geotiff - Fatal编程技术网

C# 4.0 如何从C中读取GeoTIFF文件#

C# 4.0 如何从C中读取GeoTIFF文件#,c#-4.0,gis,geotiff,C# 4.0,Gis,Geotiff,我已经获得了一些地区的数字高程图(地球高度图)。我的目标是创造逼真的地形 地形生成没有问题。我已经使用VC#&XNA框架实践了这一点 问题是这些高度贴图文件是GeoTIFF格式的,我不知道如何读取。我以前也没有阅读任何图像文件的经验,所以我可以使用互联网上关于阅读GeoTIFF文件的小技巧进行实验。到目前为止,我一直没有成功 我拥有的geoTIFF文件是3601 x 3601文件 每个文件都有两个版本,一个十进制文件和num值文件 每个文件都有每秒钟的经纬度数据 地理坐标以及高度图,即Lon、

我已经获得了一些地区的数字高程图(地球高度图)。我的目标是创造逼真的地形

地形生成没有问题。我已经使用VC#&XNA框架实践了这一点

问题是这些高度贴图文件是GeoTIFF格式的,我不知道如何读取。我以前也没有阅读任何图像文件的经验,所以我可以使用互联网上关于阅读GeoTIFF文件的小技巧进行实验。到目前为止,我一直没有成功

  • 我拥有的geoTIFF文件是3601 x 3601文件
  • 每个文件都有两个版本,一个十进制文件和num值文件
  • 每个文件都有每秒钟的经纬度数据 地理坐标以及高度图,即Lon、Lat、海平面高度
如何读取这些文件:)

我拥有的文件来自ASTER G-DEM版本2,根据它们,GeoTIFF是相当标准的,这是因为我加载的一些GeoTIFF可视化工具正在向我显示正确的数据

我要用C。如果我们能谈谈这种语言,我将不胜感激


E D I T 好的,我得到了libtiff,这就是我所做的

using (Tiff tiff = Tiff.Open(@"Test\N41E071_dem.tif", r))
{
  int width   = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
  int height  = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
  double dpiX = tiff.GetField(TiffTag.XRESOLUTION)[0].ToDouble();
  double dpiY = tiff.GetField(TiffTag.YRESOLUTION)[0].ToDouble(); 

  byte[] scanline        = new byte[tiff.ScanlineSize()]; 
  ushort[] scanline16Bit = new ushort[tiff.ScanlineSize() / 2];

  for (int i = 0; i < height; i++)
  {
    tiff.ReadScanline(scanline, i); //Loading ith Line                        
    MultiplyScanLineAs16BitSamples(scanline, scanline16Bit, 16,i);
  }
}

private static void MultiplyScanLineAs16BitSamples(byte[] scanline, ushort[] temp, ushort factor,int row)
{
  if (scanline.Length % 2 != 0)
  {
    // each two bytes define one sample so there should be even number of bytes
    throw new ArgumentException();
  }
  
  Buffer.BlockCopy(scanline, 0,   temp, 0, scanline.Length);

  for (int i = 0; i < temp.Length; i++)
  {                
    temp[i] *= factor;
    MessageBox.Show("Row:"+row.ToString()+"Column:"+(i/2).ToString()+"Value:"+temp[i].ToString());
  }
}
使用(Tiff Tiff=Tiff.Open(@“Test\N41E071_dem.tif”,r))
{
int width=tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
int height=tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
double dpiX=tiff.GetField(TiffTag.XRESOLUTION)[0].ToDouble();
double dpiY=tiff.GetField(TiffTag.YRESOLUTION)[0].ToDouble();
字节[]扫描线=新字节[tiff.ScanlineSize()];
ushort[]scanline16Bit=新的ushort[tiff.ScanlineSize()/2];
对于(int i=0;i

在我显示消息框的地方,我显示相应的值,我做得对吗,我问这个问题,因为这是我第一次遇到图像&8\16位问题。我认为与libtiff的官方教程不同,我应该使用short而不是ushort,因为我使用的图像是“GeoTIFF,签名16位”

有一些SDK可以从C#读取GeoTIFF文件:

  • (商业)
  • (免费)
  • (免费?)
更新:


可以找到GeoTIFF的规范-在我看来,GeoTIFF可能包含不同的“子类型”信息,而这些信息又需要进行适当的解释…

有一些SDK可以从C#读取GeoTIFF文件:

  • (商业)
  • (免费)
  • (免费?)
更新:


可以找到GeoTIFF的规范-在我看来,GeoTIFF可以包含不同的信息“子类型”,而这些信息又需要进行适当的解释…

如果GeoTIFF包含瓷砖,则需要不同的方法。以下是如何读取包含32位浮点和高度数据的GeoTiff:

  int buffersize = 1000000;
  using (Tiff tiff = Tiff.Open(geotifffile, "r"))
  {
    int nooftiles = tiff.GetField(TiffTag.TILEBYTECOUNTS).Length;
    int width = tiff.GetField(TiffTag.TILEWIDTH)[0].ToInt();
    int height = tiff.GetField(TiffTag.TILELENGTH)[0].ToInt();
    byte[] buffer = new byte[buffersize];

    for (int i = 0; i < nooftiles; i++)
    {
      int size = tiff.ReadEncodedTile(i, buffer, 0, buffersize);
      float[,] data = new float[width, height];
      Buffer.BlockCopy(buffer, 0, data, 0, size); // Convert byte array to x,y array of floats (height data)
      // Do whatever you want with the height data (calculate hillshade images etc.)
    }
  }
int buffersize=1000000;
使用(Tiff Tiff=Tiff.Open(geotifffile,“r”))
{
int nooftiles=tiff.GetField(TiffTag.TILEBYTECOUNTS).Length;
int width=tiff.GetField(TiffTag.TILEWIDTH)[0].ToInt();
int height=tiff.GetField(TiffTag.tillelength)[0].ToInt();
字节[]缓冲区=新字节[buffersize];
对于(int i=0;i
如果GeoTIFF包含瓷砖,则需要不同的方法。以下是如何读取包含32位浮点和高度数据的GeoTiff:

  int buffersize = 1000000;
  using (Tiff tiff = Tiff.Open(geotifffile, "r"))
  {
    int nooftiles = tiff.GetField(TiffTag.TILEBYTECOUNTS).Length;
    int width = tiff.GetField(TiffTag.TILEWIDTH)[0].ToInt();
    int height = tiff.GetField(TiffTag.TILELENGTH)[0].ToInt();
    byte[] buffer = new byte[buffersize];

    for (int i = 0; i < nooftiles; i++)
    {
      int size = tiff.ReadEncodedTile(i, buffer, 0, buffersize);
      float[,] data = new float[width, height];
      Buffer.BlockCopy(buffer, 0, data, 0, size); // Convert byte array to x,y array of floats (height data)
      // Do whatever you want with the height data (calculate hillshade images etc.)
    }
  }
int buffersize=1000000;
使用(Tiff Tiff=Tiff.Open(geotifffile,“r”))
{
int nooftiles=tiff.GetField(TiffTag.TILEBYTECOUNTS).Length;
int width=tiff.GetField(TiffTag.TILEWIDTH)[0].ToInt();
int height=tiff.GetField(TiffTag.tillelength)[0].ToInt();
字节[]缓冲区=新字节[buffersize];
对于(int i=0;i
这是一个没有GDAL的家伙:


不过,在NuGet中可以使用GDAL。

这里有一个家伙没有使用GDAL:


不过,GDAL在NuGet中可用。

只是好奇而已。。。谷歌搜索的第一个结果是:你试过了吗?你在找其他的库吗?我不知道那一个是怎么跳过的,这次我确实使用了libtif,请阅读我的问题again@JuanMellado现在,这篇文章是谷歌第一次使用搜索关键词“geotiff用C#阅读”的结果,哈哈……只是好奇而已。。。谷歌搜索的第一个结果是:你试过了吗?你在找其他的库吗?我不知道那一个是怎么跳过的,这次我确实使用了libtif,请阅读我的问题again@JuanMellado,现在这篇文章是谷歌第一个使用搜索关键词“geotiff reading in C#”的结果,哈哈…………谢谢你的推荐,请阅读我的e