GDAL读写矢量文件——Java

关于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.OpenstrVectorFile,0);
         if ds == null)
         {
                   System.out.println"打开文件【"+ strVectorFile + "】失败!" );
                   return;
         }
        
         System.out.println"打开文件【"+ strVectorFile + "】成功!" );
 
         // 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个
         int iLayerCount = ds.GetLayerCount);
 
         // 获取第一个图层
         Layer oLayer = ds.GetLayerByIndex0);
         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.GetFieldDefniAttr);
 
                   System.out.printlnoField.GetNameRef)+ ": " +
                                     oField.GetFieldTypeNameoField.GetFieldType))+ "" +
                            oField.GetWidth)+"."+ oField.GetPrecision) + ")");
         }
 
         // 输出图层中的要素个数
         System.out.println"要素个数 = " + oLayer.GetFeatureCount0));
 
         Feature oFeature = null;
         // 下面开始遍历图层中的要素
         while oFeature =oLayer.GetNextFeature)) != null)
         {
                   System.out.println"当前处理第" + oFeature.GetFID) + "个:\n属性值:");
                   // 获取要素中的属性表内容
                   for int iField = 0; iField< iFieldCount; iField++)
                   {
                            FieldDefn oFieldDefn= oDefn.GetFieldDefniField);
                            int type =oFieldDefn.GetFieldType);
 
                            switch type)
                            {
                                     caseogr.OFTString:
                                               System.out.printlnoFeature.GetFieldAsStringiField)+ "\t");
                                               break;
                                     caseogr.OFTReal:
                                               System.out.printlnoFeature.GetFieldAsDoubleiField)+ "\t");
                                               break;
                                     caseogr.OFTInteger:
                                               System.out.printlnoFeature.GetFieldAsIntegeriField)+ "\t");
                                               break;
                                     default:
                                               System.out.printlnoFeature.GetFieldAsStringiField)+ "\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.GetDriverByNamestrDriverName);
         if oDriver == null)
         {
                   System.out.printlnstrVectorFile+ " 驱动不可用!\n");
                   return;
         }
 
         // 创建数据源
         DataSource oDS = oDriver.CreateDataSourcestrVectorFile,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.CreateFieldoFieldID, 1);
 
         // 再创建一个叫FeatureName的字符型属性,字符长度为50
         FieldDefn oFieldName = newFieldDefn"FieldName", ogr.OFTString);
         oFieldName.SetWidth100);
         oLayer.CreateFieldoFieldName, 1);
 
         FeatureDefn oDefn =oLayer.GetLayerDefn);
 
         // 创建三角形要素
         Feature oFeatureTriangle = newFeatureoDefn);
         oFeatureTriangle.SetField0, 0);
         oFeatureTriangle.SetField1, "三角形");
         Geometry geomTriangle =Geometry.CreateFromWkt"POLYGON 0 0,20 0,10 15,0 0))");
         oFeatureTriangle.SetGeometrygeomTriangle);
 
         oLayer.CreateFeatureoFeatureTriangle);
 
         // 创建矩形要素
         Feature oFeatureRectangle = newFeatureoDefn);
         oFeatureRectangle.SetField0, 1);
         oFeatureRectangle.SetField1, "矩形");
         Geometry geomRectangle =Geometry.CreateFromWkt"POLYGON 30 0,60 0,60 30,30 30,30 0))");
         oFeatureRectangle.SetGeometrygeomRectangle);
 
         oLayer.CreateFeatureoFeatureRectangle);
 
         // 创建五角形要素
         Feature oFeaturePentagon = newFeatureoDefn);
         oFeaturePentagon.SetField0, 2);
         oFeaturePentagon.SetField1, "五角形");
         Geometry geomPentagon =Geometry.CreateFromWkt"POLYGON 70 0,85 0,90 15,80 30,65 15,700))");
         oFeaturePentagon.SetGeometrygeomPentagon);
 
         oLayer.CreateFeatureoFeaturePentagon);
 
         System.out.println"\n数据集创建完成!\n");
}

3.矢量数据管理

staticvoid VectorDeleteString strVectorFile)
{
         // 注册所有的驱动
         ogr.RegisterAll);
         File file = newFilestrVectorFile); 
         org.gdal.ogr.Driver oDriver = null;
        
         {
                   //打开矢量
                   DataSource oDS =ogr.OpenstrVectorFile, 0);
                   if oDS == null)
                   {
                            file.delete);
                            return;
                   }
 
                   oDriver = oDS.GetDriver);
                   if oDriver == null)
                   {
                            file.delete);
                            return;
                   }
         }
 
         ifoDriver.DeleteDataSourcestrVectorFile) == ogr.OGRERR_NONE)
                   return;
         else
                   file.delete);
}
 
staticvoid VectorRenameString strOldFile, String strNewFile)
{
         // 注册所有的驱动
         ogr.RegisterAll);
         File file = new FilestrOldFile); 
         org.gdal.ogr.Driver oDriver = null;
         {
                   //打开矢量
                   DataSource oDS =ogr.OpenstrOldFile, 0);
                   if oDS == null)
                   {
                            file.renameTonewFilestrNewFile));
                            return;
                   }
 
                   oDriver = oDS.GetDriver);
                   if oDriver == null)
                   {
                            file.renameTonewFilestrNewFile));
                            return;
                   }
 
                   DataSource oDDS =oDriver.CopyDataSourceoDS, strNewFile, null);
                   if oDDS == null)
                   {
                            file.renameTonewFilestrNewFile));
                            return;
                   }
         }
 
         ifoDriver.DeleteDataSourcestrOldFile) == ogr.OGRERR_NONE)
                   return;
         else
                   file.renameTonewFilestrNewFile));
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注