这个问题源于制作RGB彩色合成图。仿照ArcMap中的做法,我们发现Arcmap中除了标准差拉伸、直方图均衡化、最大最小值拉伸、直方图匹配等既定的拉伸方法之外,还有最直接的自定义直方图拉伸。在我想实现这个功能的时候,发现最有可能与此相关的接口就是IRasterStretch2,其StretchStats和SpecificationHistogram应该就是与直方图相关的属性。经过测试,问题出现了:
IRasterRGBRenderer2 m_pRasterRGBRenderer = pRasterLayer.Renderer as IRasterRGBRenderer2; IRasterStretch2 pRasterStretch2 = m_pRasterRGBRenderer as IRasterStretch2; IArray pArray = pRasterStretch2.SpecificationHistogram; IArray pArray2 = pRasterStretch2.StretchStats; object obj1 = pArray.get_Element(0); object obj2 = pArray2.get_Element(0);
当我们用ArcMap制作好RGB合成图并用自己的程序加载地图后,发现StretchStats和SpecificationHistogram都是IArray类型的接口对象,经过转换,并且进一步探索,发现其元素是一个object类型的对象,其中obj1是null,而obj2有值,但是使用GetType()的得到的信息是System.__ComObject,这下就难住我们了,因为我们无法确认它的真实面目。经过网上搜索,发现这个问题在2011年就有人发过帖子,见:Geographic Informathion System论坛,ESRI ArcGIS Resource论坛。
这两处,应该都是同一个人提的,他问的也是同样的问题:
IRasterStretch2 irs = irrgbr as IRasterStretch2; //irrgbr is of type IRasterRGBRenderer. IArray ia = irs.StretchStats; ISomething value = ia.get_Element(0) as ISomething; // What should "ISomething" be?
在这里http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/d/000100000471000000.htm,我看到IArray是一个IAnimationTrack对象,而在http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/d/0001000002r6000000.htm处,我发现它是一个EnumGPNameClass对象,还有很多地方,都有IArray的身影,问题变得似乎复杂了.
既然这里的IArray与直方图有关,那么它肯定是一个键值对组合,最容易想到的是IUniqueValues,很不幸的是在即时窗口里的测试结果是false
obj2 is ESRI.ArcGIS.DataSourcesRaster.IUniqueValues false
无奈,只好试试其它的。于是我做了如下的测试:
obj2 is ESRI.ArcGIS.DataSourcesRaster.IRaster2 false obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterBand false obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterBandCollection false obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterBandColormap false obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterCalcStatsHistogram false obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterCalcStatsHistogram2 false obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterCalcUniqueValues false obj2 is ESRI.ArcGIS.DataSourcesRaster.IStatsHistogram true测试的类型比我想象的要少,最初还想用反射来枚举AE中的所有类,以便探测其类型,没想到的是大概测试了十多个接口,敏感的我就定位到了统计相关的接口,并且找到了IStatsHistogram接口。没有让我失望,Is IStatsHistogram返回了true,这样问题就解决了。既然网上对于这个问题没有任何论述,我就在此罗嗦一下,撰文一篇,以期对后续遇到同样问题的人有所帮助。另外在 ESRI ArcGIS Resource论坛里,我也留下了答案。