【Java+GDAL】读取shp信息(字段、要素属性等)


前言

例如:之前写了两篇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 等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值