[源码编译]
前期准备:
- 确认电脑上安装好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中乱码问题解决方案》。
linux下gdal的搭建,码迷,mamicode.com