文章目录
- 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(“数据集关闭!”); }
- 写入的结果如下图所示。 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”); }
- 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)); }
关于Java配置GDAL库参考之前的博文。
在Java中使用OGR读写矢量数据时,需要导入ogr库,如果需要对中文路径的支持还有空间参考的支持,需要导入gdal和osr库,代码如下:
importorg.gdal.osr.*; importorg.gdal.ogr.*; importorg.gdal.gdal.*;
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("数据集关闭!");
}
写入的结果如下图所示。
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");
}
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));
}
发表回复