当前位置:   article > 正文

arcengine for java 读取gdb文件_arcobjects.jar

arcobjects.jar

工具及环境: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();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

**

三、对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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

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


关于arcengine资源的释放

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

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

            //释放单个arcengine对象的资源
            cleaner.release("某个arcengine对象");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/341083
推荐阅读
相关标签
  

闽ICP备14008679号