GDAL 的java调用问题总结

1 篇文章 0 订阅

文章主要是对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编码就没事。。。。天理何在啊





 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在Linux上编译GDAL和GEOS,并使用Java调用它们,您可以按照以下步骤进行操作: 1. 首先,按照前面提到的步骤在Linux上编译和安装GEOS。 2. 接下来,下载GDAL源代码并解压缩。您可以从GDAL的官方网站(https://gdal.org/)上找到最新版本的下载链接。 3. 进入解压后的GDAL源代码目录: ``` cd gdal-x.x.x ``` 4. 运行以下命令来配置GDAL的编译选项,并指定GEOS的路径: ``` ./configure --with-geos=/usr/local ``` 确保将`/usr/local`替换为您实际安装GEOS的路径。 5. 编译和安装GDAL: ``` make sudo make install ``` 6. 完成上述步骤后,GDAL将成功编译和安装在您的Linux系统中。 7. 使用Java调用GDAL和GEOS需要使用Java绑定库。安装Java绑定库可以通过以下步骤完成: - 下载Java绑定库(JavaGDAL)的源代码。您可以从GDAL官方网站(https://gdal.org/java/)上找到相应的下载链接。 - 解压缩下载的源代码文件,并进入解压后的目录。 - 编译和安装Java绑定库: ``` make sudo make install ``` 8. 在使用Java调用GDAL和GEOS之前,确保您的Java项目中已经正确设置了相关的类路径和依赖项。 例如,您可以使用以下命令设置类路径: ``` export CLASSPATH=/usr/local/share/java/gdal.jar:$CLASSPATH ``` 确保将`/usr/local/share/java/gdal.jar`替换为实际的gdal.jar文件路径。 9. 在您的Java代码中,您可以使用GDAL和GEOS的API来执行各种地理空间操作和分析。 例如,您可以使用以下示例代码加载一个矢量文件并执行缓冲区分析: ```java import org.gdal.ogr.DataSource; import org.gdal.ogr.Layer; public class GDALExample { public static void main(String[] args) { // 打开矢量文件 String filePath = "path/to/your/vector/file.shp"; DataSource dataSource = ogr.Open(filePath); // 获取第一个图层 Layer layer = dataSource.GetLayer(0); // 执行缓冲区分析等其他地理空间操作... } } ``` 请注意,以上步骤和示例代码仅提供了一个基本的指导,具体的设置和操作可能因您的环境和需求而有所不同。确保您在使用之前阅读并遵循相关的官方文档和示例代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值