下面进入正题。
笔者的系统为RHEL4。
建议Linux的使用者习惯非root权限的操作,这是一个好习惯,在工作中会很有帮助。
首先安装GDAL依赖库PROJ.4和GEOS。
PROJ.4是提供投影坐标系相关操作的库,GEOS是提供空间分析计算相关的库。都是开源的项目,可以自行Google最新的下载地址。
由于是非root权限,所以需要自行在~/local/目录下创建proj和geos目录(最好带上版本号)。然后将当前操作目录跳转到解压缩后的PROJ.4工程的根目录,如/.../proj-4.8.0。接下来进行源码安装三部曲。
./configure --prefix=/home/users/yourname/local/proj-4.8.0 --without-jni
make
make install
配置的时候注意一定要配置安装路径,由于没有root权限,如果直接安装会失败。而安装路径就是上面创建的目录。这里笔者的机器由于如果包含jni的话编译会报错,所以在配置的时候将其去掉了。原因可能是版本或者Java配置的问题。反正我是用C++来使用GDAL。这里就要多试一试了,如果可以直接编译成功,那就不需要后面的选项了。
然后是安装GEOS,同样的步骤。
./configure --prefix=/home/users/yourname/local/geos-3.4.2
make
make install
安装完依赖库后,开始正式安装GDAL。
还是先跳转到解压后的工程根目录,然后进行三部曲。
./configure --prefix=/home/users/yourname/local/gdal-1.11.1 --with-geos=/home/users/yourname/local/geos-3.4.2/bin/geos-config
make
make install
这里解释一下,在执行完第一行语句后如果看到GEOS support: yes,则证明GDAL有了GEOS库的支持,否则GDAL库中一些功能将无法正常使用。
这里笔者的机器又出现了问题:无法编译通过。报了一个有关cpl_virtualmem.cpp的错误,通过一番查找发现系统的mremap函数的参数和这个文件中的不一致,所以手动修改源码。将cpl_virtualmem.cpp里面的宏定义(如下)注释掉即可。
#define HAVE_5ARGS_MREMAP
如果可以直接编译通过,可以无视上面的啰嗦。
这样安装的过程就基本完成,下面开始配置一些开发需要的环境。
由于GDAL对PROJ.4是动态加载的,所以要将PROJ.4的动态链接库路径加到变量LD_LIBRARY_PATH中,同时将GDAL的bin路径加到变量PATH中。
先用vim打开~/.bashrc文件,在末尾加上下面的代码。
export PATH=$PATH:/home/users/yourname/local/gdal-1.11.1/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/users/yourname/local/gdal-1.11.1/lib:/home/users/yourname/local/proj-4.8.0/lib
保存退出后,执行source ~/.bashrc才真正的更新了变量。
然后在命令行中输入gdalinfo回车,如果出现提示信息证明安装成功。
下面介绍一下用C++来调用GDAL库的方法。
首先,新建一个GDALTest.cpp文件,内容如下。
1 #include "gdal.h"
2 #include "ogrsf_frmts.h"
3
4 int main(int argc,char * argv[])
5 {
6 RegisterOGRTAB();
7
8 OGRSFDriverRegistrar *registrar = OGRSFDriverRegistrar::GetRegistrar();
9 int count =registrar->GetDriverCount();
10 printf("Total: %d\n",count);
11 for(int i=0;i<count;i++){
12 printf("%s\n",registrar->GetDriver(i)->GetName());
13 }
14
15 return 0;
16 }
这段代码的意思是输出OGR驱动。
然后进行编译。
g++ GDALTest.cpp -I ./ -I /home/users/yourname/local/gdal-1.11.1/include -L/home/users/yourname/local/gdal-1.11.1/lib -lgdal -o GDALTest
最后执行./GDALTest,如果看到正常的输出则说明成功。