//行列号的三维坐标 public bool GetGeoXYZ(IRaster pRaster, double[,] dbData, Pt2i ptLeftTop, int nH, int nW, ref Pt3d ptXYZ) { ptXYZ = null; if (pRaster == null) { return(false); } IRasterProps pProps = pRaster as IRasterProps; IRaster2 pRaster2 = pRaster as IRaster2; //if( ( m_pGdalData == NULL )||( m_pGdalData->m_bIsGeoFile != true) ) //{ // return false; //} //CmlGeoRaster* pGeoRaster = (CmlGeoRaster*)m_pGdalData; ptXYZ = new Pt3d(); ptXYZ.X = pRaster2.ToMapX(nW); //m_nXOffSet + nW)*pGeoRaster->m_dXResolution + pGeoRaster->m_PtOrigin.X ; ptXYZ.Y = pRaster2.ToMapY(nH); // + nH)*pGeoRaster->m_dYResolution + pGeoRaster->m_PtOrigin.Y ; //pProps.NoDataValue.GetType(); double dbNoDataValue = getNoDataValue(pProps.NoDataValue);//Convert.ToDouble(((object[])pProps.NoDataValue)[0]); if ((true == GetDoubleVal(pRaster, dbData, ptLeftTop, nH, nW, ref ptXYZ.Z)) && (Math.Abs(ptXYZ.Z - dbNoDataValue) != 0)) { return(true); } else { return(false); } }
public bool GetDoubleVal(IRaster pRaster, double[,] dbData, Pt2i ptLeftTop, int nH, int nW, ref double dVal) { IRasterProps pProps = pRaster as IRasterProps; int nHeight = pProps.Height; int nWidth = pProps.Width; dVal = double.NaN; if ((nH >= nHeight) || (nW >= nWidth)) { return(false); } //相对坐标 nW -= ptLeftTop.X; nH -= ptLeftTop.Y; int nSubWidth = dbData.GetLength(0); int nSubHeight = dbData.GetLength(1); if (nW < 0 || nW >= nSubWidth || nH < 0 || nH >= nSubHeight) { return(false); } dVal = dbData[nW, nH]; //IRasterBandCollection pBandCollection=pRaster as IRasterBandCollection; //IRasterBand pBand=pBandCollection.Item(0); //IRaster2 pRaster2 = pRaster as IRaster2; //dVal = Convert.ToDouble(pRaster2.GetPixelValue(0, nW, nH)); return(true); }
private Pt2d getProjectBackwardPoint(IPoint pGeoCoords, IRaster pDemRaster, ClsGetCameraView pGetCameraView, Matrix pRotateMatrix, ClsCameraPara cameraPara) { Pt3d ptFeaturePoint = new Pt3d(); ptFeaturePoint.X = pGeoCoords.X; ptFeaturePoint.Y = pGeoCoords.Y; //从DEM上得到相应高程 IRasterProps pDemRasterProps = pDemRaster as IRasterProps; double nGeoRange = pDemRasterProps.MeanCellSize().X * 10; Pt2i ptLeftTop = new Pt2i(); double[,] dbSubData = pGetCameraView.getSubDem(pDemRaster, ptFeaturePoint, nGeoRange, ref ptLeftTop); if (dbSubData == null) { return(null); } if (pGetCameraView.GetGeoZ(pDemRaster, dbSubData, ptLeftTop, ptFeaturePoint.X, ptFeaturePoint.Y, ref ptFeaturePoint.Z)) { Pt2d pt2d = new Pt2d(); double dbX, dbY, dbZ; Pt3d ptCurrentFeaturePoint = ptFeaturePoint; //判断是否在视场前方 if (!IsInCameraFrontArea(ptCurrentFeaturePoint, pRotateMatrix, cameraPara)) { return(null); } dbX = pRotateMatrix.getNum(0, 0) * (ptCurrentFeaturePoint.X - cameraPara.dX) + pRotateMatrix.getNum(1, 0) * (ptCurrentFeaturePoint.Y - cameraPara.dY) + pRotateMatrix.getNum(2, 0) * (ptCurrentFeaturePoint.Z - cameraPara.dZ); dbY = pRotateMatrix.getNum(0, 1) * (ptCurrentFeaturePoint.X - cameraPara.dX) + pRotateMatrix.getNum(1, 1) * (ptCurrentFeaturePoint.Y - cameraPara.dY) + pRotateMatrix.getNum(2, 1) * (ptCurrentFeaturePoint.Z - cameraPara.dZ); dbZ = pRotateMatrix.getNum(0, 2) * (ptCurrentFeaturePoint.X - cameraPara.dX) + pRotateMatrix.getNum(1, 2) * (ptCurrentFeaturePoint.Y - cameraPara.dY) + pRotateMatrix.getNum(2, 2) * (ptCurrentFeaturePoint.Z - cameraPara.dZ); Pt2d ptImageTmp = new Pt2d(); ptImageTmp.X = (int)Math.Round(-cameraPara.dFocus * dbX / dbZ); ptImageTmp.Y = (int)Math.Round(-cameraPara.dFocus * dbY / dbZ); //ptImageTmp.Y *= -1; //像主点坐标系===>笛卡尔坐标系(以东为X,以北为Y) ptImageTmp.X += cameraPara.dPx; ptImageTmp.Y += (-1 * cameraPara.dPy); //ptImageTmp.Y *= -1; //arcgis显示时把左上角放于原点 //ptImageTmp.Y -= cameraPara.nH; return(ptImageTmp); } return(null); }
//当前地理位置的高程 public bool GetGeoZ(IRaster pRaster, double[,] dbData, Pt2i ptLeftTop, double dX, double dY, ref double dZ) { dZ = double.NaN; if (pRaster == null) { return(false); } IRaster2 pRaster2 = pRaster as IRaster2; double dXCoord = pRaster2.ToPixelColumn(dX); // dX - pGeoRaster->m_PtOrigin.X ) / pGeoRaster->m_dXResolution ; double dYCoord = pRaster2.ToPixelRow(dY); // dY - pGeoRaster->m_PtOrigin.Y ) / pGeoRaster->m_dYResolution ; IRasterProps pProps = pRaster as IRasterProps; int nWidth = pProps.Width; int nHeight = pProps.Height; if ((dXCoord < 0) || (dXCoord > (nWidth - 1)) || (dYCoord < 0) || (dYCoord > (nHeight - 1))) { return(false); } Pt2i ptLT = new Pt2i(); Pt2i ptRT = new Pt2i(); Pt2i ptLB = new Pt2i(); Pt2i ptRB = new Pt2i(); ptLT.X = (int)Math.Floor(dXCoord); ptLT.Y = (int)Math.Floor(dYCoord); ptRT.X = ptLT.X + 1; ptRT.Y = ptLT.Y; ptLB.X = ptLT.X; ptLB.Y = ptLT.Y + 1; ptRB.X = ptRT.X; ptRB.Y = ptLB.Y; Pt3d ptZLT = new Pt3d(); Pt3d ptZRT = new Pt3d(); Pt3d ptZLB = new Pt3d(); Pt3d ptZRB = new Pt3d(); if (GetGeoXYZ(pRaster, dbData, ptLeftTop, ptLT.Y, ptLT.X, ref ptZLT) && GetGeoXYZ(pRaster, dbData, ptLeftTop, ptRT.Y, ptRT.X, ref ptZRT) && GetGeoXYZ(pRaster, dbData, ptLeftTop, ptLB.Y, ptLB.X, ref ptZLB) && GetGeoXYZ(pRaster, dbData, ptLeftTop, ptRB.Y, ptRB.X, ref ptZRB)) { dZ = (ptRB.X - dXCoord) * (ptRB.Y - dYCoord) * ptZLT.Z + (dXCoord - ptLT.X) * (ptRB.Y - dYCoord) * ptZRT.Z + (ptRB.X - dXCoord) * (dYCoord - ptLT.Y) * ptZLB.Z + (dXCoord - ptLT.X) * (dYCoord - ptLT.Y) * ptZRB.Z; return(true); } else { return(false); } }
public void calImagePos(IRaster pRaster, Pt2d[] ptGeoPos, string szXmlFile, out Pt2d[] ptImagePos) { ptImagePos = null; if (pRaster == null) { return; } try { ClsCameraPara cameraPara = ParseXmlFileToGetPara(szXmlFile); if (cameraPara == null) { return; } ClsGetCameraView getCameraView = new ClsGetCameraView(); Pt2i ptLeftTop = new Pt2i(); IRasterProps pProps = pRaster as IRasterProps; int nWidth = pProps.Width; int nHeight = pProps.Height; double[,] dbData = new double[nWidth, nHeight]; Point2D ptTmpLeftTop = new Point2D(); ptTmpLeftTop.X = 0; ptTmpLeftTop.Y = 0; if (!getCameraView.readBlockDataToFile(ptTmpLeftTop, ref dbData, pRaster)) { return; } //double[,] dbData = getCameraView.getSubDem(pRaster, new Pt3d(), 0, ref ptLeftTop); int nCount = ptGeoPos.Length; ptImagePos = new Pt2d[nCount]; for (int i = 0; i < nCount; i++) { Pt2d pt2d = new Pt2d(); OriAngle oriAngle = new OriAngle(); oriAngle.kap = cameraPara.dKappa; oriAngle.omg = cameraPara.dOmg; oriAngle.phi = cameraPara.dPhi; Matrix pRMat = new Matrix(3, 3); ClsGetCameraView.OPK2RMat(oriAngle, ref pRMat); double dbTmpZ = double.NaN; getCameraView.GetGeoZ(pRaster, dbData, ptLeftTop, ptGeoPos[i].X, ptGeoPos[i].Y, ref dbTmpZ); if (dbTmpZ == double.NaN) { ptImagePos[i] = null; continue; } double dbX, dbY, dbZ; dbX = pRMat.getNum(0, 0) * (ptGeoPos[i].X - cameraPara.dX) + pRMat.getNum(1, 0) * (ptGeoPos[i].Y - cameraPara.dY) + pRMat.getNum(2, 0) * (dbTmpZ - cameraPara.dZ); dbY = pRMat.getNum(0, 1) * (ptGeoPos[i].X - cameraPara.dX) + pRMat.getNum(1, 1) * (ptGeoPos[i].Y - cameraPara.dY) + pRMat.getNum(2, 1) * (dbTmpZ - cameraPara.dZ); dbZ = pRMat.getNum(0, 2) * (ptGeoPos[i].X - cameraPara.dX) + pRMat.getNum(1, 2) * (ptGeoPos[i].Y - cameraPara.dY) + pRMat.getNum(2, 2) * (dbTmpZ - cameraPara.dZ); Pt2d ptImageTmp = new Pt2d(); ptImageTmp.X = (int)Math.Round(-cameraPara.dFocus * dbX / dbZ); ptImageTmp.Y = (int)Math.Round(-cameraPara.dFocus * dbY / dbZ); ptImagePos[i] = ptImageTmp; } return; } catch (System.Exception ee) { MessageBox.Show(ee.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } }
public bool ImageReprojectionRange(IRaster pSrcRaster, out Point2D[,] ptResult, ExOriPara exori, InOriPara pInOri, int nGeoRange) { double dbFocus = pInOri.df; double fx = pInOri.dfx; double fy = pInOri.dfy; int nImgWidth = pInOri.nW; int nImgHeight = pInOri.nH; ptResult = null; Pt2i ptSubImgLeftTop = new Pt2i(); double[,] dbSubDemData = getSubDem(pSrcRaster, exori.pos, nGeoRange, ref ptSubImgLeftTop); if (dbSubDemData == null) { return(false); } IRasterProps pProps = pSrcRaster as IRasterProps; int nDemHeight = pProps.Height; int nDemWidth = pProps.Width; IRaster2 pRaster2 = pSrcRaster as IRaster2; double dbNoDataValue = getNoDataValue(pProps.NoDataValue); //object pNodata = pProps.NoDataValue; //double value=((double[])pNodata)[0]; //double dbNoDataValue =double.Parse((float[]pNodata)[0].ToString()); //double dbNoDataValue = Convert.ToDouble(((double[]))[0]); //object dbNoDataValue = Convert.ToDouble(pProps.NoDataValue.ToString()); //object nodatavalue = pProps.NoDataValue; //Type type=pProps.NoDataValue.GetType(); //double dbNoDataValue = type.IsArray ? nodatavalue[0] as double : nodatavalue as double; //初始步长 double dbInitialStep = 0; int nGridW = nDemWidth / 10; int nGridH = nDemHeight / 10; int nCount = 0; double dbHeightAvg = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { double dDemZ = double.NaN; double dbGeoX = pRaster2.ToMapX(i * nGridW); double dbGeoY = pRaster2.ToMapY(j * nGridH); if (GetGeoZ(pSrcRaster, dbSubDemData, ptSubImgLeftTop, dbGeoX, dbGeoY, ref dDemZ) && Math.Abs(dDemZ - dbNoDataValue) >= 10e-10) { nCount++; dbHeightAvg += dDemZ; } } } if (nCount != 0) { dbHeightAvg /= nCount; } double dbCurCameraZ = 0; //IRaster2 pRaster2 = pSrcRaster as IRaster2; //int nCameraImgX = pRaster2.ToPixelColumn(exori.pos.X);//dXCumulate - pDem.m_PtOrigin.X) / dXRdem; //int nCameraImgY = pRaster2.ToPixelRow(exori.pos.Y); // (dYCumulate - pDem.m_PtOrigin.Y) / dYRdem; //if (nCameraImgY >= 0 || nCameraImgY < nDemHeight || nCameraImgX >= 0 || nCameraImgX < nDemWidth) //{ if (GetGeoZ(pSrcRaster, dbSubDemData, ptSubImgLeftTop, exori.pos.X, exori.pos.Y, ref dbCurCameraZ) && Math.Abs(dbCurCameraZ - dbNoDataValue) >= 10e-10) { dbHeightAvg = dbCurCameraZ; } //} dbInitialStep = Math.Abs(dbHeightAvg - exori.pos.Z) / 2; Point2D ptLeftTop = new Point2D(0, 0); double[] dbResolution = new double[2]; dbResolution[0] = pProps.MeanCellSize().X; dbResolution[1] = pProps.MeanCellSize().Y; int[] nSize = new int[2]; nSize[0] = nDemWidth; nSize[1] = nDemHeight; //pDstRaster = CreateRaster(ptLeftTop, dbResolution, nSize); //pDstRaster = createRasterWithoutData(ptLeftTop, dbResolution[0], nSize, "testOutput.tif"); // byte[,] dbData = new byte[nDemWidth, nDemHeight]; //double demGrayVal=double.NaN; //Pt3d demXYZ; //byte byteGray; //byte bt = (byte)255; //Pt2d pt; Matrix matA, matB; matA = new Matrix(2, 2); matB = new Matrix(2, 1); Matrix matR; matR = new Matrix(3, 3); //Matrix matX; double[] a = new double[4]; double[] b = new double[2]; OPK2RMat(exori.ori, ref matR); //求解相关系数 double a1 = matR.getNum(0, 0); double a2 = matR.getNum(0, 1); double a3 = matR.getNum(0, 2); double b1 = matR.getNum(1, 0); double b2 = matR.getNum(1, 1); double b3 = matR.getNum(1, 2); double c1 = matR.getNum(2, 0); double c2 = matR.getNum(2, 1); double c3 = matR.getNum(2, 2); double[] dbCoef = new double[] { a1, a2, a3, b1, b2, b3, c1, c2, c3 }; //double X, Y, Z, Z1; // Z = 0.0; //double dthreshold = 0.01; //for (int i = 0; i < nDemWidth; i++) //{ // for (int j = 0; j < nDemHeight; j++) // { // dbData[i, j] = bt; // } //} ptResult = new Point2D[2, nImgWidth]; int nSearchStep = 50; for (int j = 0; j < nImgWidth + nSearchStep - 1; j += nSearchStep) { if (j >= nImgWidth) { j = nImgWidth - 1; } //最下面的点 Point2D ptBottom = null, ptTop = null; Point2D ptLastTime = null; if (getPixelIsCoverd(pSrcRaster, dbSubDemData, ptSubImgLeftTop, j, nImgHeight - 1, out ptBottom, exori, dbCoef, dbFocus, fx, fy, dbInitialStep)) { int nposy = 0; int nStep = nImgHeight - 1; while (nStep > 1 && nposy >= 0 && nposy < nImgHeight) { nStep /= 2; if (getPixelIsCoverd(pSrcRaster, dbSubDemData, ptSubImgLeftTop, j, nposy, out ptTop, exori, dbCoef, dbFocus, fx, fy, dbInitialStep)) { if (ptLastTime == null) { ptLastTime = new Point2D(); } ptLastTime.X = ptTop.X; ptLastTime.Y = ptTop.Y; nposy -= nStep; } else { nposy += nStep; } } } //加入链表 ptResult[0, j] = ptLastTime; ptResult[1, j] = ptBottom; } //write block data //if (!WriteToRaster(pDstRaster, dbData, ptLeftTop)) // return false; //if (!writeBlockDataToFile(ptLeftTop, dbData, nSize, pDstRaster)) // return false; return(true); }
//计算某个像素点是否可见,只适用于东北天坐标,即Z轴向上 private bool getPixelIsCoverd(IRaster pRaster, double[,] dbSubDemData, Pt2i ptSubImgLeftTop, int posx, int posy, out Point2D ptGeoCovered, ExOriPara exOriPara, double[] dbCoef, double dbFocus, double fx, double fy, double dbInitialStep) { ptGeoCovered = null; if (pRaster == null) { return(false); } bool bFlag = false; IRasterProps pProps = pRaster as IRasterProps; int nDemHeight = pProps.Height; int nDemWidth = pProps.Width; double dbNoDataValue = getNoDataValue(pProps.NoDataValue);// Convert.ToDouble(((object[])pProps.NoDataValue)[0]); double xPix, yPix; xPix = posx - fx; // nImgWidth / 2; //行列号转摄影测量像平面坐标 yPix = fy - posy; //nImgHeight / 2 double dVecX = dbCoef[0] * xPix + dbCoef[1] * yPix - dbCoef[2] * dbFocus; double dVecY = dbCoef[3] * xPix + dbCoef[4] * yPix - dbCoef[5] * dbFocus; double dVecZ = dbCoef[6] * xPix + dbCoef[7] * yPix - dbCoef[8] * dbFocus; double dVecDis = Math.Sqrt(dVecX * dVecX + dVecY * dVecY + dVecZ * dVecZ); double dRatioX = dVecX / dVecDis; double dRatioY = dVecY / dVecDis; double dRatioZ = dVecZ / dVecDis; //迭代步长 double dDemZ = 0.0; double dXCumulate = exOriPara.pos.X; double dYCumulate = exOriPara.pos.Y; double dZCumulate = exOriPara.pos.Z; double dStep = dbInitialStep; int nDemW = 0; int nDemH = 0; #region int nIter = 0; while (true) { nIter++; #region 如果迭代次数太多,则取最后一次的结果,避免无限循环 if (nIter > 10000) { if (true == GetGeoZ(pRaster, dbSubDemData, ptSubImgLeftTop, dXCumulate, dYCumulate, ref dDemZ)) { ptGeoCovered = new Point2D(); ptGeoCovered.X = dXCumulate; ptGeoCovered.Y = dYCumulate; bFlag = true; } break; } #endregion #region 由于存在“回头探测”的现象,因此要判断是否已经过头,此判断仅适用于Z值朝上(东北天坐标)的DEM if ((dXCumulate - exOriPara.pos.X) / dRatioX < 0) { break; } #endregion //正常迭代 dXCumulate = dXCumulate + dStep * dRatioX; dYCumulate = dYCumulate + dStep * dRatioY; dZCumulate = dZCumulate + dStep * dRatioZ; IRaster2 pRaster2 = pRaster as IRaster2; nDemW = pRaster2.ToPixelColumn(dXCumulate); //dXCumulate - pDem.m_PtOrigin.X) / dXRdem; nDemH = pRaster2.ToPixelRow(dYCumulate); // (dYCumulate - pDem.m_PtOrigin.Y) / dYRdem; if (nDemH < 0 || nDemH >= nDemHeight || nDemW < 0 || nDemW >= nDemWidth) { break; } if (false == GetGeoZ(pRaster, dbSubDemData, ptSubImgLeftTop, dXCumulate, dYCumulate, ref dDemZ)) { continue; } if (Math.Abs(dDemZ - dbNoDataValue) <= 10e-10) { //“回头探测”时遇到无效值,认为可以终止 if (dStep < 0) { break; } else { continue; } } //if (Math.Abs(dDemZ - dbNoDataValue) < 1) //{ // continue; //} //double dZMinus = dDemZ - dZCumulate; double dZMinus = dZCumulate - dDemZ; //表示已经到了地形点上 if (Math.Abs(dZMinus) < 0.01) { if (true == GetGeoZ(pRaster, dbSubDemData, ptSubImgLeftTop, dXCumulate, dYCumulate, ref dDemZ)) { ptGeoCovered = new Point2D(); ptGeoCovered.X = dXCumulate; ptGeoCovered.Y = dYCumulate; bFlag = true; } break; } //表示已经穿过DEM,需要进行“回头探测” if (dZMinus < 0) { dStep = -Math.Abs(0.1 * dZMinus); } else { dStep = Math.Abs(dStep); } //if (Math.Abs(dZMinus) < 0.5) //{ // dStep = 0.3; //} //if (Math.Abs(dZMinus) < 0.2) //{ // dStep = 0.1; //} //if (Math.Abs(dZMinus) < 0.1) //{ // dStep = 0.03; //} //if (Math.Abs(dZMinus) < 0.05) //{ // if (false == GetGeoZ(pRaster, dbSubDemData, ptSubImgLeftTop, dXCumulate, dYCumulate, ref dDemZ)) // { // break; // } // ptGeoCovered = new Point2D(); // ptGeoCovered.X = dXCumulate; // ptGeoCovered.Y = dYCumulate; // bFlag = true; // break; //} } #endregion return(bFlag); }
public double[,] getSubDem(IRaster pSrcRaster, Pt3d ptCenter, double nGeoRange, ref Pt2i ptImageTopLeft) { //IRaster pDstRaster = null; if (pSrcRaster == null) { return(null); } IRasterProps pProps = pSrcRaster as IRasterProps; IEnvelope pEnvelop = pProps.Extent; Pt2d[] ptRange = new Pt2d[4]; for (int i = 0; i < 4; i++) { ptRange[i] = new Pt2d(); } ptRange[0].X = ptCenter.X - nGeoRange; //lefttop ptRange[0].X = Math.Max(ptRange[0].X, pEnvelop.UpperLeft.X); ptRange[0].Y = ptCenter.Y + nGeoRange; ptRange[0].Y = Math.Min(ptRange[0].Y, pEnvelop.UpperLeft.Y); ptRange[1].X = ptCenter.X + nGeoRange; //righttop ptRange[1].Y = ptCenter.Y + nGeoRange; ptRange[1].X = Math.Min(ptRange[1].X, pEnvelop.UpperRight.X); ptRange[1].Y = Math.Min(ptRange[1].Y, pEnvelop.UpperRight.Y); ptRange[2].X = ptCenter.X - nGeoRange; //leftbottom ptRange[2].Y = ptCenter.Y - nGeoRange; ptRange[2].X = Math.Max(ptRange[2].X, pEnvelop.LowerLeft.X); ptRange[2].Y = Math.Max(ptRange[2].Y, pEnvelop.LowerLeft.Y); ptRange[3].X = ptCenter.X + nGeoRange; //rightbottom ptRange[3].Y = ptCenter.Y - nGeoRange; ptRange[3].X = Math.Min(ptRange[3].X, pEnvelop.LowerRight.X); ptRange[3].Y = Math.Max(ptRange[3].Y, pEnvelop.LowerRight.Y); Pt2i[] ptImageRange = new Pt2i[4]; for (int i = 0; i < 4; i++) { ptImageRange[i] = new Pt2i(); } IRaster2 pRaster2 = pSrcRaster as IRaster2; ptImageRange[0].X = pRaster2.ToPixelColumn(ptRange[0].X); ptImageRange[0].Y = pRaster2.ToPixelRow(ptRange[0].Y); ptImageRange[1].X = pRaster2.ToPixelColumn(ptRange[1].X); ptImageRange[1].Y = pRaster2.ToPixelRow(ptRange[1].Y); ptImageRange[2].X = pRaster2.ToPixelColumn(ptRange[2].X); ptImageRange[2].Y = pRaster2.ToPixelRow(ptRange[2].Y); ptImageRange[3].X = pRaster2.ToPixelColumn(ptRange[3].X); ptImageRange[3].Y = pRaster2.ToPixelRow(ptRange[3].Y); ptImageTopLeft.X = Math.Min(Math.Min(Math.Min(ptImageRange[0].X, ptImageRange[1].X), ptImageRange[2].X), ptImageRange[3].X); ptImageTopLeft.Y = Math.Min(Math.Min(Math.Min(ptImageRange[0].Y, ptImageRange[1].Y), ptImageRange[2].Y), ptImageRange[3].Y); int[] nSize = new int[2]; nSize[0] = Math.Max(Math.Max(Math.Max(ptImageRange[0].X, ptImageRange[1].X), ptImageRange[2].X), ptImageRange[3].X) - ptImageTopLeft.X; nSize[1] = Math.Max(Math.Max(Math.Max(ptImageRange[0].Y, ptImageRange[1].Y), ptImageRange[2].Y), ptImageRange[3].Y) - ptImageTopLeft.Y; double[,] dbData = new double[nSize[0], nSize[1]]; Point2D ptLeftTop = new Point2D(); ptLeftTop.X = ptImageTopLeft.X; ptLeftTop.Y = ptImageTopLeft.Y; //double[,] dbData = new double[pProps.Width,pProps.Height]; //Point2D ptLeftTop = new Point2D(); //ptImageTopLeft.X = pRaster2.ToPixelColumn(pEnvelop.UpperLeft.X); //(int)pEnvelop.UpperLeft.X; //ptImageTopLeft.Y = pRaster2.ToPixelRow(pEnvelop.UpperLeft.Y); //(int)pEnvelop.UpperLeft.X;//(int)pEnvelop.UpperLeft.Y; //ptLeftTop.X = ptImageTopLeft.X;// pEnvelop.UpperLeft.X; //ptLeftTop.Y = ptImageTopLeft.Y;// pEnvelop.UpperLeft.Y; readBlockDataToFile(ptLeftTop, ref dbData, pSrcRaster); return(dbData); }
//逐点算法 public bool ImageReprojectionRange(IRaster pSrcRaster, out IRaster pDstRaster, ExOriPara exori, double dbFocus, double fx, double fy, int nImgWidth, int nImgHeight, int nGeoRange) { pDstRaster = null; Pt2i ptSubImgLeftTop = new Pt2i(); double[,] dbSubDemData = getSubDem(pSrcRaster, exori.pos, nGeoRange, ref ptSubImgLeftTop); if (dbSubDemData == null) { return(false); } IRasterProps pProps = pSrcRaster as IRasterProps; int nDemHeight = pProps.Height; int nDemWidth = pProps.Width; IRaster2 pRaster2 = pSrcRaster as IRaster2; double dbNoDataValue = getNoDataValue(pProps.NoDataValue); //object pNodata = pProps.NoDataValue; //double value=((double[])pNodata)[0]; //double dbNoDataValue =double.Parse((float[]pNodata)[0].ToString()); //double dbNoDataValue = Convert.ToDouble(((double[]))[0]); //object dbNoDataValue = Convert.ToDouble(pProps.NoDataValue.ToString()); //object nodatavalue = pProps.NoDataValue; //Type type=pProps.NoDataValue.GetType(); //double dbNoDataValue = type.IsArray ? nodatavalue[0] as double : nodatavalue as double; //初始步长 double dbInitialStep = 0; int nGridW = nDemWidth / 10; int nGridH = nDemHeight / 10; int nCount = 0; double dbHeightAvg = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { double dDemZ = double.NaN; double dbGeoX = pRaster2.ToMapX(i * nGridW); double dbGeoY = pRaster2.ToMapY(j * nGridH); if (GetGeoZ(pSrcRaster, dbSubDemData, ptSubImgLeftTop, dbGeoX, dbGeoY, ref dDemZ) && Math.Abs(dDemZ - dbNoDataValue) >= 10e-10) { nCount++; dbHeightAvg += dDemZ; } } } if (nCount != 0) { dbHeightAvg /= nCount; } else { return(false); } double dbCurCameraZ = 0; //IRaster2 pRaster2 = pSrcRaster as IRaster2; //int nCameraImgX = pRaster2.ToPixelColumn(exori.pos.X);//dXCumulate - pDem.m_PtOrigin.X) / dXRdem; //int nCameraImgY = pRaster2.ToPixelRow(exori.pos.Y); // (dYCumulate - pDem.m_PtOrigin.Y) / dYRdem; //if (nCameraImgY >= 0 || nCameraImgY < nDemHeight || nCameraImgX >= 0 || nCameraImgX < nDemWidth) //{ if (GetGeoZ(pSrcRaster, dbSubDemData, ptSubImgLeftTop, exori.pos.X, exori.pos.Y, ref dbCurCameraZ) && Math.Abs(dbCurCameraZ - dbNoDataValue) >= 10e-10) { dbHeightAvg = dbCurCameraZ; } //} dbInitialStep = Math.Abs(dbHeightAvg - exori.pos.Z) / 2; Point2D ptLeftTop = new Point2D(0, 0); double[] dbResolution = new double[2]; dbResolution[0] = pProps.MeanCellSize().X; dbResolution[1] = pProps.MeanCellSize().Y; int[] nSize = new int[2]; nSize[0] = nDemWidth; nSize[1] = nDemHeight; //pDstRaster = CreateRaster(ptLeftTop, dbResolution, nSize); //pDstRaster = createRasterWithoutData(ptLeftTop, dbResolution[0], nSize, "testOutput.tif"); // byte[,] dbData = new byte[nDemWidth, nDemHeight]; //double demGrayVal=double.NaN; //Pt3d demXYZ; //byte byteGray; //byte bt = (byte)255; //Pt2d pt; Matrix matA, matB; matA = new Matrix(2, 2); matB = new Matrix(2, 1); Matrix matR; matR = new Matrix(3, 3); //Matrix matX; double[] a = new double[4]; double[] b = new double[2]; OPK2RMat(exori.ori, ref matR); //求解相关系数 double a1 = matR.getNum(0, 0); double a2 = matR.getNum(0, 1); double a3 = matR.getNum(0, 2); double b1 = matR.getNum(1, 0); double b2 = matR.getNum(1, 1); double b3 = matR.getNum(1, 2); double c1 = matR.getNum(2, 0); double c2 = matR.getNum(2, 1); double c3 = matR.getNum(2, 2); double[] dbCoef = new double[] { a1, a2, a3, b1, b2, b3, c1, c2, c3 }; //double X, Y, Z, Z1; // Z = 0.0; //double dthreshold = 0.01; //初始化数组 //int[,] dbData = new int[nDemWidth, nDemHeight]; //for (int i = 0; i < nDemWidth; i++) //{ // for (int j = 0; j < nDemHeight; j++) // { // dbData[i, j] = 0; // } //} try { //生成RASTER Point2D pt2dTopLeft = new Point2D(); pt2dTopLeft.X = pProps.Extent.UpperLeft.X; pt2dTopLeft.Y = pProps.Extent.UpperLeft.Y; pDstRaster = CreateRaster(pt2dTopLeft, dbResolution, nSize); if (pDstRaster == null) { return(false); } //得到数组 IPnt pBlockSize = new DblPntClass(); pBlockSize.X = nDemWidth; pBlockSize.Y = nDemHeight; IPnt pntLeftTop = new DblPntClass(); pntLeftTop.SetCoords(ptLeftTop.X, ptLeftTop.Y); IPixelBlock pPixelBlock = pDstRaster.CreatePixelBlock(pBlockSize); IPixelBlock3 pPixelBlock3 = pPixelBlock as IPixelBlock3; pDstRaster.Read(pntLeftTop, pPixelBlock); System.Array pixels; pixels = (System.Array)pPixelBlock3.get_PixelData(0); //初始化 object oValue = getValidType(pDstRaster as IRasterProps, 0); for (int i = 0; i < nDemHeight; i++) { for (int j = 0; j < nDemWidth; j++) { pixels.SetValue(oValue, j, i); } } //逐像素判断是否可见 IRaster2 pSrcRaster2 = pSrcRaster as IRaster2; oValue = getValidType(pDstRaster as IRasterProps, 255); for (int i = 0; i < nImgHeight; i++) { for (int j = 0; j < nImgWidth; j++) { Point2D ptCurrent = null; if (getPixelIsCoverd(pSrcRaster, dbSubDemData, ptSubImgLeftTop, j, i, out ptCurrent, exori, dbCoef, dbFocus, fx, fy, dbInitialStep)) { int nCol = int.MaxValue, nRow = int.MaxValue; pSrcRaster2.MapToPixel(ptCurrent.X, ptCurrent.Y, out nCol, out nRow); if (nCol >= nDemWidth || nCol < 0 || nRow < 0 || nRow >= nDemHeight) { continue; } pixels.SetValue(oValue, nCol, nRow); //pixels[nCol, nRow] = 255; } } } pPixelBlock3.set_PixelData(0, (System.Array)pixels); //修改数据 IRasterEdit pRasterEdit = pDstRaster as IRasterEdit; pRasterEdit.Write(pntLeftTop, pPixelBlock); pRasterEdit.Refresh(); } catch (System.Exception ex) { MessageBox.Show(ex.Message); return(false); } return(true); }