zoukankan      html  css  js  c++  java
  • AE 空间参考与用矢量图剪裁栅格图

        做GIS二次开发,不论用什么语言或二次开发工具,只要对图形的操作,都会涉及到空间参考的问题,至于空间参考的基础知识我就不再强调了!在做栅格裁剪的时候,也会涉及到空间参考的问题,主要有一下几个地方,有栅格图的空间参考、矢量图的空间参考、剪裁后栅格图的空间参考,最好这三个参考是一致的,如果不一致就要让他一致,以下为例子代码:pRaster为原栅格图,pPolygon为矢量图的上的某个面要素的最大外环。以原栅格图为参考基准。重点在于投影空间参考!

      //多边形裁剪 、矩形裁剪
            public  void CutByPolygon(ILayer layer, IGeometry clipGeo,string m_Path,string m_CutType)
            {
                IRasterLayer pRasterLayer = layer as IRasterLayer;
                IRaster pRaster = pRasterLayer.Raster;
                IRasterProps pProps = pRaster as IRasterProps;
                object cellSizeProvider = pProps.MeanCellSize().X;
                IGeoDataset pInputDataset = pRaster as IGeoDataset;
                //修改矢量图要素空间参考
                clipGeo.Project(pInputDataset.SpatialReference);
               
                IExtractionOp pExtractionOp = new RasterExtractionOpClass();
                IRasterAnalysisEnvironment pRasterAnaEnvir = pExtractionOp as IRasterAnalysisEnvironment;
                pRasterAnaEnvir.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref cellSizeProvider);          
                object extentProvider = clipGeo.Envelope;
                object snapRasterData = Type.Missing;
                pRasterAnaEnvir.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref extentProvider, ref snapRasterData);
                //投影栅格空间参考
                rstAnalysisEnvironment.OutSpatialReference = pProps.SpatialReference;
                IGeoDataset pOutputDataset = null;
                switch (m_CutType)
                {
                    case "多边形裁剪":
                        pOutputDataset = pExtractionOp.Polygon(pInputDataset, clipGeo as IPolygon, true);
                        break;
                    case "矩形裁剪":
                        pOutputDataset = pExtractionOp.Rectangle(pInputDataset, clipGeo.Envelope  as IEnvelope, true);
                        break;
                }
    
                IRaster clipRaster;  //裁切后得到的IRaster
                if (pOutputDataset is IRasterLayer)
                {
                    IRasterLayer rasterLayer = pOutputDataset as IRasterLayer;
                    clipRaster = rasterLayer.Raster;
                }
                else if (pOutputDataset is IRasterDataset)
                {
                    IRasterDataset rasterDataset = pOutputDataset as IRasterDataset;
                    clipRaster = rasterDataset.CreateDefaultRaster();
                }
                else if (pOutputDataset is IRaster)
                {
                    clipRaster = pOutputDataset as IRaster;
                    //增加阈值设定
                    IRasterProps temRastPro = clipRaster as IRasterProps;
                    temRastPro.NoDataValue = pProps.NoDataValue;
                    temRastPro.PixelType = pProps.PixelType;
                }
                else
                {
                    return;
                }
                //保存新裁剪结果
                string wpath = System.IO.Path.GetDirectoryName(m_Path);
    
                string wname = System.IO.Path.GetFileName(m_Path);
                string wtpype = System.IO.Path.GetExtension(m_Path);
                string pFormat = "TIFF";
                switch (wtpype)
                {
                    case ".bmp":
                        pFormat = "BMP";
                        break;
                    case ".tiff":
                    case ".tif":
                        pFormat = "TIFF";
                        break;
                    case ".img":
                        pFormat = "IMAGINE Image";
                        break;
                    case ".jpg":
                        pFormat = "JPG";
                        break;
                }
                IWorkspaceFactory pWKSF = new RasterWorkspaceFactoryClass();
                IWorkspace pWorkspace = pWKSF.OpenFromFile(wpath, 0);
                ISaveAs2 pSaveAs = clipRaster as ISaveAs2;
                pSaveAs.SaveAs(wname, pWorkspace, pFormat);
                MessageBox.Show("影像裁切完成!!!", "消息提示");
                
            }

     还有一种方法,但不建议使用,就是彻底修改矢量图的空间参考:

      /// <summary>
            /// 改变图层的空间参考
            /// </summary>
            /// <param name="pFeatureLayer">图层</param>
            /// <param name="pGeoType">空间参考类型</param>
            private void ChangeLayerRef(IFeatureLayer pFeatureLayer, ISpatialReference pSRF)
            {
                try
                {
                    IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
                    //QI到IGeoDataset
                    IGeoDataset pGeoDataset = pFeatureClass as IGeoDataset;
                    //ISchemaLock schemaLock = (ISchemaLock)pGeoDataset;
                    //schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
                    //QI到IGeoDatasetSchemaEdit
                    IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit;
                    if (pGeoDatasetSchemaEdit.CanAlterSpatialReference)
                    {
                        ////创建SpatialReferenceEnvironmentClass对象
                        //ISpatialReferenceFactory2 pSpaRefFactory = new SpatialReferenceEnvironmentClass();
                        ////创建地理坐标系对象
                        //IGeographicCoordinateSystem pNewGeoSys = pSpaRefFactory.CreateGeographicCoordinateSystem(gcsType);//4214代表Beijing1954
                        //pGeoDatasetSchemaEdit.AlterSpatialReference(pNewGeoSys);
                        pGeoDatasetSchemaEdit.AlterSpatialReference(pSRF);
                    }
                }
                catch (Exception Err)
                {
                    MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
    
  • 相关阅读:
    css sprites图片背景优化技术
    CSS3新特性(整理贴)
    span HTML元素
    jQuery1.2选择器(2)
    JavaScript 弹出窗口总结
    jQuery1.2选择器(1)
    jquery如何判断checkbox(复选框)是否被选中
    使用 Lightbox 2 和 JavaScript 构建出色的图片库
    如何在一台电脑同时安装IE6、IE7、FF2、FF3进行网页调试
    IE的有条件注释详解(附实例代码)
  • 原文地址:https://www.cnblogs.com/wylaok/p/2591143.html
Copyright © 2011-2022 走看看