前言
昨天实现了gdal对shp文件进行属性字段的重命名,Java使用gdal重命名shp属性字段。对于gdb的话也是类似的思路,只不过gdb有多个图层,以后有涉及到再写。今天试了下gdal修改shp要素字段的属性值,主要用到了SetField和SetFeature两个方法,比较简单。
一、GDAL和Java版本
GDAL版本为3.0.1与3.9.1
Java为JDK 17.0.11
二、代码
1.引入gdal,设置gdal环境
import org.gdal.gdal.gdal;
import org.gdal.ogr.*;
ogr.RegisterAll();
gdal.AllRegister();
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");//支持中文路径
gdal.SetConfigOption("SHAPE_ENCODING","CP936");//属性表字段支持中文
2.修改要素属性值
代码如下(示例):
/**
* 修改第index个要素的fieldName字段的值为fieldValue,比如将第2个要素(索引为1)的name字段的值从yu修改为ku
* @param index,要素的索引
* @param fieldName,字段名称
* @param fieldValue,字段值
* @param shpPath,shp文件路径
* @author 415411
* @create 2024/9/5
**/
public static void updateFeatureValueByIndex(long index, String fieldName, String fieldValue, String shpPath) {
// 以可写方式打开shp
DataSource dataSource = ogr.Open(shpPath, 1);
// 获取图层
Layer layer = dataSource.GetLayer(0);
System.out.println(fieldName);
System.out.println(fieldValue);
// 根据索引获取要素
Feature feature = layer.GetFeature(index);
// 更改要素的字段属性值
feature.SetField(fieldName,fieldValue);
// 需要图层重绘feature,并关闭数据集才可生效
layer.SetFeature(feature);
// 关闭数据集
dataSource.delete();
}
3.测试使用
public static void main(String[] args) {
//将第一个要素(索引为0)的name字段的属性值由原先的newway改为Latway
updateFeatureValueByIndex(0,"name","Latway","D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp");
}
总结
今天简单写了下改要素属性值,由于时间关系,还有许多细节没讲,比如字段的类型、要素及属性值为Null等一些情况的影响。后续可能会出几期增删改shp和gdb的字段、字段值的文章。