linux下gdal的搭建

时间:2014-07-22 23:02:53   收藏:0   阅读:2542
[源码编译]

前期准备
  1. 确认电脑上安装好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
mamicode.com,码迷


编译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/
mamicode.com,码迷

然后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();
 }
}

mamicode.com,码迷

mamicode.com,码迷

结果出现了乱码,说明JNI方面的问题存在,解决方案,见本人的另一篇文章《GDAL在java中乱码问题解决方案》。

linux下gdal的搭建,码迷,mamicode.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!