加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

tiff和geotiff经度纬度高度值读取

(2012-05-16 21:34:44)
标签:

杂谈

分类: arcgis

使用 tiff3.8.2 geotiff1.2.5 读取一个 geotiff 格式的图像,获取图片的经度、纬度和高度值。

1、 经度和纬度可以通过 geotiff 读到栅格坐标和地理坐标的换算关系。

GTIF *gtif ;

  int      tiepoint_count, count, transform_count;

    tiff_t *tif=gtif->gt_tif;

    double *tiepoints   = 0;

    double *pixel_scale = 0;

    double *transform   = 0;

         TempKeyData tempData;

         if (!(gtif->gt_methods.get)(tif, GTIFF_TIEPOINTS,&tiepoint_count, &tiepoints ))

        tiepoint_count = 0;

           if (!(gtif->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &pixel_scale ))

        count = 0;

    if (!(gtif->gt_methods.get)(tif, GTIFF_TRANSMATRIX,&transform_count, &transform ))

        transform_count = 0;

这里用到的是 geotiff 的方法。

ModelTiepointTag (2,3):

         0                0                0               

         118.999861       32.0001389       0                

ModelPixelScaleTag (1,3):

         0.000277777778   0.000277777778   0  

坐标 (0,0) 点的经度和纬度是 118.999861 32.0001389 ,换算比例是 0.000277777778 0.000277777778 ,换算公式为

       *x = (*x - tiepoints[0]) * pixel_scale[0] + tiepoints[3];

       *y = (*y - tiepoints[1]) * (-1 * pixel_scale[1]) + tiepoints[4];

如果读到的是 ModelTransformationTag ,可以这样计算经度、纬度。

*x = x_in * transform[0] + y_in * transform[1] + transform[3];

*y = x_in * transform[4] + y_in * transform[5] + transform[7];

 

2、 要读取高度值,必须先读取某点的灰度值。

  int stripMax, stripCount;

stripSize = TIFFStripSize (image);

stripMax = TIFFNumberOfStrips (image);

  unsigned long bufferSize, count;

         bufferSize = stripMax * stripSize;

       if ((buffer = (char *) malloc(bufferSize)) == NULL)

{

    fprintf(stderr, "Could not allocate enough memory for the uncompressed image/n" );

               exit(42);

  }

  for (stripCount = 0; stripCount < stripMax; stripCount++){

    if ((result = TIFFReadEncodedStrip (image, stripCount,buffer + imageOffset,stripSize)) == -1){

      fprintf(stderr, "Read error on input strip number %d/n" , stripCount);

      exit(42);

    }

 

    imageOffset += result;

  }

通过 TIFFReadEncodeStrip 将图像的灰度值读出来,灰度值即高度值。这里用到的 tiff 的方法。

3、 tiff geotiff windows 下的编译

打开 visual studio 2008 命令提示,

tiff 的解压目录下 nmake /f makefile.vc

如果提示缺少 jpeglib.h 导致编译失败,这时请修改 ../libtiff/tiffconf.h.vc 把其中的 中的注释 去掉。这是因为机子上缺少 libjpeg 库,再删掉 .../libtiff/ 下的所有 .obj 文件。 然后再编译,这样就可以编译成功。

创建一个目录 libgeotiff (路径也可以是其它的),把 Libgeotiff 解压到 X:/libgeotiff/ 下,同时在 X: /libgeotiff/ 创建一个 libtiff (文件夹名一定要为 libtiff , 再到 C:/ tiff-3.8.2/ 把编译好的 libtiff 目录复制到 C:/libgeotiff/libtiff/ 下,最后形成的目录结构如下所示:
/libgeotiff
/libgeotiff/libgeotiff-1.2.5
/libtiff
/libtiff/libtiff
 
注意目录结构一定要为上述结构,否则无法编译。
 
在命令提示符下,用 “cd” 命令定位到 X: /libgeotiff/libgeotiff-1.2.5 ,输入以下命令:
nmake /f makefile.vc

4、 利用 Tiff geotiff vs2008 下的开发

VC 中你的工程里 Projects->Settings 中进行如下设置:

Link->Project Options 中加上 /nodefaultlib:"libcd.lib"

Link->Object/library modules 中添加 libgeotiff.lib libtiff.lib

然后在 Tools->Options 中的 Drectories 选项卡中添加 libgeotiff 库的目录:

Include Files
.../libgeotiff

.../libgeotiff/libtiff/libtiff

.../libgeotiff/libxtiff

Library Files
.../libgeotiff

.../libgeotiff/libtiff/libtiff

5 VS2008 C++ 项目怎样添加 依赖 库目录 包含目录

1. 添加编译所需要(依赖)的 lib 文件

[ 解决方案资源管理器 ]“ 项目 -> 属性 -> 配置属性 -> 连接器 -> 输入 -> 附加依赖项 里填写 “xxx.lib” ,多个 lib 以空格隔开。
(等同于 “#pragma comment(lib, "xxx.lib") ” 语句)

2. 添加库( Libs )文件目录

方法 1 [ 解决方案资源管理器 ]“ 项目 -> 属性 -> 配置属性 -> 连接器 -> 常规 -> 附加库目录
方法 2 [ 菜单 ]“ 工具 -> 选项 -> 项目和解决方案 ->C++ 目录 ,选择对应平台,然后添加所需 库文件 目录

3. 添加包含( include )文件目录

方法 1 [ 解决方案资源管理器 ]“ 项目 -> 属性 -> 配置属性 ->C/C++-> 常规 -> 附加包含目录
方法 2 [ 菜单 ]“ 工具 -> 选项 -> 项目和解决方案 ->C++ 目录 ,选择对应平台,然后添加所需 包括文件 目录。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有