前言
例如:之前写了读shp字段相关的文章,包括
【Java+GDAL】读取shp信息(字段、要素属性等),
Java使用gdal更改shp要素的字段属性值,
Java使用gdal重命名shp属性字段,
今天写的是新增字段和删除字段,可以和上面几篇结合着看,实现思路中有些共同的地方。
一、GDAL和Java版本
GDAL版本为3.0.1
Java为JDK 17.0.11
二、代码实现
1.引入gdal环境
import org.gdal.gdal.gdal;
import org.gdal.ogr.*;
//自定义shp工具类
public class ShpUtil {
static {
ogr.RegisterAll();
gdal.AllRegister();//设置gdal环境
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");//支持中文路径
gdal.SetConfigOption("SHAPE_ENCODING","CP936");//属性表字段支持中文
}
//......新增字段和删除字段方法
}
2.读取shp新增、删除字段
代码如下(示例):
/**
* 新增字段
* @param fieldName,新增的字段名称
* @param fieldType,该字段的类型
* @param shpPath,shp文件路径
* @author 415411
* @create 2024/9/9
**/
public static void createNewField(String fieldName, int fieldType, String shpPath) {
// 可写方式打开shp
DataSource dataSource = ogr.Open(shpPath, 1);
Layer layer = dataSource.GetLayer(0);
// 由名称和类型创建一个新字段
FieldDefn fieldDefn = new FieldDefn(fieldName,fieldType);
// 加入新字段
layer.CreateField(fieldDefn);
dataSource.delete();
}
/**
* 删除字段
* @param fieldName,要删除的字段名称
* @param shpPath,shp文件路径
* @author 415411
* @create 2024/9/9
**/
public static void deleteExistField(String fieldName, String shpPath) {
DataSource dataSource = ogr.Open(shpPath, 1);
Layer layer= dataSource.GetLayer(0);
FeatureDefn featureDefn = layer.GetLayerDefn();
// 获取要删除的字段所对应的字段ID
int fieldID = featureDefn.GetFieldIndex(fieldName);
// 根据字段ID删除字段
layer.DeleteField(fieldID);
dataSource.delete();
}
3.测试使用
public static void main(String[] args) throws IOException {
// 新增oName和yName字段,类型均为String
createNewField("oName",4,"D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp");
createNewField("yName",4,"D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp");
// 获删除oName字段
deleteExistField("oName","D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp");
}
总结
今天介绍利用gdal为shp新增字段和删除字段的方法,在新增字段类型中,字段的类型可在ogrConstans这个接口中查看,在之前写的【Java+GDAL】读取shp信息(字段、要素属性等)这篇文章的结尾也有提到,可自行查看需要的类型所对应的值,后续也可能会出一篇介绍该接口的文章。