首页 / 浏览问题 / 组件GIS / 问题详情
supermap.netc#在导入tif的栅格的像元值范围出现问题
10EXP 2025年03月03日

第一张图是QGIS的像元范围300-10000,第二张是。net的范围,要小很多,导入进去,可视化的图明显不对

private void tiffImport_btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            //判断有没有数据源
            if (workspace1.Datasources.Count == 0)
            {
                MessageBox.Show("请打开一个数据源", "提示");
                return;
            }
            //获取数据源,给数据集赋名字
            Datasource datasourse1 = workspace1.Datasources[0];
            
            //根据路径找数据集
            this.openFileDialog1.Title = "Import Tiff file";
            this.openFileDialog1.InitialDirectory = Application.StartupPath;
            this.openFileDialog1.Filter = "Tif file data(*.tif)|*.tif";
            this.openFileDialog1.FileName = "";
            //判断所在文件路径是否有tiff
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                // 获取导入文件的名称(去除扩展名)
                
                string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(this.openFileDialog1.FileName);
                if (datasourse1.Datasets.Contains(fileNameWithoutExtension))
                {
                    datasourse1.Datasets.Delete(fileNameWithoutExtension);
                }
                //有数据集然后把数据集导入,从数据源到数据集依次
                DataImport dataimport = new DataImport();
                ImportSettingTIF importSettingtif = new ImportSettingTIF();
                importSettingtif.SourceFilePath = this.openFileDialog1.FileName;  // 设置源文件路径
                importSettingtif.TargetDatasetName = fileNameWithoutExtension;    // 使用文件名作为目标数据集名称
                importSettingtif.ImportingAsGrid = true;
                string orientation_name = fileNameWithoutExtension;
                importSettingtif.TargetDatasource = datasourse1;  // 设置目标数据源
                importSettingtif.MultiBandImportMode = MultiBandImportMode.Composite;  // 设置复合模式
                dataimport.ImportSettings.Add(importSettingtif);
                // 执行导入操作
                ImportResult result = dataimport.Run();


                // 判断是否成功导入
                if (result.SucceedSettings.Length > 0)
                {
                    MessageBox.Show("导入成功", "提示");
                    datasourse1.Refresh();
                    // 使用文件名作为数据集名称,获取导入后的数据集
                    orientation_DatasetGrid = datasourse1.Datasets[fileNameWithoutExtension] as DatasetGrid;
                    Colors colors2 = new Colors();
                    // 红色起点
                    colors2.Add(Color.FromArgb(255, 0, 0)); // 纯红

                    // 向橙色过渡
                    colors2.Add(Color.FromArgb(255, 55, 0));
                    colors2.Add(Color.FromArgb(255, 115, 0));
                    colors2.Add(Color.FromArgb(255, 225, 0));

                    // 橙色到黄色
                    colors2.Add(Color.FromArgb(255, 255, 0)); // 纯黄

                    // 黄色向绿黄色过渡
                    colors2.Add(Color.FromArgb(131, 207, 0)); // 绿黄色

                    // 向绿色过渡
                    colors2.Add(Color.FromArgb(0, 255, 0)); // 纯绿

                    // 绿色向青色过渡
                    colors2.Add(Color.FromArgb(0, 255, 100)); // 带绿的青色
                    colors2.Add(Color.FromArgb(0, 255, 150)); // 更深一点的青色
                    colors2.Add(Color.FromArgb(0, 255, 200)); // 接近纯青色

                    // 青色向蓝色过渡
                    colors2.Add(Color.FromArgb(0, 200, 255)); // 带青的蓝
                    colors2.Add(Color.FromArgb(0, 150, 255)); // 中等蓝
                    colors2.Add(Color.FromArgb(0, 100, 255)); // 更深的蓝
                    colors2.Add(Color.FromArgb(0, 50, 255)); // 接近纯蓝但带一点青

                    // 蓝色终点
                    colors2.Add(Color.FromArgb(0, 0, 255)); // 纯蓝
                    orientation_DatasetGrid.ColorTable = colors2;
                    mapControl1.Map.Refresh();
                    workspacetree1.Refresh();

                    if (orientation_DatasetGrid != null)
                    {
                        // 将导入的数据集添加到地图上
                        mapControl1.Map.Layers.Add(orientation_DatasetGrid, true);
                        mapControl1.Map.ViewEntire();
                        mapControl1.Map.Refresh();
                    }
                    else
                    {
                        select_datasource.Datasets.Delete(fileNameWithoutExtension);
                        MessageBox.Show("数据集转换失败", "错误");
                    }
                }
                else
                {
                    MessageBox.Show("导入失败", "提示");
                }
            }
        }

2 个回答

您好,

        根据您提供的信息和代码分析,代码逻辑暂未看出有不合适的地方,麻烦您提供以下信息让我们更进一步为您分析差异原因:

  1. 使用的 iObjects .NET 组件版本,10.2.1?11.3.0?;
  2. 尝试同样的 tif 文件,直接在 iDesktopX 11.3.0 打开/导入后,检查栅格值以及显示情况;
  3. 私信我您的联系方式,将该 tif 文件发我分析。

希望可以帮到您。

2,308EXP 2025年03月04日

您好,根据您提供的数据,我在本地分析了,显示的颜色表不正确有以下2个原因:

  1. 该 tif 文件中存在 NAN 值(即栅格中的无值),iObjects .NET 组件没有在计算栅格数据集最大最小值的时候,没有单独排除 NAN,因此最大最小值计算不合理。该问题已上报产品缺陷,待产品修复后再提供最新的包给您;
  2. 最小值和三方产品显示不一致,是由于该 tif 文件中存在负无穷的栅格值(和 NAN 不同),iObjects .NET 对于正负无穷采用的是 double.MinValue 和 double.MaxValue,对于不同厂商表示正负无穷存在区别,都是合理的。

关于问题1,可以参考这个示例代码(https://gitee.com/liuchengxian8409/custom-dataset-grid-color-dictionary),根据正确的最大最小值重新构建颜色表,可正确显示。

希望可以帮到您。

2,308EXP 2025年03月04日
非常感谢您的帮助
...