|
作者:Flyingis
ArcGIS使用者经常要面对大量的数据处理工作,如果要在自己的程序中使用Geoprocessing,更多的时候我们是要进行对数据进行批处理分析,Geoprocessing为我们提供了丰富的支持批处理的功能。
1.工作空间中查询所需数据
2.模型处理过程中各种输入数据的处理
3.枚举、循环执行
--------------------
1.工作空间中查询所需数据
要对数据进行批处理操作,首先需要知道工作空间中有哪些数据,怎么从工作空间大量数据中提取出我们所需要的数据。GeoProcessor类为我们提供了一些提取数据的方法。
listDatasets (string wildCard, string datasetType) listFeatureClasses (string wildCard, string featureType, string dataset) listRasters (string wildCard, string rasterType) listTables (string wildCard, string tableType) listToolboxes(string wildCard) listWorkspaces (string wildCard, string workspaceType)
看看代码段怎么写:
//list all the featureClasses starting with c gp.setEnvironmentValue("workspace", inputWorkspace); IGpEnumList featureClasses = gp.listFeatureClasses("c*", "", ""); String featureClass = featureClasses.next(); System.out.println("-----------Feature Classes starting with c-----------"); while (! "".equals(featureClass)) { System.out.println(featureClass); featureClass = featureClasses.next(); }
通过指定wildCard字符串,搜索所有"c"开头的feature class,将结果存放在com.esri.arcgis.geoprocessing.IGpEnumList枚举List中。看到IGpEnumList千万不要将它和Java数据结构中各种List相提并论,它仅仅具有顺序枚举next和重置查询指针reset的功能,可以被序列化。
再参考另外两个例子,相信对在工作空间中查询数据会有更多的认识。
返回所有面状要素
System.out.println("\n-----------Polygon Feature Classes-----------"); gp.setEnvironmentValue("workspace", inputWorkspace); featureClasses = gp.listFeatureClasses("", "polygon", ""); featureClass = featureClasses.next(); while (! "".equals(featureClass)) { System.out.println(featureClass); featureClass = featureClasses.next(); }
返回所有TIF格式的Raster数据
// List all TIF files in the workspace and build pyramids gp.setEnvironmentValue("workspace", inputWorkspace); IGpEnumList rasters = gp.listRasters("", "TIF"); String raster = rasters.next(); BuildPyramids buildPyramids = new BuildPyramids(raster); while (! "".equals(raster)) { System.out.println("\n------------Building pyramids for: " + raster + "----------"); gp.execute(buildPyramids, null); raster = rasters.next(); }
关于各种list方法TYPE类型,可以参考下表
Method |
Type Keywords |
ListDatasets |
All, Feature, Coverage, RasterCatalog, CAD, VPF, TIN, Topology |
ListFeatureClasses |
All, Point, Label, Node, Line, Arc, Route, Polygon, Region |
ListFields |
All, SmallInteger, Integer, Single, Double, String, Date, OID, Geometry, Blob |
ListWorkspaces |
All, Coverage, Access, SDE, Folder |
ListTables |
All, dBASE, INFO |
ListRasters |
All, ADRG, BIL, BIP, BSQ, BMP, CADRG, CIB, ERS, GIF, GIS, GRID, STACK, IMG, JPEG, LAN, SID, SDE, TIF, RAW, PNG, NITF |
2.模型处理过程中各种输入数据的处理
Geoprocessing计算过程中会要求多个输入,通常可以用IGpEnumList来捕获。
gp.setEnvironmentValue("workspace", multiWorkspace); IGpEnumList polygonFCs = gp.listFeatureClasses("", "polygon", ""); String polygon = polygonFCs.next(); String polygonsToUnion = ""; while (! "".equals(polygon)){ polygonsToUnion += polygon; polygon = polygonFCs.next(); if (! "".equals(polygon)){ polygonsToUnion += ";"; } } Union union = new Union(polygonsToUnion,outputWorkspace+"/unioned.shp"); gp.execute(union, null);
另外,可以使用表结构来保存每个输入的参数值,避免全部feature保存在一个字符串中。
// List all feature classes in the workspace. gp.setEnvironmentValue("workspace", multiWorkspace); IGpEnumList polygonFCs = gp.listFeatureClasses("", "polygon", ""); //make the value table GPValueTable gpValueTable = new GPValueTable(); String polygon = polygonFCs.next(); String row = null; while (! "".equals(polygon)){ if ("center".equals(polygon)){ row = polygon + " 1"; } else { row = polygon + " 2"; } gpValueTable.addRow(row); polygon = polygonFCs.next(); } Union union = new Union(gpValueTable, outputWorkspace+"/unionedValueTable.shp"); gp.execute(union, null);
3.枚举、循环执行
前面两点都是针对一个Geoprocessing操作而言,如果需要多个操作,可以用基本程序语言来描述,这分为两种情况,一是多种Geoprocessing的数据处理,一种是同一Geoprocessing循环执行,相比ArcToolbox而言,这里体现的是程序代码带给我们的方便。
|