本文的出发点为读取GDB数据,到Oracle SDE数据库中,这其中最开始的便是读取GDB数据。由于之前的博客中介绍了GDB数据为ArcGIS平台推出的空间数据存储文件结构,所以在这个其中我先想到的是ArcGIS平台

1. 环境描述

  • IDE:使用IDEA
  • ArcGIS10.2.2

2. 细节描述

  1. 关于arcengine初始化 java.lang.UnsatisfiedLinkError:no ntvinv in java.library.path错误的几种解决方法
    https://blog.csdn.net/qq_45697944/article/details/108447500

  2. 如何查看Java版本信息
    http://www.xitongzhijia.net/soft/195530.html

  3. ArcEngine完整Demo https://download.csdn.net/download/laohoubin/5571501,没有积分需要可以私聊(毕竟资源为别人的)

3. 代码细节

import com.esri.arcgis.geodatabaseui.VersionManager;
import com.esri.arcgis.system.AoInitialize;
import com.esri.arcgis.system.EngineInitializer;
import com.esri.arcgis.system.esriLicenseProductCode;
import com.esri.arcgis.system.esriLicenseStatus;

import java.io.IOException;

/**
 * @Classname AoInitUtil
 * @Description AO许可类
 * @Date 2021/4/19 13:53
 * @Created by xiaocai
 */
public class AoInitUtil {
    /**
     * 初始化ae
     * 初始化ae或许可失败,会报错或者返回null
     * @param aoInit
     * @return
     */
    public AoInitialize initializeEngine(AoInitialize aoInit) throws IOException {
        //初始化ae
        EngineInitializer.initializeVisualBeans();

        // 设置使用的arcgis产品和版本,使ao能运行在不同的arcgis环境下
        VersionManager versionManager = new VersionManager();


        aoInit = new AoInitialize();

        //判断并使用哪个级别的许可,PS:目前应该只能用desktop相关的许可,也就是Advanced,Standard,Basic等
        if (aoInit.isProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeAdvanced) == esriLicenseStatus.esriLicenseAvailable) {
            aoInit.initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);
        } else if (aoInit.isProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeStandard) == esriLicenseStatus.esriLicenseAvailable) {
            aoInit.initialize(esriLicenseProductCode.esriLicenseProductCodeStandard);
        } else if (aoInit.isProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeBasic) == esriLicenseStatus.esriLicenseAvailable) {
            aoInit.initialize(esriLicenseProductCode.esriLicenseProductCodeBasic);
        } else if (aoInit.isProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB) == esriLicenseStatus.esriLicenseAvailable) {
            aoInit.initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
        } else if (aoInit.isProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeArcServer) == esriLicenseStatus.esriLicenseAvailable) {
            aoInit.initialize(esriLicenseProductCode.esriLicenseProductCodeArcServer);
        } else {
            aoInit = null;
        }

        return aoInit;
    }
}

import com.esri.arcgis.datasourcesGDB.FileGDBWorkspaceFactory;
import com.esri.arcgis.geodatabase.*;
import com.esri.arcgis.system.AoInitialize;
import com.esri.arcgis.system.EngineInitializer;
import com.esri.arcgis.system.esriLicenseProductCode;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;

/**
 * @Classname readGDBData
 * @Description 读取GDB数据
 * @Date 2021/4/13 16:22
 * @Created by xiaocai
 */
public class readGDBData {
    public static void main(String[] args) throws Exception {
        getLayerNameFromGDB("C:\\Users\\xiaocai\\Desktop\\XYBASE.gdb");
    }

    /**
     * 从GDB文件中获取图层的名称(标准名,如SZTCBJX)和图层别名(如:深圳图层边界线)
     *
     * @param gdbPath
     * @return
     */
    public static void getLayerNameFromGDB(String gdbPath) throws IOException {
        //ae许可初始化
        AoInitialize aoInit = null;
        //初始化arcengine
        AoInitUtil pAoInitUtil=new AoInitUtil();
        pAoInitUtil.initializeEngine(aoInit);

        IFeatureClass pFeatureClass = null;

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

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

        while ((datasetName = datasetNames.next()) != null) {

            //获取layerName(别名)
            String layerName = datasetName.getName();
            if(datasetName instanceof IFeatureClass)
            {
                //获取layerCode(标准名)
                pFeatureClass = pFeatureWorkspace.openFeatureClass(layerName);
                String layerCode = pFeatureClass.getAliasName();

                System.out.println(String.format("%s%s",layerName,layerCode));
            }
            else if (datasetName.getSubsetNames() != null)
            {
                IEnumDatasetName pSubEDataset = datasetName.getSubsetNames();
                IDatasetName pSubDataset = pSubEDataset.next();
                System.out.println(String.format("%s",layerName));
                while (pSubDataset != null)
                {
                    if (pSubDataset instanceof IFeatureClassName)
                    {
                        //获取layerName(别名)
                        layerName = pSubDataset.getName();
                        //获取layerCode(标准名)
                        pFeatureClass = pFeatureWorkspace.openFeatureClass(layerName);
                        String layerCode = pFeatureClass.getAliasName();

                        System.out.println(String.format("%s%s",layerName,layerCode));
                    }
                    pSubDataset = pSubEDataset.next();
                }
            }
            else
            {
                System.out.println(String.format("%s",layerName));
            }
        }
        return;
    }
}

4. 输出信息

在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐