linux下gdal的搭建
            时间:2014-07-22 23:02:53  
            收藏:0  
            阅读:2542
        
        
        
[源码编译]
前期准备:
- 
确认电脑上安装好g++等开发环境,否则执行 sudo apt-get install build-essential
2. 确认电脑上已经安装好svn以便下载最新的源代码,否则执行
 sudo apt-get install subversion
  3.  确保proj4的安装
$ curl -O http://download.osgeo.org/proj/proj-4.8.0.tar.gz $ tar xvfz proj-4.8.0.tar.gz $ cd proj-4.8.0 $ ./configure $ make $ sudo make install
安装之后的文件在/usr/local下面,其中bin下面存放可执行程序,include存放源代码,lib下存放lib库;同时将/usr/local/lib加入到/etc/ld.so.conf配置文件中,使用ldconfig命令动态装入链接库
   4.编译GEOS安装
从http://trac.osgeo.org/geos/下载最新版本并编译安装此包
安装过程当中,可能会使用到pcre-8.33.tar.gz,同时 可以下载安装。
   5.安装SWIG开发工具
 SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。
为支持linux下gdal的java语言开发,安装swig:
       tar zxvf   swig-3.0.0.tar.gz
    cd  swig-3.0.0
    ./configure  --prefix /usr
    make
    make install
编译GDAL:
http://download.osgeo.org/gdal/gdal-1.9.2.tar.gz
$ tar xvfz gdal-1.9.2.tar.gz $ cd gdal-1.9.2 $ ./configure --with-static-proj4=/usr/local --with-java=yes $ make
$ make install
附上g++下的gdal命令:g++ test.cpp -o test -lgdal
edit gdal-1.9.2/swig/java/java.opt with your JAVA_HOME path:
下一步,编辑 gdal-1.9.2/swig/java/java.opt 配置 JAVA_HOME 路径:
JAVA_HOME = "/usr/lib/jvm/java-6-openjdk-amd64" JAVADOC=$(JAVA_HOME)/bin/javadoc
JAVAC=$(JAVA_HOME)/bin/javac
JAVA=$(JAVA_HOME)/bin/java
JAR=$(JAVA_HOME)/bin/jar
JAVA_INCLUDE=-I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
到此,即可编译它:
$ cd gdal-1.9.2/swig/java/ $ make
拷贝编译好的 .so 文件到一个目录/usr/lib下
$ cd /gdal-1.9.2/swig/java $ ls | grep .so libgdalconstjni.so libgdaljni.so libogrjni.so libosrjni.so $ cp *.so /usr/lib/
然后ldconfig一下,下一步开始测试。
[java代码测试]
编写Test.java类,
import org.gdal.osr.*;
import org.gdal.ogr.*;
import org.gdal.gdal.*;
import org.gdal.gdalconst.gdalconstConstants;
public class Test{
 public static String bytesToHexString(byte[] src){
     StringBuilder stringBuilder = new StringBuilder("");
     if (src == null || src.length <= 0) {
         return null;
     }
     for (int i = 0; i < src.length; i++) {
         int v = src[i] & 0xFF;
         String hv = Integer.toHexString(v);
         if (hv.length() < 2) {
             stringBuilder.append(0);
         }
         stringBuilder.append(hv);
     }
     return stringBuilder.toString();
 }
 static void ReadVectorFile()
 {
    String strVectorFile = "/root/projects/无缝中国_地市_M.tab";
    // 注册所有的驱动
    ogr.RegisterAll();
    // 为了支持中文路径,请添加下面这句代码
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
    // 为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption("SHAPE_ENCODING","");
    //打开数据
    DataSource ds = ogr.Open(strVectorFile,0);
    if (ds == null)
    {
       System.out.println("打开文件【"+ strVectorFile + "】失败!" );
       return;
    }
    System.out.println("打开文件【"+ strVectorFile + "】成功!" );
    // 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个
    int iLayerCount = ds.GetLayerCount();
          // 获取第一个图层
    Layer oLayer = ds.GetLayerByIndex(0);
    if (oLayer == null)
    {
         System.out.println("获取第0个图层失败!\n");
         return;
    }
          // 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空
    oLayer.ResetReading();
          // 通过属性表的SQL语句对图层中的要素进行筛选,这部分详细参考SQL查询章节内容
          //oLayer.SetAttributeFilter("\"NAME99\"LIKE \"北京市市辖区\"");
          // 通过指定的几何对象对图层中的要素进行筛选
          //oLayer.SetSpatialFilter();
          // 通过指定的四至范围对图层中的要素进行筛选
          //oLayer.SetSpatialFilterRect();
          // 获取图层中的属性表表头并输出
    System.out.println("属性`结构信息:");
    FeatureDefn oDefn =oLayer.GetLayerDefn();
    int iFieldCount =oDefn.GetFieldCount();
    for (int iAttr = 0; iAttr <iFieldCount; iAttr++)
    {
        FieldDefn oField =oDefn.GetFieldDefn(iAttr);
        byte []bts= oField.GetNameRef().getBytes();
        String btsR= bytesToHexString(bts);
        System.out.print(btsR+" : ");
    System.out.println(new String(oField.GetNameRef())+ ": " +
 oField.GetFieldTypeName(oField.GetFieldType())+ "(" +oField.GetWidth()+"."+ oField.GetPrecision() + ")");
     }
          // 输出图层中的要素个数
          System.out.println("要素个数 = " + oLayer.GetFeatureCount(0));
          Feature oFeature = null;
          // 下面开始遍历图层中的要素
          while ((oFeature =oLayer.GetNextFeature()) != null)
          {
                    System.out.println("当前处理第" + oFeature.GetFID() + "个:\n属性值:");
                    // 获取要素中的属性表内容
                    for (int iField = 0; iField< iFieldCount; iField++)
                    {
                             FieldDefn oFieldDefn= oDefn.GetFieldDefn(iField);
                             int type =oFieldDefn.GetFieldType();
                             switch (type)
                             {
                                case ogr.OFTString:
         try {
          System.out.print(new String(oFeature.GetFieldAsString(iField))+ "\t");
         } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
                                    break;
                                case ogr.OFTReal:
                                                System.out.print(oFeature.GetFieldAsDouble(iField)+ "\t");
                                                break;
                               case ogr.OFTInteger:
                                                System.out.print(oFeature.GetFieldAsInteger(iField)+ "\t");
                                                break;
                               default:
                                                System.out.print(oFeature.GetFieldAsString(iField)+ "\t");
                                                break;
                             }
                    }
                    System.out.println();
                    // 获取要素中的几何体
                    Geometry oGeometry =oFeature.GetGeometryRef();
                    //
          }
          System.out.println("数据集关闭!");
 }
 public static void main(String args[]){
  ReadVectorFile();
 }
}
结果出现了乱码,说明JNI方面的问题存在,解决方案,见本人的另一篇文章《GDAL在java中乱码问题解决方案》。
            评论(0)
        
        
        