之前发过两篇文章关于IFeatureDataConverter接口,具体可以在文章一与文章二中看到成果;今天再次研究这个接口,又有了新的发现!
需求:
在导出操作中,导出指定的字段生成Shape文件。
问题来源:
在ArcGIS的其他数据库中,如ArcSDE、fileGDB或者MDB中存在一个字段类型BLOB—大二进制类型,它可以用来存储很多东西,如视频、图片等;但是很不幸的是Shape文件中并不支持这个字段类型,所以我们在直接导出的时候就会出现异常!
BLOB:
大二进制类型主要的操作是通过IMemoryBlobStream 接口操作的;包括将BLOB类型字段数据读取到文件中与将文件数据写入的BLOB字段中。
分析与解决:
public IEnumInvalidObject ConvertFeatureClass (
IDatasetName inputFClassName,
IQueryFilter InputQueryFilter,
ISelectionSet InputSelectionSet,
IFeatureDatasetName outputFDatasetName,
IFeatureClassName outputFClassName,
IGeometryDef OutputGeometryDef,
IFields OutputFields,
string configKey,
int FlushInterval,
int parentHWND);
这就是转换方法的参数,由于OutputFields是来源于我们需要转换的要素类,所以他包含了所有的要素类字段,包括BLOB。
其实这里ESRI的设计误导了我,既然我想改变输出的字段总数,当然是从这个输出字段集入手了;但是经过几个小时的尝试之后,我发现无论如何设置或者QI这个参数都是无用的,它始终与输入的要素类总数一致!
难道真的不行?不甘心的我打开ArcMap,右键这个BLOB图层,导出Shape,竟然成功了,还不包括BLOB字段;既然ArcMap可以实现,文档中也重点提出不可以,所以8成是可以实现的;
于是我将目光顶上了其他的参数,仔细查看了文档,找到了这句话:To create a featureclass with a subset of the columns from the source data use IQueryFilter::SubFields. 这次感觉找到了正确的方向~,经过了尝试果然是可行的!
总结:
1.文档还是需要仔细研究的;
2.不要被参数的命名所迷惑;
3.一个接口的参数都是很有用的!