9527的代码梦 2022-08-16 14:33 采纳率: 100%
浏览 35
已结题

c#如何在libtiff里边拿到高程数据

需要做一个上传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 不知道这个数据到底拿的有没有问题

img

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

img

  • 写回答

1条回答 默认 最新

  • 石岩Maple 2022-08-16 14:47
    关注

    srtm数据?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月24日
  • 已采纳回答 8月16日
  • 创建了问题 8月16日

悬赏问题

  • ¥15 设计数字电路得到要求结果
  • ¥15 hfss 组天线阵列报错:The A and B vectors must be parallel to the XY plane,如何解决?
  • ¥30 ansible连接设备报错
  • ¥60 pmsampsize包取值问题
  • ¥15 波形合成电路的设计学习
  • ¥15 unity脚本挂不上
  • ¥15 数学建模数学建模需要
  • ¥20 Java Sound Api 调用Mixer.getLine偶现Line unsupported错误。
  • ¥15 使用cuda加速opencv运算但是报错AttributeError: module 'cv2.cuda' has no attribute 'getCudaEnabledDeviceCount'
  • ¥15 java输入输出异常