需要做一个上传tiff文件的功能,那么就需要把tiff的数据拿出来,由于要用c#和libtiff库来完成,网上找了很多资料,导出来的高程数据还是有问题
using (Tiff tiff = Tiff.Open(path, "r"))
{
int height = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
int width = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
FieldValue[] modelPixelScaleTag = tiff.GetField((TiffTag)33550);
FieldValue[] modelTiepointTag = tiff.GetField((TiffTag)33922);
byte[] modelPixelScale = modelPixelScaleTag[1].GetBytes();
double pixelSizeX = BitConverter.ToDouble(modelPixelScale, 0);
double pixelSizeY = BitConverter.ToDouble(modelPixelScale, 8) * -1;
byte[] modelTransformation = modelTiepointTag[1].GetBytes();
double originLon = BitConverter.ToDouble(modelTransformation, 24);//x
double originLat = BitConverter.ToDouble(modelTransformation, 32);//y
int bitsPerPixel = tiff.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt();
double startLat = originLat + (pixelSizeY / 2.0);
double startLon = originLon + (pixelSizeX / 2.0);
var scanline = new byte[tiff.ScanlineSize()];
//高程数据
FieldValue[] tilewtag = tiff.GetField(TiffTag.TILEWIDTH);
FieldValue[] tilehtag = tiff.GetField(TiffTag.TILELENGTH);
int tilew = tilewtag[0].ToInt();
int tileh = tilehtag[0].ToInt();
int tileWidthCount = width / tilew;
int remainingWidth = width - tileWidthCount * tilew;
if (remainingWidth > 0)
{
tileWidthCount++;
}
int tileHeightCount = height / tileh;
int remainingHeight = height - tileHeightCount * tileh;
if (remainingHeight > 0)
{
tileHeightCount++;
}
float[,] heightMap = new float[width, height];
int tileSize = tiff.TileSize();
for (int i = 0; i < width; i += tilew)
{
for (int k = 0; k < height; k += tileh)
{
byte[] buffer = new byte[tileSize];
tiff.ReadTile(buffer, 0, i, k, 0, 0);
for (int itw = 0; itw < tilew; itw++)
{
int iwhm = k + itw;
if (iwhm > width - 1)
{
break;
}
for (int ith = 0; ith < tileh; ith++)
{
int iyhm = i + ith;
if (iyhm > height - 1)
{
break;
}
heightMap[iwhm, iyhm] =
BitConverter.ToSingle(buffer, (itw * tileh + ith) * 4);
}
}
}
}
heightMap 不知道这个数据到底拿的有没有问题

现在基本上都通了就是高程数据拿的有问题
我想把一个tiff文件里的高程数据存到一个float里边,然后用它生成坐标生成地图
