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);
        }
Exemple #2
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);
            }
        }