使用 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 , 把其中的 /* #undef JPEG_SUPPORT */ , /* #undef OJPEG_SUPPORT*/ 中的注释 /* */ 去掉。这是因为机子上缺少 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++ 目录 ” ,选择对应平台,然后添加所需 “ 包括文件 ” 目录。
1204

被折叠的 条评论
为什么被折叠?



