您的位置:首页 > 编程语言 > Java开发

GDAL 的java调用问题总结

2014-04-03 11:38 267 查看
文章主要是对http://blog.csdn.net/liminlu0314/article/details/8395622该博文的一些问题的总结

首先,想用java编写GDAL的人不一定想从源码上编译GDAL,只是想用GDAL比较成熟的类库,所以编译环节其实可以省略,直接下载编译好的java版GDAL,例如下载地址:http://download.csdn.net/detail/liminlu0314/5016578,这个库的上传者与文章作者同一个人,是GDAL方面的大牛

其次,gdal.jar是需要导入工程的,但是其他的由jni生成的的dll,其实并不是添加jar引用,因为dll并不是jar包,会报不是zip的错误,我们只需要把几个dll文件放在工程根目录即可。如下图,用IntelliJ IDEA创建的工程,导入dll,注意,除了java文件夹里文件名带jni的dll,其中别忘了还得把GDAL\bin里的gdal19.dll拷过来,不然会报找不到类库的错误。





再次,参看http://blog.csdn.net/liminlu0314/article/details/8828907这篇文章,其中读写代码都有一些错误,

以下指出一些错误,对于一些newFeature等单词没拆分的错误就不一一列举了,只是对能想起来的标红以下

package gdal_test;

import org.gdal.gdal.gdal;

import org.gdal.ogr.DataSource;

import org.gdal.ogr.Feature;

import org.gdal.ogr.FeatureDefn;

import org.gdal.ogr.FieldDefn;

import org.gdal.ogr.Geometry;

import org.gdal.ogr.Layer;

import org.gdal.ogr.ogr;

public class MyTest {

public static void main(String[] args) {

//ReadVectorFile();

WriteVectorFile();

}

static void ReadVectorFile()

{

String strVectorFile = "D:\\s57polygon.shp";

// 注册所有的驱动

ogr.RegisterAll();

// 为了支持中文路径,请添加下面这句代码

gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");

// 为了使属性表字段支持中文,请添加下面这句

gdal.SetConfigOption("SHAPE_ENCODING","");

//打开数据

DataSource ds = ogr.Open(strVectorFile,0);

if (ds == null)

{

System.out.println("打开文件【"+ strVectorFile + "】失败!" );

return;

}

System.out.println(ds.GetDriver().getName());

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);

System.out.println(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: //这个case及以下的case都连写了

System.out.println(oFeature.GetFieldAsString(iField)+ "\t");

break;

case ogr.OFTReal:

System.out.println(oFeature.GetFieldAsDouble(iField)+ "\t");

break;

case ogr.OFTInteger:

System.out.println(oFeature.GetFieldAsInteger(iField)+ "\t");

break;

default:

System.out.println(oFeature.GetFieldAsString(iField)+ "\t");

break;

}

}

// 获取要素中的几何体

Geometry oGeometry =oFeature.GetGeometryRef();

// 为了演示,只输出一个要素信息

break;

}

System.out.println("数据集关闭!");

}

static void WriteVectorFile()

{

String strVectorFile ="E:\\TestPolygon.shp";

// 注册所有的驱动

ogr.RegisterAll();

// 为了支持中文路径,请添加下面这句代码

gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO");

// 为了使属性表字段支持中文,请添加下面这句

gdal.SetConfigOption("SHAPE_ENCODING","");

//创建数据,这里以创建ESRI的shp文件为例

String strDriverName = "ESRI Shapefile"; //这里有非常致命的错误,原文这里两个单词也连写了,后来总是报错“驱动不可用”,我读取了一个shp文件并用getDriver()和getName()获取了shp文件的名称,其实是有空格的。

org.gdal.ogr.Driver oDriver =ogr.GetDriverByName(strDriverName);

if (oDriver == null)

{

System.out.println(strVectorFile+ " 驱动不可用!\n");

return;

}

// 创建数据源

DataSource oDS = oDriver.CreateDataSource(strVectorFile,null);

if (oDS == null)

{

System.out.println("创建矢量文件【"+ strVectorFile +"】失败!\n" );

return;

}

// 创建图层,创建一个多边形图层,这里没有指定空间参考,如果需要的话,需要在这里进行指定

Layer oLayer =oDS.CreateLayer("TestPolygon", null, ogr.wkbPolygon, null);

if (oLayer == null)

{

System.out.println("图层创建失败!\n");

return;

}

// 下面创建属性表

// 先创建一个叫FieldID的整型属性

FieldDefn oFieldID = new FieldDefn("FieldID", ogr.OFTInteger);

oLayer.CreateField(oFieldID, 1);

// 再创建一个叫FeatureName的字符型属性,字符长度为50

FieldDefn oFieldName =
new FieldDefn("FieldName", ogr.OFTString); //原文这种地方好像都连写了

oFieldName.SetWidth(100);

oLayer.CreateField(oFieldName, 1);

FeatureDefn oDefn =oLayer.GetLayerDefn();

// 创建三角形要素

Feature oFeatureTriangle = new Feature(oDefn);

oFeatureTriangle.SetField(0, 0);

oFeatureTriangle.SetField(1, "三角形");

Geometry geomTriangle =Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))");

oFeatureTriangle.SetGeometry(geomTriangle);

oLayer.CreateFeature(oFeatureTriangle);

// 创建矩形要素

Feature oFeatureRectangle = new Feature(oDefn);

oFeatureRectangle.SetField(0, 1);

oFeatureRectangle.SetField(1, "矩形");

Geometry geomRectangle =Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))");

oFeatureRectangle.SetGeometry(geomRectangle);

oLayer.CreateFeature(oFeatureRectangle);

//这里是原文没有的,不知道什么原因,创建的shp存在于磁盘上,但是用arcgis打开却没有任何记录,我当时看代码就觉得肯定是只画到内存里了,其实并没有关闭数据流,没有保存到磁盘,所以随便点了点,发现有个同步到磁盘的方法,就试了试,结果就行了

oLayer.SyncToDisk();

oDS.SyncToDisk();

// 创建五角形要素 //记得原文创建五角星这里会出现“corrup data”错误(调试的时候能发现错误出在这里),具体为什么没研究,只是直接把这注释掉了。

/*

Feature oFeaturePentagon = new Feature(oDefn);

oFeaturePentagon.SetField(0, 2);

oFeaturePentagon.SetField(1, "五角形");

Geometry geomPentagon =Geometry.CreateFromWkt("POLYGON ((70 0,85 0,90 15,80 30,65 15,700))");

oFeaturePentagon.SetGeometry(geomPentagon);

oLayer.CreateFeature(oFeaturePentagon);

*/

System.out.println("\n数据集创建完成!\n");

}

}

用arcgis打开发现有字符编码问题,我个郁闷啊,查了好多资料不知道为啥,调试了一下,发现就是UTF-8编码,后来我狠了狠心,换了个编码

gdal.SetConfigOption("SHAPE_ENCODING","GBK"); 发现用GBK编码就没事。。。。天理何在啊

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: