ArcGIS Engine+GetScreen实现自动配准

来源:互联网 发布:淘宝网商店 编辑:程序博客网 时间:2024/05/17 08:27

GetScreen已经有好些年没用了,再次使用这个软件的时候,却问题百出,win7的64上没法用,最新的GE也没法用,网上搜索了下,不少人在问同样的问题,于是找到了源码,本想自己去修改下,但是发现比较费时间,还有就是这个用到了GE的一个库,这个库是否有变化,还不清楚,于是就找到了旧版本的GE。

可以使用GE4.3或者GE5.0(需要配置下,可以搜索),我用的是GE5.0实现了截屏。

有些人喜欢在数字中找规律,有的人喜欢爱折腾,而我属于后者,如果能用程序实现的功能,而且是批量的话,我绝不会去手动,但是有一个问题,有的时候,程序还没写好,别人将数据已经处理完了,没法,各有各的利弊,不是说了我喜欢折腾么。

很佩服那些能从数字中找到规律的人,也和佩服那些喜欢折腾配置文件的人,更佩服那些能从这些文件中能得知一个东西运行本质的人(以后自己要多学点)。

 getscreen截下来的图,有一个map,里面存储了这幅数据的四个顶点的坐标,那么我们可以利用这四个坐标来给这个数据配准,直接上代码。

 public bool GeoReferencing(IPointCollection pFromPoint, IPointCollection pTPoint,  IRaster pRaster, ISpatialReference pSr, string pSaveFile, string pType)
        {     

        try
         {
             IRasterGeometryProc pRasterGProc = new RasterGeometryProcClass();
             pRasterGProc.Warp(pFromPoint, pTPoint, esriGeoTransTypeEnum.esriGeoTransPolyOrder1, pRaster);
             pRasterGProc.Register(pRaster);
             IRasterProps pRasterPro = pRaster as IRasterProps;
             pRasterPro.SpatialReference = pSr;//定义投影
             if (File.Exists(pSaveFile))
             {
                 File.Delete(pSaveFile);
             }
             pRasterGProc.Rectify(pSaveFile, pType, pRaster);//路径和格式(String)
         }
         catch (System.Exception ex)
         {  return false;
         }                    
                return true;   
        }

//创建金字塔

        public bool CreatePyra(IRasterDataset pRdataset)
        {
            try
            {
                IRasterPyramid3 pRasterPyramid = pRdataset as IRasterPyramid3;

                if (!pRasterPyramid.Present)
                {

                    pRasterPyramid.Create();
                }
            }
            catch (System.Exception ex)
            {
                return false;
            }
           
            return true;
        }

///获取坐标

      public IPointCollection GetPoints(IEnvelope pEnv)
        {
            IPointCollection pPoints = new MultipointClass();


            pPoints.AddPoint(new PointClass
            {
                X = pEnv.XMin,
                Y = pEnv.YMax

            });
            pPoints.AddPoint(new PointClass
            {
                X = pEnv.XMax,
                Y = pEnv.YMax

            });
            pPoints.AddPoint(new PointClass
            {
                X = pEnv.XMax,
                Y = pEnv.YMin

            });
            pPoints.AddPoint(new PointClass
            {
                X = pEnv.XMin,
                Y = pEnv.YMin

            });
           return pPoints;
        }

        public IPointCollection GetPoints(string pStringFile)
        {
            IPointCollection pPoints = new MultipointClass();
            StreamReader pSr = new StreamReader(pStringFile);

            string sr = pSr.ReadLine();

            while(sr!=null){
                if (pPoints.PointCount == 4)
                {
                    pSr.Close();
                    return pPoints;
                }
                if(sr.Contains("MMPLL,1"))
                {
                    string[] pArr = sr.Split(',');
                    pPoints.AddPoint(new PointClass
                    {
                        X = Convert.ToDouble(pArr[2].Trim()),
                        Y = Convert.ToDouble(pArr[3].Trim())

                    });


                }else if (sr.Contains("MMPLL,2"))
                {
                    string[] pArr = sr.Split(',');
                    pPoints.AddPoint(new PointClass
                    {
                        X = Convert.ToDouble(pArr[2].Trim()),
                        Y = Convert.ToDouble(pArr[3].Trim())

                    });
                }
                else if (sr.Contains("MMPLL,3"))
                {
                    string[] pArr = sr.Split(',');
                    pPoints.AddPoint(new PointClass
                    {
                        X = Convert.ToDouble(pArr[2].Trim()),
                        Y = Convert.ToDouble(pArr[3].Trim())

                    });
                }
                else if (sr.Contains("MMPLL,4"))
                {
                    string[] pArr = sr.Split(',');
                    pPoints.AddPoint(new PointClass
                    {
                        X = Convert.ToDouble(pArr[2].Trim()),
                        Y = Convert.ToDouble(pArr[3].Trim())

                    });
                }
//                MMPLL,1, 102.230005, 23.500000
//MMPLL,2, 103.410051, 23.500000
//MMPLL,3, 103.410051, 22.581880
//MMPLL,4, 102.230005, 22.581880

                sr = pSr.ReadLine();
            }
            pSr.Close();

            return pPoints;
        }

            IWorkspace pWs = pRas.GetWorkspace(@"D:\2013\guest\贵州\8m\sv") as IWorkspace;

        IEnumDataset pds=   pWs.get_Datasets(esriDatasetType.esriDTRasterDataset);

        IRasterDataset pRds = pds.Next() as IRasterDataset;

            ISpatialReferenceFactory2 pSrfc = new SpatialReferenceEnvironmentClass ();
            ISpatialReference pSr = pSrfc.CreateSpatialReference(4326);

            while (pRds != null) 
            {
                IRaster pRaster = pRds.CreateDefaultRaster();
                IRasterProps pRpr = pRaster as IRasterProps;
                IEnvelope pEnv = pRpr.Extent;
                pFromCollection = pRas.GetPoints(pEnv);

                IDataset pDataset = pRds as IDataset;

                string pMapFile=System.IO.Path.ChangeExtension(pRds.CompleteName,".map");

                pToCollection = pRas.GetPoints(pMapFile);
                //IGeoDatasetSchemaEdit pEdit = pRds as IGeoDatasetSchemaEdit;

                //if (pEdit.CanAlterSpatialReference)
                //{
                //    pEdit.AlterSpatialReference(pSr);
                //}

                string pSaveFile = System.IO.Path.Combine(@"D:\2013\guest\贵州\8m\ge", System.IO.Path.GetFileNameWithoutExtension(pMapFile) + ".tif");
                pRas.GeoReferencing(pFromCollection, pToCollection, pRaster, pSr, pSaveFile, "TIFF");
                pRds = pds.Next() as IRasterDataset;         
            }

原创粉丝点击