阅读:1089回复:1
Tin转Raster的问题,现贴出函数望大侠指错,不胜感激
<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> |
|
1楼#
发布于:2007-03-26 14:03
<P>有没有结果阿,那个巨大的value的应该是double float的值,可能根本就没有得到像素值吧</P>
|
|
|