arcengine for java 读取gdb文件

工具及环境:IDEA,jdk1.8 32位,arcgis10.2
**

一、引用arcengine的依赖

**
1、idea项目的jdk要选择32位的,arcengine目前只支持32位的jdk
2、在idea中引入arcobjects.jar,这个jar包的位置在arcigs的Desktop10.2包下,我的位置是C:\Program Files (x86)\ArcGIS\Desktop10.2\java\lib\arcobjects.jar(没有arcgis的要先下载arcgis,百度很多教程);引入的位置如下图:这样引用可以保证在项目里使用,但是项目打包时无法将此依赖一起打包,所以最好还是把jar包上传到私服里,然后在maven里引用,jar包的版本号和路径可以自己起。在这里插入图片描述
**

二、对arcengine进行初始化

**
在使用arcengine的相关类时如果出现Could not load native libraries. java.lang.UnsatisfiedLinkError: no ntvauth in java.library.path这种错误,那就是在使用arcengine之前没有对其进行初始化了,初始化的方法如下,在方法的最上面调用这个方法或者写一个静态代码块来进行arcengine的初始化都行。

/**
     * arcengine创建相关类前的初始化
     */
    public static void initializeArcGISLicenses() {
    
    
        try {
    
    
            EngineInitializer.initializeEngine();
            com.esri.arcgis.system.AoInitialize ao = new com.esri.arcgis.system.AoInitialize();
//            ao.initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
            ao.initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);
            ao.initialize(com.esri.arcgis.system.esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);

        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

**

三、对gdb文件进行读取

**
好,接下来就是对gdb文件的读取了
1、循环获取gdb文件里图层的名称与别名

/**
     * 从GDB文件中获取图层的名称(标准名,如SZTCBJX)和图层别名(如:深圳图层边界线)
     *
     * @param gdbPath
     * @return
     */
    public static List<LayerInformationVo> getLayerNameFromGDB(String gdbPath) throws IOException {
    
    
    	//初始化arcengine
        initializeArcGISLicenses();

        IFeatureClass pFeatureClass = null;

        //用于返回数据,LayerInformationVo可以用Map代替,里面存的是图层的标准名与别名
        List<LayerInformationVo> result = new ArrayList<>();

        //创建 GDB 工作空间对象
        FileGDBWorkspaceFactory pFileGDBWorkspaceFactoryClass = new FileGDBWorkspaceFactory();
        IWorkspace iWorkspace = pFileGDBWorkspaceFactoryClass.openFromFile(gdbPath, 0);
        IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace) pFileGDBWorkspaceFactoryClass.openFromFile(gdbPath, 0);

        //创建图层名集合
        IEnumDatasetName datasetNames = iWorkspace.getDatasetNames(esriDatasetType.esriDTFeatureClass);
        IDatasetName datasetName = null;

        while ((datasetName = datasetNames.next()) != null) {
    
    
            if (datasetName.getName().equals("yw3_SpatialJoin")) {
    
    
                log.info("不是图层");
            } else {
    
    
                //获取layerName(别名)
                LayerInformationVo layerInformationVo = new LayerInformationVo();
                String layerName = datasetName.getName();
                layerInformationVo.setLayerName(layerName);

                //获取layerCode(标准名)
                pFeatureClass = pFeatureWorkspace.openFeatureClass(layerName);
                String layerCode = pFeatureClass.getAliasName();
                layerInformationVo.setLayerCode(layerCode);

                result.add(layerInformationVo);
            }
        }

        return result;
    }

2、循环获取gdb文件里图层的字段的各种属性

/**
     * 获取一个图层的所有 字段名,字段别名,字段数据类型,字段长度(或精度)
     *
     * @param gdbPath
     * @param layerCode
     * @return
     */
    public static List<FieldNameVo> getFieldsFromLayerName(String gdbPath, String layerCode) throws IOException {
    
    
        //初始化aecengine
        initializeArcGISLicenses();

        //用于返回的结果集合,FieldNameVo就是个实体类,封装了字段的各种属性,可以用map代替
        List<FieldNameVo> resultList = new ArrayList<>();

        //获取 featureClass 对象
        FeatureVo fcAndF = getFCAndF(gdbPath, layerCode);
        IFeatureClass featureClass = fcAndF.getFeatureClass();

        //获取 图层里的一行数据信息  1代表第一行
//        IFeature feature = featureClass.getFeature(1);
        //获取 图层所有字段
        IFields fields = featureClass.getFields();
//        feature.getValue()

        //获取字段个数
        int fieldCount = fields.getFieldCount();
        for (int i = 0; i < fieldCount; i++) {
    
    
            FieldNameVo fieldNameVo = new FieldNameVo();

            //获取第i个字段
            IField field = fields.getField(i);

            //获取字段别名(中文名称)
            String fieldAliasName = field.getAliasName();
            fieldNameVo.setFieldAliasName(fieldAliasName);
            //获取字段名称(标准名称)
            String fieldName = field.getName();
            fieldNameVo.setFieldName(fieldName);
            //获取字段类型 (4—文本字符串类型 , 1—长整型 , 3—双精度 , 7—几何类型 , 6—对象ID , 5-时间)
            int fieldType = field.getType();
//            fieldMap.put("fieldType" , fieldType);
            fieldNameVo.setFieldType(getFieldTypeByInt(fieldType));
            if (fieldType == 6) {
    
    
                fieldNameVo.setPrimaryKey(true);
            } else {
    
    
                fieldNameVo.setPrimaryKey(false);
            }
            //获取字段长度(或精度)                         未完待续
            int fieldLength = field.getLength();
            fieldNameVo.setFieldLength(fieldLength);

            //获取字段默认值
            Object fieldDefaultValue = field.getDefaultValue();
            fieldNameVo.setFieldDefaultValue((String) fieldDefaultValue);

            resultList.add(fieldNameVo);
        }

        return resultList;
    }
/**
     * 获取 IFeatureWorkspace 和 IFeatureClass 和 IFeature 对象
     *
     * @param gdbPath
     * @param layerCode
     * @return
     */
    public static FeatureVo getFCAndF(String gdbPath, String layerCode) throws IOException {
    
    
        initializeArcGISLicenses();
        //featureVo 是个实体类 ,封装了IFeatureWorkspace与IFeatureClass
        FeatureVo featureVo = new FeatureVo();

        //创建 gdb工作空间
        FileGDBWorkspaceFactory pFileGDBWorkspaceFactoryClass = new FileGDBWorkspaceFactory();
        IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace) pFileGDBWorkspaceFactoryClass.openFromFile(gdbPath, 0);
        //获取 gdb中某个图层的 FeatureClass对象
        IFeatureClass pFeatureClass = pFeatureWorkspace.openFeatureClass(layerCode);

        featureVo.setFeatureWorkspace(pFeatureWorkspace);
        featureVo.setFeatureClass(pFeatureClass);


        return featureVo;
    }

ok,差不多先写这些,arcengine还有其他的功能,比如获取gdb里图层的类型,坐标系啊等,大家可以自己研究研究,都不是很难


关于arcengine资源的释放

arcengine的相关类会对gdb文件进行操作,所以需要释放文件流,但是arcengine的很多类在java里没有释放资源的方法,在c#中释放资源倒是很方便;所以在java中arcengine有自己专门释放资源的类。如下

			Cleaner cleaner = new Cleaner();
            
            //释放所有arcengine相关类的资源
            cleaner.releaseAll();

            //释放单个arcengine对象的资源
            cleaner.release("某个arcengine对象");

猜你喜欢

转载自blog.csdn.net/qq_45697944/article/details/107243806
今日推荐