GeoTools应用:提取Shape文件属性列头信息(1)


一、环境准备

装配GeoTools有两种方式,一种是配置maven工程的pom文件(配置方式参考官网),另一种是下载geotools的jar包到本地导入依赖。我采用的是下载jar的方式,下载路径:https://sourceforge.net/projects/geotools/files/

二、实现功能

在实际项目中经常需要提取shape文件的属性列头信息,包含属性的名称和属性类型。下面的Demo代码实现提取列头数据打印到控制台的功能。

补充说明:shape文件的属性数据存储在*.dbf文件中,这个文件可以用excel打开。
这里有shape文件的样例,可下载作为研究测试使用:http://www.naturalearthdata.com/downloads/50m-cultural-vectors/

三、样例代码

1、定义shape文件属性信息模型

package com.elon.model;

import java.io.Serializable;

/**
 * Shape文件字段信息模型。
 * 
 * @author elon
 * @version 2018年6月24日
 */
public class ShapeFieldInfo implements Serializable {

    private static final long serialVersionUID = 6947403344262247581L;

    /**
     * 字段名称
     */
    private String fieldName = "";

    /**
     * 字段类型
     */
    private Class<?> fieldType = null;

    @Override
    public String toString() {
        return "fieldName:" + fieldName + "|fieldType:" + fieldType.getName();
    }

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public Class<?> getFieldType() {
        return fieldType;
    }

    public void setFieldType(Class<?> fieldType) {
        this.fieldType = fieldType;
    }
}

2、提取属性名称和类型信息

package com.elon.shape;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.opengis.feature.type.AttributeDescriptor;

import com.elon.model.ShapeFieldInfo;

/**
 * Shape文件操作公共类。
 * @author elon
 * @version 2018年6月24日
 */
public class ShapeUtils {

    /**
     * 提取shape文件包含的属性字段名称和类型信息。
     * 
     * @param shpFilePath shape文件路径
     * @return 属性信息
     */
    public static List<ShapeFieldInfo> distillShapeFieldInfo(String shpFilePath) {
        List<ShapeFieldInfo> fieldList = new ArrayList<>();
        ShapefileDataStore dataStroe = buildDataStore(shpFilePath);

        try {
            List<AttributeDescriptor> attrList = dataStroe.getFeatureSource().getSchema()
                    .getAttributeDescriptors();
            for (AttributeDescriptor attr : attrList) {
                ShapeFieldInfo field = new ShapeFieldInfo();
                field.setFieldName(attr.getLocalName());
                field.setFieldType(attr.getType().getBinding());
                fieldList.add(field);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            dataStroe.dispose();
        }

        System.out.println("fieldList:" + fieldList);
        return fieldList;
    }

    /**
     * 构建ShapeDataStore对象。
     * @param shpFilePath shape文件路径。
     * @return
     */
    public static ShapefileDataStore buildDataStore(String shpFilePath) {
        ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory();
        try {
            ShapefileDataStore dataStore = (ShapefileDataStore) factory
                    .createDataStore(new File(shpFilePath).toURI().toURL());
            if (dataStore != null) {
                dataStore.setCharset(Charset.forName("UTF-8"));
            }
            return dataStore;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

转载自:https://blog.csdn.net/ylforever/article/details/80790181

You may also like...