GDAL读写矢量文件——Java

来源:互联网 发布:mac office 2016 破解 编辑:程序博客网 时间:2024/05/19 11:38

关于Java配置GDAL库参考之前的博文。

在Java中使用OGR读写矢量数据时,需要导入ogr库,如果需要对中文路径的支持还有空间参考的支持,需要导入gdal和osr库,代码如下:

importorg.gdal.osr.*;importorg.gdal.ogr.*;importorg.gdal.gdal.*;

1.读取矢量

staticvoid ReadVectorFile(){   String strVectorFile = "F:\\Work\\OGR测试数据\\beijing.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("打开文件【"+ 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)                            {                                     caseogr.OFTString:                                               System.out.println(oFeature.GetFieldAsString(iField)+ "\t");                                               break;                                     caseogr.OFTReal:                                               System.out.println(oFeature.GetFieldAsDouble(iField)+ "\t");                                               break;                                     caseogr.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("数据集关闭!");}

2.写入矢量

写入的结果如下图所示。

staticvoid WriteVectorFile(){         String strVectorFile ="E:\\TestPolygon.shp";          // 注册所有的驱动         ogr.RegisterAll();                 // 为了支持中文路径,请添加下面这句代码         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO");         // 为了使属性表字段支持中文,请添加下面这句         gdal.SetConfigOption("SHAPE_ENCODING","");          //创建数据,这里以创建ESRI的shp文件为例         String strDriverName = "ESRIShapefile";         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 = newFieldDefn("FieldID", ogr.OFTInteger);         oLayer.CreateField(oFieldID, 1);          // 再创建一个叫FeatureName的字符型属性,字符长度为50         FieldDefn oFieldName = newFieldDefn("FieldName", ogr.OFTString);         oFieldName.SetWidth(100);         oLayer.CreateField(oFieldName, 1);          FeatureDefn oDefn =oLayer.GetLayerDefn();          // 创建三角形要素         Feature oFeatureTriangle = newFeature(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 = newFeature(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);          // 创建五角形要素         Feature oFeaturePentagon = newFeature(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");}

3.矢量数据管理

staticvoid VectorDelete(String strVectorFile){         // 注册所有的驱动         ogr.RegisterAll();         File file = newFile(strVectorFile);          org.gdal.ogr.Driver oDriver = null;                 {                   //打开矢量                   DataSource oDS =ogr.Open(strVectorFile, 0);                   if (oDS == null)                   {                            file.delete();                            return;                   }                    oDriver = oDS.GetDriver();                   if (oDriver == null)                   {                            file.delete();                            return;                   }         }          if(oDriver.DeleteDataSource(strVectorFile) == ogr.OGRERR_NONE)                   return;         else                   file.delete();} staticvoid VectorRename(String strOldFile, String strNewFile){         // 注册所有的驱动         ogr.RegisterAll();         File file = new File(strOldFile);          org.gdal.ogr.Driver oDriver = null;         {                   //打开矢量                   DataSource oDS =ogr.Open(strOldFile, 0);                   if (oDS == null)                   {                            file.renameTo(newFile(strNewFile));                            return;                   }                    oDriver = oDS.GetDriver();                   if (oDriver == null)                   {                            file.renameTo(newFile(strNewFile));                            return;                   }                    DataSource oDDS =oDriver.CopyDataSource(oDS, strNewFile, null);                   if (oDDS == null)                   {                            file.renameTo(newFile(strNewFile));                            return;                   }         }          if(oDriver.DeleteDataSource(strOldFile) == ogr.OGRERR_NONE)                   return;         else                   file.renameTo(newFile(strNewFile));}