栅格数据设置像元大小遇到的问题 求解啊!!!
需求:
过程:
1.DEM数据(1:1万DEM 2米格网)进行投影转换到2000坐标系,
2.然后再另存出去,另存的像元的大小为0.00002度,另存的栅格数据起点坐标为:
x=Xmin+0.00001 (保留5位小数)
y=Ymin+0.00001 (保留5位小数)
3.DEM数据用矢量数据裁切
最终期望实现的目标:
要求DEM投影转换成2000坐标系,然后根据标准的格网进行裁切,最终的DEM数据的Extent范围进度都是5位小数
(即上下左右都是五位小数)
问题:
①设置cellsize后输出的数据结果不对(具体如截图1所示)
②我用代码实现1、2步骤之后的栅格数据范围的精度就不是五位小数,而是好多位,我希望小数保留5位其它位都是00000。(具体如截图2所示)
截图1
截图2
我的代码如下:
1.投影转换代码:
Guid guid = Guid.NewGuid();
if (!System.IO.Directory.Exists(m_sTempPath))
{
System.IO.Directory.CreateDirectory(m_sTempPath);
}
string strTempPath = System.IO.Path.Combine(m_sTempPath, guid.ToString() + ".tif");
//创建投影变换
IRasterDataset2 inPutRasterDataset = PS.Plot.Common.EngineAPI.OpenRasterFile(demFile.FullName) as IRasterDataset2;
IRaster2 pRaster = inPutRasterDataset.CreateDefaultRaster() as IRaster2;
IRasterProps pRasterProps = (IRasterProps)pRaster;
pRasterProps.SpatialReference = geographicCoordinateSystem;
ISpatialReference pSpatialReference = (inPutRasterDataset as IGeoDataset).SpatialReference;
Type factoryType = Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment");
System.Object obj = Activator.CreateInstance(factoryType);
ISpatialReferenceFactory2 pSRF = obj as ISpatialReferenceFactory2;
ICoordinateFrameTransformation pCFT = new CoordinateFrameTransformationClass();
pCFT.PutParameters(0, 0, 0, 0, 0, 0, 1);
pCFT.PutSpatialReferences(pSpatialReference, geographicCoordinateSystem);
pCFT.Name = "DemSpatialRef_TO_2000";
IGeoTransformationOperationSet pGTSet = pSRF.GeoTransformationDefaults;
pGTSet.Set(esriTransformDirection.esriTransformForward, pCFT);
pGTSet.Set(esriTransformDirection.esriTransformReverse, pCFT);
//栅格数据投影转换
pRaster.GeoTransformations = pGTSet;
2.设置起止点 另存栅格数据
ISaveAs2 pSaveAs = (ISaveAs2)pRaster;
IRasterStorageDef rasterStorageDef = new RasterStorageDefClass();
IRasterStorageDef2 rasterStorageDef2 = (IRasterStorageDef2)rasterStorageDef;
IPnt pnt = new PntClass();
pnt.SetCoords(0.00002, 0.00002); //这步不知道为什么输出的数据格网大小不是0.00002?
rasterStorageDef2.CellSize = pnt;
rasterStorageDef2.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation;
//设置起止点
IPoint pPoint = new Point();
pPoint.X = Math.Round(pRasterProps.Extent.XMin + 0.00001, 5);
pPoint.Y = Math.Round(pRasterProps.Extent.YMin + 0.00001, 5);
pPoint.SpatialReference = pRasterProps.SpatialReference;
rasterStorageDef2.Origin = pPoint;
pSaveAs.SaveAsRasterDataset(strTempPath, null, "TIFF", rasterStorageDef2);
3.调用GP进行裁切如上所示的结果
这块请教了慕晓燕大神,她提供的思路是将裁切范围的精度都设置成5位小数,然后进行掩膜提取,测试了一下X方向可以,Y方向还是有问题
注:任何帮助都不胜感激 看不明白的我再补充
过程:
1.DEM数据(1:1万DEM 2米格网)进行投影转换到2000坐标系,
2.然后再另存出去,另存的像元的大小为0.00002度,另存的栅格数据起点坐标为:
x=Xmin+0.00001 (保留5位小数)
y=Ymin+0.00001 (保留5位小数)
3.DEM数据用矢量数据裁切
最终期望实现的目标:
要求DEM投影转换成2000坐标系,然后根据标准的格网进行裁切,最终的DEM数据的Extent范围进度都是5位小数
(即上下左右都是五位小数)
问题:
①设置cellsize后输出的数据结果不对(具体如截图1所示)
②我用代码实现1、2步骤之后的栅格数据范围的精度就不是五位小数,而是好多位,我希望小数保留5位其它位都是00000。(具体如截图2所示)
截图1
截图2
我的代码如下:
1.投影转换代码:
Guid guid = Guid.NewGuid();
if (!System.IO.Directory.Exists(m_sTempPath))
{
System.IO.Directory.CreateDirectory(m_sTempPath);
}
string strTempPath = System.IO.Path.Combine(m_sTempPath, guid.ToString() + ".tif");
//创建投影变换
IRasterDataset2 inPutRasterDataset = PS.Plot.Common.EngineAPI.OpenRasterFile(demFile.FullName) as IRasterDataset2;
IRaster2 pRaster = inPutRasterDataset.CreateDefaultRaster() as IRaster2;
IRasterProps pRasterProps = (IRasterProps)pRaster;
pRasterProps.SpatialReference = geographicCoordinateSystem;
ISpatialReference pSpatialReference = (inPutRasterDataset as IGeoDataset).SpatialReference;
Type factoryType = Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment");
System.Object obj = Activator.CreateInstance(factoryType);
ISpatialReferenceFactory2 pSRF = obj as ISpatialReferenceFactory2;
ICoordinateFrameTransformation pCFT = new CoordinateFrameTransformationClass();
pCFT.PutParameters(0, 0, 0, 0, 0, 0, 1);
pCFT.PutSpatialReferences(pSpatialReference, geographicCoordinateSystem);
pCFT.Name = "DemSpatialRef_TO_2000";
IGeoTransformationOperationSet pGTSet = pSRF.GeoTransformationDefaults;
pGTSet.Set(esriTransformDirection.esriTransformForward, pCFT);
pGTSet.Set(esriTransformDirection.esriTransformReverse, pCFT);
//栅格数据投影转换
pRaster.GeoTransformations = pGTSet;
2.设置起止点 另存栅格数据
ISaveAs2 pSaveAs = (ISaveAs2)pRaster;
IRasterStorageDef rasterStorageDef = new RasterStorageDefClass();
IRasterStorageDef2 rasterStorageDef2 = (IRasterStorageDef2)rasterStorageDef;
IPnt pnt = new PntClass();
pnt.SetCoords(0.00002, 0.00002); //这步不知道为什么输出的数据格网大小不是0.00002?
rasterStorageDef2.CellSize = pnt;
rasterStorageDef2.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation;
//设置起止点
IPoint pPoint = new Point();
pPoint.X = Math.Round(pRasterProps.Extent.XMin + 0.00001, 5);
pPoint.Y = Math.Round(pRasterProps.Extent.YMin + 0.00001, 5);
pPoint.SpatialReference = pRasterProps.SpatialReference;
rasterStorageDef2.Origin = pPoint;
pSaveAs.SaveAsRasterDataset(strTempPath, null, "TIFF", rasterStorageDef2);
3.调用GP进行裁切如上所示的结果
这块请教了慕晓燕大神,她提供的思路是将裁切范围的精度都设置成5位小数,然后进行掩膜提取,测试了一下X方向可以,Y方向还是有问题
注:任何帮助都不胜感激 看不明白的我再补充
1 个回复
杨欢
赞同来自:
要回复问题请先登录或注册