crazyjack
路人甲
路人甲
  • 注册日期2004-12-16
  • 发帖数2
  • QQ
  • 铜币116枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1089回复:1

Tin转Raster的问题,现贴出函数望大侠指错,不胜感激

楼主#
更多 发布于:2006-07-04 11:40
<P>向各为大侠请教一下Tin转Raster的问题,下面是我用C#写的函数,转出来的Raster高程值不知为何老是范围巨大无比,完全是错误的,哎```希望有大侠能给我指出错误所在,不胜感激。</P>
<P>public void TintoRaster(ITinAdvanced ipT)<BR>  {<BR>      IGeoDataset pInTin = (IGeoDataset)ipT;<BR>   IEnvelope pExtent;<BR>            pExtent = pInTin.Extent;</P>
<P>   IPoint pOrigin;<BR>            pOrigin = pExtent.LowerLeft;<BR>   double x,y;<BR>            x = pOrigin.X;<BR>   y = pOrigin.Y;<BR>            pOrigin.X = x - edit_viewshedCellsize * 0.5;<BR>            pOrigin.Y = y - edit_viewshedCellsize * 0.5;</P>
<P>   int nCol,nRow;<BR>   double width,height;<BR>   width = pExtent.Width;<BR>   height = pExtent.Height;<BR>   nCol = (int)Math.Round((width / edit_viewshedCellsize) + 1);<BR>   nRow = (int)Math.Round((height / edit_viewshedCellsize) + 1);</P>
<P>   ISpatialReference2 pSR;<BR>   pSR = (ISpatialReference2)pInTin.SpatialReference;</P>
<P>   IRasterDataset pRDS;<BR>   IWorkspaceFactory rWksFac = new RasterWorkspaceFactoryClass();<BR>   IWorkspace wks;<BR>   wks = rWksFac.OpenFromFile(m_OutputPath,0);</P>
<P>   IRasterWorkspace2 rWks = (IRasterWorkspace2)wks;</P>
<P>   int numbands = 1;<BR>   //try<BR>   //{<BR>   pRDS = rWks.CreateRasterDataset("tempTtoR","GRID",pOrigin,nCol,nRow,edit_viewshedCellsize,edit_viewshedCellsize,numbands,rstPixelType.PT_LONG,pSR,true);<BR>   //}<BR>   //catch<BR>   //{<BR>       //return;<BR>   //}</P>
<P>   //下面是调用GetRawPixels函数<BR>   IRasterBandCollection pBandCollection = (IRasterBandCollection)pRDS;<BR>   IRasterBand pRasterBand;<BR>            pRasterBand = pBandCollection.Item(0);<BR>   IRawPixels pRawPixels = (IRawPixels)pRasterBand;</P>
<P>   object pCache;<BR>   pCache = pRawPixels.AcquireCache();</P>
<P>   ITinSurface pTinSurf = (ITinSurface)ipT;<BR>   IRasterProps pRasterProps = (IRasterProps)pRawPixels;</P>
<P>   object nodataInt;<BR>   nodataInt = pRasterProps.NoDataValue;</P>
<P>//   object nodataFloat;<BR>//   double dZMin;<BR>//   dZMin = pExtent.ZMin;<BR>//   float a;<BR>//   a = (float)(dZMin - 1);<BR>//            nodataFloat = (object)a;<BR>//            pRasterProps.NoDataValue = nodataFloat;</P>
<P>   int mxblk_x = 2048;<BR>   int mxblk_y = 2048;</P>
<P>   if(nCol < mxblk_x) mxblk_x = nCol;<BR>   if(nRow < mxblk_y) mxblk_y = nRow;</P>
<P>   IPnt pBlockSize = new DblPntClass();<BR>   IPnt pOffset = new DblPntClass();<BR>            pBlockSize.X = mxblk_x;<BR>   pBlockSize.Y = mxblk_y;</P>
<P>   IPixelBlock3 pPixelBlock;<BR>            pPixelBlock = (IPixelBlock3)pRawPixels.CreatePixelBlock(pBlockSize);<BR>            <BR>   object blockArray;<BR>   //blockArray = pPixelBlock.get_SafeArray(0);<BR>   blockArray = pPixelBlock.get_PixelDataByRef(0);<BR>   <BR>            IPoint blkOrigin = new PointClass();<BR>   int iRowOffset;<BR>   int iColOffset;<BR>   <BR>   for(iRowOffset = 0;iRowOffset < nRow;iRowOffset += mxblk_y)<BR>   {<BR>    for(iColOffset = 0;iColOffset < nCol;iColOffset += mxblk_x)<BR>    {<BR>     if((nCol - iColOffset) < mxblk_x)<BR>     {<BR>         pBlockSize.X = nCol - iColOffset;<BR>                        pPixelBlock = (IPixelBlock3)pRawPixels.CreatePixelBlock(pBlockSize);<BR>      blockArray = pPixelBlock.get_PixelDataByRef(0);<BR>     }<BR>                    blkOrigin.X = pOrigin.X + iColOffset * edit_viewshedCellsize + edit_viewshedCellsize * 0.5;<BR>                    blkOrigin.Y = pOrigin.Y + (nRow - iRowOffset) * edit_viewshedCellsize - edit_viewshedCellsize * 0.5;<BR>                    pTinSurf.QueryPixelBlock(blkOrigin.X,blkOrigin.Y,edit_viewshedCellsize,edit_viewshedCellsize,esriRasterizationType.esriElevationAsRaster,nodataInt,blockArray);<BR>                    pOffset.X = iColOffset;<BR>                    pOffset.Y = iRowOffset;<BR>                    pRawPixels.Write(pOffset,(IPixelBlock)pPixelBlock);<BR>    }<BR>    bool reset = false;<BR>    if(pBlockSize.X != mxblk_x)<BR>    {<BR>        pBlockSize.X = mxblk_x;<BR>     reset = true;<BR>    }<BR>    if((nRow - iRowOffset) < mxblk_y)<BR>    {<BR>        pBlockSize.Y = nRow - iRowOffset;<BR>                    reset = true;<BR>    }<BR>    if(reset)<BR>    {<BR>     pPixelBlock = (IPixelBlock3)pRawPixels.CreatePixelBlock(pBlockSize);<BR>     blockArray = pPixelBlock.get_PixelDataByRef(0);<BR>    }<BR>   }<BR>   //x = pOrigin.X;<BR>   //y = pOrigin.Y;<BR>            //pOrigin.X = x + edit_viewshedCellsize * 0.5;<BR>            //pOrigin.Y = y + edit_viewshedCellsize * nRow - edit_viewshedCellsize * 0.5;</P>
<P>   //x = pOrigin.X;<BR>   //y = pOrigin.Y;<BR>            //pTinSurf.QueryPixelBlock(x,y,edit_viewshedCellsize,edit_viewshedCellsize,esriRasterizationType.esriElevationAsRaster,nodataFloat,val);</P>
<P>   //IPnt pOffset = new DblPntClass();<BR>            //pOffset.X = 0;<BR>   //pOffset.Y = 0;<BR>            //pRawPixels.Write(pOffset,pPixelBlock);<BR>            pRawPixels.ReturnCache(pCache);<BR>   pCache = null;</P>
<P> <BR>  }<BR></P>
喜欢0 评分0
yuduyue
路人甲
路人甲
  • 注册日期2004-07-08
  • 发帖数11
  • QQ101
  • 铜币222枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2007-03-26 14:03
<P>有没有结果阿,那个巨大的value的应该是double float的值,可能根本就没有得到像素值吧</P>
asdfdf
举报 回复(0) 喜欢(0)     评分
游客

返回顶部