首页 > 编程语言 >【Java+GDAL】读取shp信息(字段、要素属性等)

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

时间:2024-09-06 20:53:48浏览次数:14  
标签:shp Java String shpPath 获取 GDAL gdal dataSource

文章目录


前言

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

相关文章

  • Java圣经第六天
    List集合以及Set集合和Collections工具类1.List集合以及Set集合(在这里只讲独有方法)ArrayList集合:有序,有重复值,有索引--》基于数组LinkedList集合:有序,有重复值,有索引--》基于数组和双向链表HashSet集合:无序,无重复值,无索引--》哈希表(数组+链表+红黑树)LinkedHashSet集合:有序,......
  • JAVA获取本地的所有网卡IP地址列表
      privatestaticfinalStringNETMASK="(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";privatestaticfinalPatternIP_PATTERN=Pattern.compile("^(?:"+NETMASK+"\\.){3}"+NETMASK+"$");publicst......
  • Java中的Stream流
    一、案例引入案例需求:创建一个集合,存储多个姓名字符串元素;把集合中所有以“张”开头的元素存储到一个新的集合;把上述集合中长度为3的元素存储到一个新的集合;遍历后打印上一步得到的集合传统方法:publicclassStreamDemo{publicstaticvoidmain(String[]args){......
  • 05JAVA第一次测试编程题整理
    02控制语句引用对象要自己初始化classHotel{intprice;intcom;}intn=sc.nextInt();for(inti=1;i<=n;i++){if(h[i]==null){h[i]=newHotel();}/*Hotel[......
  • Java-单向链表实现
    什么是链表?        链表是一种常见的数据结构,用于存储一系列元素。与数组不同,链表中的元素(节点)在内存中不必是连续的。每个节点包含数据部分和指向下一个节点的引用(指针)。链表的主要优点是插入和删除操作的时间复杂度为O(1),但访问特定元素的时间复杂度为O(n)。头节点......
  • java集合基础练习题
    List集合.ArrayList,LinkedList,Vector三者的相同点与不同点?(“Vector”可百度)【面试题】共同点:他们都实现了List接口,意味着他们具有相同的基本操作,如添加、删除、获取元素有序性和可重复性,他们都是有序的,即插入顺序和迭代顺序相同,都允许存储重复的元素都可以动态调整大......
  • Spire.Office for Java 9.8.0 FIX
    独立Java库用于处理Office、PDF和条形码Spire.OfficeforJava是E-iceblue提供的企业级OfficeJavaAPI的组合,包括Spire.DocforJava、Spire.XLSforJava、Spire.PresentationforJava、Spire.PDFforJava和Spire.BarcodeforJava。开发人员可以使用Spire.Off......
  • JavaScript学习文档(14):深入对象、内置构造函数、综合案例
    目录一、深入对象1、创建对象三种方式2、构造函数(1)构造函数(2)说明:(3)利用构造函数创建多个对象(4)实例化执行过程3、实例成员和静态成员(1)实例成员:(2)静态成员:二、内置构造函数1、Object2、Array(1)数组常见实例方法-核心方法(2)员工涨薪计算成本案例(3)还有些数组常见方法(4......
  • 基于Java的旅游景区网站系统设计与实现
    演示地址前台地址:http://travel.gitapp.cn后台地址:http://travel.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123功能介绍平台采用B/S结构,后端采用主流的Springboot框架进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。前台功......
  • javascript网页设计案例
    JavaScript在网页设计中扮演着重要的角色,能够实现动态效果和交互功能,提升用户体验。下面,我将通过一个具体的案例——“动态图片轮播”来展示JavaScript在网页设计中的应用。案例:动态图片轮播1.HTML结构<!DOCTYPEhtml><htmllang="zh"><head>  <metacharset="UTF-......