首页 / 浏览问题 / 组件GIS / 问题详情
iobject10i 影像投影转换中 .SetGeoReference的问题
53EXP 2021年11月06日

转换思路:

  • 获取源影像的地理范围,将该地理范围进行坐标投影转换,得到目标影像的地理范围
  • 根据源影像信息创建目标影像集,并设置坐标系为目标坐标系4490
  • 将第一步得到的地理范围通过DatasetImage.SetGeoReference 方法 赋予目标影像
  • 进行每个波段每个像素的赋值

发现转换结果有偏差,原因在于通过第1步获得的目标坐标系的地理范围不是正四方形,导致在第3步设置影像的地理范围时,把平行四边形的地理范围当作正四方形的地理范围,从而使得结果不正确

但DatasetImage。SetGeoReference 方法 只能设置正四方形,正确的影像转换应该是怎么操作呢? (CoordSysTranslator.Convert 方法除外)

具体转换代码:


                var originDs = Application.ActiveApplication.Workspace.Datasources["测试"];
                var targetDs = Application.ActiveApplication.Workspace.Datasources["MemoryDatasource"];
                var originDataset = originDs.Datasets["test"] as DatasetImage;
                // 获取四至点
                int width = originDataset.Width;
                int height = originDataset.Height;
                Point2Ds point2Ds = new Point2Ds() {
                    originDataset.ImageToXY(new System.Drawing.Point(0, height- 1)),
                    originDataset.ImageToXY(new System.Drawing.Point(width - 1, 0))
                };
                string bandName;

                DatasetImageInfo datasetImageInfo = new DatasetImageInfo();
                datasetImageInfo.Name = "影像数据集信息";
                datasetImageInfo.BlockSizeOption = originDataset.BlockSizeOption;
                datasetImageInfo.Height = originDataset.Height;
                datasetImageInfo.Width = originDataset.Width;
                datasetImageInfo.EncodeType = originDataset.EncodeType;
                datasetImageInfo.BandCount = originDataset.BandCount;
                datasetImageInfo.PixelFormat = originDataset.GetPixelFormat(0);
 
                // 通过影像数据集信息创建影像数据集
                DatasetImage datasetImage = targetDs.Datasets.Create(datasetImageInfo);
                datasetImage.PrjCoordSys = new PrjCoordSys(4490);
                // 对四至点执行坐标转换 获得目标坐标系的四至
                if (CoordSysTranslator.Convert(point2Ds, originDataset.PrjCoordSys, new PrjCoordSys(4490), new CoordSysTransParameter(), new CoordSysTransMethod()))
                {
                    datasetImage.SetGeoReference(new Rectangle2D(point2Ds[0], point2Ds[1]));
                }
                // 进行每个像素点的赋值
                    int w, h, b;
                    int bandCount = originDataset.BandCount;

                    for (b = 0; b < bandCount; b++)
                    {
                        datasetImage[b] = originDataset[b];
                        datasetImage.SetPalette(originDataset.GetPalette(b), b);
                        datasetImage.SetNoData(originDataset.GetNoData(b), b);

                        for (w = 0; w < width; w++)
                        {
                            for (h = 0; h < height; h++)
                            {
                                datasetImage.SetValue(w, h, originDataset.GetValue(w, h, b), b);

                            }
                        }
                    } 

1个回答

您好,正确投影转换方式就是CoordSysTranslator.Convert。

您现在没有用该接口,使用这套“手动”转换的流程的应用需求和目的是什么呢?
10,758EXP 2021年11月08日
因为CoordSysTranslator.Convert 是对于一整个影像数据集的,而且只能生成到另一个影像数据集,如果目标坐标系的数据集实际上是不需要的,只需要其中一小部分数据而已

目的就是能够实现将一个影像数据集按某一个范围进行支持多坐标系的导出
还有我想问下, 这样导入一个影像数据集特别慢,但我看 Datasets.Copy那里执行就很快,是有什么地方疏漏了还是有没开放的接口呢?
这个需求的话肯定是先将数据集分解成多个数据集,对各数据集进行需要的坐标转换。

dataset.copy是复制数据集,复制完的数据集如果需要改变坐标同样需要使用 CoordSysTranslator.Convert 来进行投影转换的。

您这边说时间长的问题,建议您进行下性能断点诊断,分析下您具体哪行代码用的方法,那些代码逻辑结构耗时长来进行优化。
...