工具及环境: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对象");