文章目录
前言
例如:之前写了两篇shp字段的文章,Java使用gdal更改shp要素的字段属性值和Java使用gdal重命名shp属性字段,没有讲到怎么读字段、字段值、要素等等。今天主要是介绍下shp字段、要素属性的读取等等,可以与前面两篇文章配合着看,读取是比较基础的操作。
一、GDAL和Java版本
GDAL版本为3.0.1与3.9.1
Java为JDK 17.0.11
二、代码实现
1.引入gdal环境
代码如下:
import org.gdal.gdal.gdal;
import org.gdal.ogr.*;
//用于读取shp的工具类
public class ShUtil {
static {
ogr.RegisterAll();
gdal.AllRegister();//设置gdal环境
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");//支持中文路径
gdal.SetConfigOption("SHAPE_ENCODING","CP936");//属性表字段支持中文
}
//......读取shp的相关方法
}
2.读取字段名和类型
代码如下(示例):
/**
* 使用GDAL获取shp的所有字段名和类型,不包括空间属性字段
* @param shpPath,shp文件路径
* @author 415411
* @create 2024/9/6
**/
public static List<Map<String,String>> getAttributeByGDAL(String shpPath) {
// 以只读方式打开shp文件
DataSource dataSource = ogr.Open(shpPath, 0);
// 获取图层
Layer layer = dataSource.GetLayer(0);
// 获取字段
FeatureDefn featureDefn = layer.GetLayerDefn();
// 获取字段个数
int fieldCount = featureDefn.GetFieldCount();
List<Map<String,String>> fieldMap = new ArrayList<>();
for (int i = 0; i < fieldCount; i++) {
// 获取第i个字段
FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);
// 获取字段的类型
int fieldType = fieldDefn.GetFieldType();
String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);
System.out.println(fieldTypeName);
// 获取字段的名称
String fieldName = fieldDefn.GetName();
System.out.println(fieldName);
Map<String,String> current = new HashMap<>();
current.put(fieldName, fieldTypeName);
fieldMap.add(current);
}
// 关闭数据集
dataSource.delete();
// 返回示例: [{name=String}, {type=String}]
return fieldMap;
}
3.读取要素相关信息
代码如下(示例):
/**
* 获取shp图层的feature个数
* @param shpPath,shp文件路径
* @author 415411
* @create 2024/9/6
**/
public static long getShpFeatureCount(String shpPath) {
// 只读方式打开shp
DataSource dataSource = ogr.Open(shpPath, 0);
Layer layer = dataSource.GetLayer(0);
// 获取要素个数
long featureCount = layer.GetFeatureCount();
dataSource.delete();
return featureCount;
}
/**
* 根据索引(在属性表中的顺序)获取指定feature的指定字段值
* @param index,索引,如第1个要素的索引为0
* @param fieldName,字段名
* @param shpPath,shp路径
* @author 415411
* @create 2024/9/6
**/
public static String getFeatureValueByIndexAndFieldName(long index, String fieldName, String shpPath) {
// 只读方式打开shp
DataSource dataSource = getGDALShpSource(shpPath, 0);
// 获取图层
Layer layer = dataSource.GetLayer(0);
// 根据索引获取要素
Feature feature = layer.GetFeature(index);
// 获取要素feature的fieldName字段的属性值
// 注意:这里以字段值类型为字符串为例,可根据实际类型修改,如GetFieldAsInteger等等
String fieldValue = feature.GetFieldAsString(fieldName);
dataSource.delete();
return fieldValue;
}
4.测试使用
代码如下(示例):
public static void main(String[] args) throws IOException {
// 获取shp的字段和字段类型,但不包括几何属性字段
System.out.println(getAttributeByGDAL("D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp"));
// 获取shp要素的个数
System.out.println(getShpFeatureCount("D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp"));
// 获取该shp文件的第81个要素(索引为80)的type字段的属性值
System.out.println(getFeatureValueByIndexAndFieldName(80, "type","D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp"));
}
总结
例如:今天主要是读shp字段和属性值,内容会比之前稍微多一些,但几乎每行代码都有注释,实现也比较基础。另外,gdal对于属性字段的类型,以及几何类型等的定义可在ogrConstans这个接口中查看,比如 int OFTInteger = 0; int OFTString = 4 等等。
标签:shp,Java,String,shpPath,获取,GDAL,gdal,dataSource From: https://blog.csdn.net/weixin_45011889/article/details/141967095