关于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)); }