您的位置:首页 > 其它

IRasterStretch2接口的StretchStats属性的真实面目是什么

2013-11-18 17:27 260 查看
这个问题源于***RGB彩色合成图。仿照ArcMap中的做法,我们发现Arcmap中除了标准差拉伸、直方图均衡化、最大最小值拉伸、直方图匹配等既定的拉伸方法之外,还有最直接的自定义直方图拉伸。在我想实现这个功能的时候,发现最有可能与此相关的接口就是IRasterStretch2,其StretchStatsSpecificationHistogram应该就是与直方图相关的属性。经过测试,问题出现了:

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合成图并用自己的程序加载地图后,发现StretchStatsSpecificationHistogram都是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?


并且比较糟糕的是居然没有任何答案。为了实现我的功能,就必须解决这个问题。首先我能确定的是,这个object肯定是一个对象,那么它究竟是什么呢?

在这里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论坛里,我也留下了答案。




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: