Exemplo n.º 1
0
        //行列号的三维坐标
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        //当前地理位置的高程
        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);
            }
        }
Exemplo n.º 5
0
        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);
            }
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        //计算某个像素点是否可见,只适用于东北天坐标,即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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        //逐点算法
        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);
        }