realr7 2024-08-02 10:34 采纳率: 0%
浏览 18
已结题

IExtractionOp接口按属性提取浮点型DEM


        /// <summary>
        /// 获取栅格范围(按属性)
        /// </summary>
        /// <param name="inRaster">输入栅格</param>
        /// <param name="dubRangLow">最低像素值</param>
        /// <param name="dubRangHigh">最高像素值</param>
        /// <param name="fieldName">字段名称</param>
        /// <returns>数据集</returns>
        private IGeoDataset GetRasterByRang(IRaster inRaster, double dubRangLow, double dubRangHigh, string fieldName, bool inRang)
        {
            try
            {
                //按属性提取栅格
                string strFilter = "";
                if (inRang)
                {
                    strFilter = fieldName + ">" + dubRangLow.ToString() + " and " + fieldName + "< " + dubRangHigh.ToString();//筛选条件
                }
                else
                {
                    strFilter = fieldName + "<" + dubRangLow.ToString() + " or " + fieldName + ">" + dubRangHigh.ToString();//筛选条件
                }
                
                IExtractionOp2 pExtractionOp = new RasterExtractionOpClass();
                IGeoDataset pGeodataset = inRaster as IGeoDataset;
 
                只处理视图范围内
                //IRasterAnalysisEnvironment pEnv = pExtractionOp as IRasterAnalysisEnvironment;
                //object objSnap = null;
                //object objExtent = ArcMap.Document.ActiveView.Extent;
                //pEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref objExtent, ref objSnap);
 
                IRasterDescriptor pRasterDescriptor = new RasterDescriptorClass();
                IQueryFilter pQueryFilter = new QueryFilterClass();
                pQueryFilter.WhereClause = strFilter;
                pRasterDescriptor.Create(inRaster, pQueryFilter, fieldName);
                IGeoDataset pGeoDataset = pExtractionOp.Attribute(pRasterDescriptor);
                return pGeoDataset;
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message );
                return null;
            }
        }

img


为什么无法用IExtractionOp2 接口按属性提取,浮点型的DEM,整形的是可以的。

  • 写回答

7条回答 默认 最新

  • 码农阿豪@新空间 Java领域优质创作者 2024-08-06 09:36
    关注
    获得1.95元问题酬金
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题可能出在筛选条件的构造上。在代码中,根据传入参数inRang的值来构造筛选条件strFilter,分别是按照字段值大于等于最低像素值且小于等于最高像素值,或者小于最低像素值或者大于最高像素值。对于浮点型数据,由于存在精度问题,可能会导致条件无法准确匹配到指定的像素值范围。 为了解决这个问题,可以修改筛选条件的构造方式,使用范围判断来代替精确值判断,比如判断字段值是否在最低值与最高值之间。这将减少对精确值的依赖,避免了精度问题造成的影响。 以下是修改后的代码示例:
    private IGeoDataset GetRasterByRange(IRaster inRaster, double dubRangeLow, double dubRangeHigh, string fieldName, bool inRange)
    {
        try
        {
            //按属性提取栅格
            string strFilter = "";
            if (inRange)
            {
                strFilter = fieldName + ">=" + dubRangeLow.ToString() + " and " + fieldName + "<=" + dubRangeHigh.ToString(); //范围条件
            }
            else
            {
                strFilter = fieldName + "<" + dubRangeLow.ToString() + " or " + fieldName + ">" + dubRangeHigh.ToString(); //范围条件
            }
            IExtractionOp2 pExtractionOp = new RasterExtractionOpClass();
            IGeoDataset pGeodataset = inRaster as IGeoDataset;
            IRasterDescriptor pRasterDescriptor = new RasterDescriptorClass();
            IQueryFilter pQueryFilter = new QueryFilterClass();
            pQueryFilter.WhereClause = strFilter;
            pRasterDescriptor.Create(inRaster, pQueryFilter, fieldName);
            IGeoDataset pGeoDataset = pExtractionOp.Attribute(pRasterDescriptor);
            
            return pGeoDataset;
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
            return null;
        }
    }
    

    通过修改筛选条件的构造方式,将范围判断引入,可以更准确地提取浮点型数据的栅格范围。因此,在浮点型DEM数据上也可以按属性提取了。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月21日
  • 赞助了问题酬金15元 8月13日
  • 修改了问题 8月13日
  • 创建了问题 8月2日