赞
踩
工具及环境:IDEA,jdk1.8 32位,arcgis10.2
**
**
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的相关类时如果出现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文件的读取了
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的相关类会对gdb文件进行操作,所以需要释放文件流,但是arcengine的很多类在java里没有释放资源的方法,在c#中释放资源倒是很方便;所以在java中arcengine有自己专门释放资源的类。如下
Cleaner cleaner = new Cleaner();
//释放所有arcengine相关类的资源
cleaner.releaseAll();
//释放单个arcengine对象的资源
cleaner.release("某个arcengine对象");
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。