Пример #1
0
 //计算栅格数据块的高程值
 public void CalPixelArray(ITinSurface pTinSurf, double UpLeftX, double UpLeftY, double XCellsize, double YCellsize, ref IPixelBlock3 pixelblock)
 {
     System.Array pArray = pixelblock.get_PixelData(0) as System.Array;
     for (int i = 0; i < pixelblock.Width; i++)
     {
         for (int j = 0; j < pixelblock.Height; j++)
         {
             double dheight = (double)pTinSurf.get_Z(UpLeftX + i * XCellsize, UpLeftY - j * YCellsize);
             pArray.SetValue(dheight, i, j);
         }
     }
     pixelblock.set_PixelData(0, pArray);
 }
Пример #2
0
        private IFeatureClass Create_ContourLine(ITin pTin, string WorkSpaceName, string FileName)
        {
            int pInterval = 1;
            IWorkspaceFactory contourWSF = new ShapefileWorkspaceFactoryClass();
            IFeatureWorkspace contourFWS = (IFeatureWorkspace)contourWSF.OpenFromFile(WorkSpaceName, 0);
            IFields           pFields    = CreateShapeFields(esriGeometryType.esriGeometryPolyline);

            contourFWS.CreateFeatureClass(FileName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", null);
            IFeatureClass pContourFeatureClass = contourFWS.OpenFeatureClass(FileName);
            //生成等高线
            ITinSurface pTinSurface = pTin as ITinSurface;

            pTinSurface.Contour(0, pInterval, pContourFeatureClass, "Contour", 0);
            return(pContourFeatureClass);
        }
Пример #3
0
        /// <summary>
        /// 通过TIN文件,建立*.shp文件
        /// </summary>
        /// <param name="TINDir">TIN文件的文件夹路径</param>
        private void CreateContourData(string TINDir)
        {
            try
            {
                IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
                CopyFolder(Application.StartupPath + "\\Convert\\TemContour", Application.StartupPath + "\\Convert\\ContourResult\\" + this.Random);
                IWorkspace        pWorkspace        = pWorkspaceFactory.OpenFromFile(Application.StartupPath + "\\Convert\\ContourResult\\" + this.Random, 0);
                IWorkspaceEdit    w                 = pWorkspace as IWorkspaceEdit;
                IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
                IFeatureClass     tFeatureClass     = pFeatureWorkspace.OpenFeatureClass("Contour.shp");

                ITinWorkspace     pTinWorkspace;
                IWorkspace        pWS;
                IWorkspaceFactory pWSFact = new TinWorkspaceFactoryClass();

                pWS = pWSFact.OpenFromFile(TINDir, 0);

                ITin pTin;

                pTinWorkspace = pWS as ITinWorkspace;
                w.StartEditing(true);
                w.StartEditOperation();

                if (pTinWorkspace.get_IsTin(this.Random))
                {
                    pTin = pTinWorkspace.OpenTin(this.Random);

                    ITinSurface pTinSurface = pTin as ITinSurface;

                    pTinSurface.Contour(0, this.Interval, tFeatureClass, "Z", 0);

                    w.StopEditOperation();
                    w.StopEditing(true);
                }
            }
            catch (Exception)
            {
            }
        }
Пример #4
0
        /// <summary>
        /// TIN数据转栅格数据并进行坡度分析      张琪    20110614
        /// </summary>
        /// <param name="pTinAdvanced"></param>
        /// <param name="pRastConvType"></param>
        /// <param name="sDir"></param>
        /// <param name="sName"></param>
        /// <param name="ePixelType"></param>
        /// <param name="cellsize"></param>
        /// <param name="pExtent"></param>
        /// <param name="bPerm"></param>
        /// <param name="strType"></param>
        /// <returns></returns>
        public IRasterDataset TinToRaster(ITinAdvanced pTinAdvanced, esriRasterizationType pRastConvType, String sDir, String sName, rstPixelType ePixelType, Double cellsize, IEnvelope pExtent, bool bPerm, String strType)
        {
            try
            {
                ESRI.ArcGIS.Geometry.IPoint pOrigin = pExtent.LowerLeft;
                pOrigin.X = pOrigin.X - (cellsize * 0.5);
                pOrigin.Y = pOrigin.Y - (cellsize * 0.5);
                int nCol, nRow;
                nCol = Convert.ToInt32(Math.Round(pExtent.Width / cellsize)) + 1;
                nRow = Convert.ToInt32(Math.Round(pExtent.Height / cellsize)) + 1;
                IGeoDataset         pGeoDataset        = pTinAdvanced as IGeoDataset;
                ISpatialReference2  pSpatialReference2 = pGeoDataset.SpatialReference as ISpatialReference2;
                IRasterDataset      pRasterDataset     = CreateRasterSurf(sDir, sName, strType, pOrigin, nCol, nRow, cellsize, cellsize, ePixelType, pSpatialReference2, bPerm);
                IRawPixels          pRawPixels         = GetRawPixels(pRasterDataset, 0);
                object              pCache             = pRawPixels.AcquireCache();
                ITinSurface         pTinSurface        = pTinAdvanced as ITinSurface;
                IGeoDatabaseBridge2 pbridge2           = (IGeoDatabaseBridge2) new GeoDatabaseHelperClass();

                IRasterProps pRasterProps = pRawPixels as IRasterProps;
                //float nodataFloat;
                //int nodataInt;
                double dZMin = pTinAdvanced.Extent.ZMin;
                object vNoData;
                if (ePixelType.ToString() == "PT_FLOAT")
                {
                    vNoData = (dZMin - 1).ToString();
                }
                else
                {
                    vNoData = Convert.ToInt32((dZMin - 1));
                }
                pRasterProps.NoDataValue = vNoData;
                IPnt pOffset    = new DblPntClass();
                int  lMaxBlockX = 2048;
                if (nCol < lMaxBlockX)
                {
                    lMaxBlockX = nCol;
                }
                int lMaxBlockY = 2048;
                if (nRow < lMaxBlockY)
                {
                    lMaxBlockY = nRow;
                }
                IPnt pBlockSize = new DblPntClass();
                pBlockSize.X = lMaxBlockX;
                pBlockSize.Y = lMaxBlockY;
                IPixelBlock3 pPixelBlock = pRawPixels.CreatePixelBlock(pBlockSize) as IPixelBlock3;
                object       blockArray  = pPixelBlock.get_PixelDataByRef(0);
                ITrackCancel pCancel     = new CancelTrackerClass();
                pCancel.CancelOnClick    = false;
                pCancel.CancelOnKeyPress = true;
                int lBlockCount = Convert.ToInt32(Math.Round((nCol / lMaxBlockX) + 0.49) * Math.Round((nRow / lMaxBlockY) + 0.49));
                ESRI.ArcGIS.Geometry.IPoint pBlockOrigin = new ESRI.ArcGIS.Geometry.PointClass();
                int lColOffset, lRowOffset;

                for (lRowOffset = 0; lRowOffset < (nRow - 1);)
                {
                    for (lColOffset = 0; lColOffset < (nCol - 1);)
                    {
                        if ((nCol - lColOffset) < lMaxBlockX)
                        {
                            pBlockSize.X = (nCol - lColOffset);
                            pPixelBlock  = pRawPixels.CreatePixelBlock(pBlockSize) as IPixelBlock3;
                            blockArray   = pPixelBlock.get_PixelDataByRef(0);
                        }
                        pBlockOrigin.X = pOrigin.X + (lColOffset * cellsize) + (cellsize * 0.5);
                        pBlockOrigin.Y = pOrigin.Y + ((nRow - lRowOffset) * cellsize) - (cellsize * 0.5);
                        pbridge2.QueryPixelBlock(pTinSurface, pBlockOrigin.X, pBlockOrigin.Y, cellsize, cellsize, pRastConvType, vNoData, ref blockArray);
                        //pTinSurface.QueryPixelBlock(pBlockOrigin.X, pBlockOrigin.Y, cellsize, cellsize, pRastConvType, vNoData, blockArray);
                        pOffset.X = lColOffset;
                        pOffset.Y = lRowOffset;
                        pPixelBlock.set_PixelData(0, (System.Object)blockArray);
                        pRawPixels.Write(pOffset, pPixelBlock as IPixelBlock);
                        if (lBlockCount > 1)
                        {
                            if (!pCancel.Continue())
                            {
                                break;
                            }
                            else if (pTinAdvanced.ProcessCancelled)
                            {
                                break;
                            }
                        }
                        lColOffset = lColOffset + lMaxBlockX;
                    }
                    bool bReset = false;
                    if (pBlockSize.X != lMaxBlockX)
                    {
                        pBlockSize.X = lMaxBlockX;
                        bReset       = true;
                    }
                    if ((nRow - lRowOffset) < lMaxBlockY)
                    {
                        pBlockSize.Y = (nRow - lRowOffset);
                        bReset       = true;
                    }
                    if (bReset)
                    {
                        pPixelBlock.set_PixelData(0, blockArray);
                        pPixelBlock = pRawPixels.CreatePixelBlock(pBlockSize) as IPixelBlock3;
                        blockArray  = pPixelBlock.get_PixelDataByRef(0);
                    }
                    lRowOffset = lRowOffset + lMaxBlockY;
                }

                pRawPixels.ReturnCache(pCache);
                pCache         = null;
                pRawPixels     = null;
                pPixelBlock    = null;
                pRasterProps   = null;
                blockArray     = 0;
                pRasterDataset = OpenRasterDataset(sDir, sName);
                if (lBlockCount == 1)
                {
                    pTinAdvanced.TrackCancel = null;
                }
                return(pRasterDataset);
            }
            catch
            {
                return(null);
            }
        }
Пример #5
0
        public IRasterDataset TinToRaster2(ITinAdvanced pTinAdvanced, esriRasterizationType pRastConvType, String sDir, String sName, rstPixelType ePixelType, Double cellsize, IEnvelope pExtent, bool bPerm, String strType)
        {
            try
            {
                ESRI.ArcGIS.Geometry.IPoint pOrigin = pExtent.LowerLeft;
                pOrigin.X = pOrigin.X - (cellsize * 0.5);
                pOrigin.Y = pOrigin.Y - (cellsize * 0.5);
                int nCol, nRow;
                nCol = Convert.ToInt32(Math.Round(pExtent.Width / cellsize)) + 1;
                nRow = Convert.ToInt32(Math.Round(pExtent.Height / cellsize)) + 1;
                IGeoDataset        pGeoDataset        = pTinAdvanced as IGeoDataset;
                ISpatialReference2 pSpatialReference2 = pGeoDataset.SpatialReference as ISpatialReference2;
                IRasterDataset     pRasterDataset     = CreateRasterSurf(sDir, sName, strType, pOrigin, nCol, nRow, cellsize, cellsize, ePixelType, pSpatialReference2, bPerm);
                IRawPixels         pRawPixels         = GetRawPixels(pRasterDataset, 0);
                IPnt pBlockSize = new DblPntClass();
                pBlockSize.X = nCol;
                pBlockSize.Y = nRow;
                IPixelBlock3        pPixelBlock = pRawPixels.CreatePixelBlock(pBlockSize) as IPixelBlock3;
                object              blockArray  = pPixelBlock.get_PixelDataByRef(0);
                ITinSurface         pTinSurface = pTinAdvanced as ITinSurface;
                IGeoDatabaseBridge2 pbridge2    = (IGeoDatabaseBridge2) new GeoDatabaseHelperClass();

                IRasterProps pRasterProps = pRawPixels as IRasterProps;
                object       nodataFloat;
                object       nodataInt;
                pOrigin.X = pOrigin.X + (cellsize * 0.5);
                pOrigin.Y = pOrigin.Y + (cellsize * nRow) - (cellsize * 0.5);

                if (ePixelType.ToString() == "PT_FLOAT")
                {
                    nodataFloat = pRasterProps.NoDataValue;
                    pTinSurface.QueryPixelBlock(pOrigin.X, pOrigin.Y, cellsize, cellsize, pRastConvType, nodataFloat, blockArray);
                }
                else
                {
                    nodataInt = pRasterProps.NoDataValue;
                    pTinSurface.QueryPixelBlock(pOrigin.X, pOrigin.Y, cellsize, cellsize, pRastConvType, nodataInt, blockArray);
                }

                if (pTinAdvanced.ProcessCancelled == false)
                {
                    return(null);
                }
                IPnt pOffset = new DblPntClass();
                pOffset.X = 0;
                pOffset.Y = 0;
                pRawPixels.Write(pOffset, pPixelBlock  as IPixelBlock);
                if (!bPerm && ePixelType.ToString() == "PT_FLOAT")
                {
                    IRasterBand       pBand  = pRawPixels as IRasterBand;
                    IRasterStatistics pStats = pBand.Statistics;
                    pStats.Recalculate();
                }
                if (bPerm)
                {
                    pRawPixels     = null;
                    pPixelBlock    = null;
                    pRasterProps   = null;
                    blockArray     = 0;
                    pRasterDataset = OpenRasterDataset(sDir, sName);
                }
                return(pRasterDataset);
            }

            catch
            {
                return(null);
            }
        }
Пример #6
0
        private void buttonOK_Click(object sender, EventArgs e)
        {
            //高程底面
            ILayer   pBaseLayer = null;
            ISurface pSurface   = null;

            if (m_pSceneCtrl != null)
            {
                try
                {
                    // m_pSceneCtrl.LoadSxFile(ClsGDBDataCommon.GetParentPathofExe() +@"Resource\DefaultData\Default.sxd");
                }
                catch
                {
                }
                //IScene pScene = new SceneClass();
                //pScene.Name = "Scene";
                //m_pSceneCtrl.Scene = pScene;

                IScene pScene = m_pSceneCtrl.Scene;
                pScene.Name = "Scene";
                //ILayer pglayer = new GraphicsLayer3DClass();
                //pScene.AddLayer(pglayer);
                //pScene.ActiveGraphicsLayer = new CompositeGraphicsLayerClass();

                pScene.ExaggerationFactor = Convert.ToDouble(doubleInputExaFactor.Value.ToString());
                while (pScene.LayerCount > 0)
                {
                    pScene.DeleteLayer(pScene.get_Layer(0));
                }
                // pScene.ClearLayers();
                pScene.AddLayer(pScene.ActiveGraphicsLayer);
                GC.Collect();
                for (int i = 0; i < m_pMapCtrl.Map.LayerCount; i++)
                {
                    ILayer pMapLayer = m_pMapCtrl.Map.get_Layer(i);
                    ILayer pLayer    = pMapLayer;

                    if (comboBoxExBaseHeightLayer.Items.Count > 0)
                    {
                        if (pLayer.Name == comboBoxExBaseHeightLayer.SelectedItem.ToString())
                        {
                            pBaseLayer = pLayer;
                        }
                    }
                }

                if (pBaseLayer is IRasterLayer)
                {
                    IRaster        pRaster  = ((IRasterLayer)pBaseLayer).Raster;
                    IRasterBand    pBand    = ((IRasterBandCollection)pRaster).Item(0);
                    IRasterSurface rsurface = new RasterSurface();
                    rsurface.RasterBand = pBand;
                    //将dem的数据指定为surface
                    pSurface = rsurface as ISurface;
                }
                if (pBaseLayer is ITinLayer)
                {
                    ITin        pTin        = ((ITinLayer)pBaseLayer).Dataset;
                    ITinSurface pTinSurface = pTin as ITinSurface;
                    pSurface = pTinSurface as ISurface;
                }


                for (int i = 0; i < m_pMapCtrl.Map.LayerCount; i++)
                {
                    ILayer pMapLayer = m_pMapCtrl.Map.get_Layer(i);

                    ILayer pLayer     = pMapLayer;
                    string filepath   = "";
                    string filename   = "";
                    string sourcepath = GetDataLayerPath(pMapLayer as IDataLayer, ref filepath, ref filename);

                    //if (pMapLayer is IRasterLayer)
                    //{
                    //    IRasterLayer prl = new RasterLayerClass();
                    //     prl.CreateFromRaster(((IRasterLayer)pMapLayer).Raster);
                    //     pLayer = prl as ILayer;
                    //}
                    if (pMapLayer is IFeatureLayer)
                    {
                        // if (((IFeatureLayer)pMapLayer).FeatureClass.ShapeType != ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultiPatch)
                        //  {

                        IFeatureLayer pfl = new FeatureLayerClass();
                        IFeatureClass pFc = ((IFeatureLayer)pMapLayer).FeatureClass;
                        if (pFc != null)
                        {
                            pfl.FeatureClass = ((IFeatureLayer)pMapLayer).FeatureClass;
                            pLayer           = pfl as ILayer;
                            pLayer.Name      = pMapLayer.Name;

                            /////////////////////////////////////////////////////////////////////
                            //后期添加,用于带进涂层渲染
                            /////////////////////////////////////////////////////////////////////
                            IGeoFeatureLayer pGeoFLayer  = pfl as IGeoFeatureLayer;
                            IGeoFeatureLayer pGFMapLayer = pMapLayer as IGeoFeatureLayer;
                            if (pGFMapLayer != null)  //注记图层为空
                            {
                                pGeoFLayer.Renderer = pGFMapLayer.Renderer;
                                ILegendInfo pLegend3D = (ILegendInfo)pGeoFLayer;
                                for (int k = 0; k < pLegend3D.LegendGroupCount; k++)
                                {
                                    ILegendGroup pLgroup = pLegend3D.LegendGroup[k];
                                    for (int p = 0; p < pLgroup.ClassCount; p++)
                                    {
                                        ILegendClass pLClass = pLgroup.Class[p];
                                        if (pLClass.Symbol is IMarkerSymbol)
                                        {
                                            IMarkerSymbol pSMSymbol = pLClass.Symbol as IMarkerSymbol;
                                            pSMSymbol.Size /= 20;
                                        }
                                    }
                                }
                                if (pFc.ShapeType == esriGeometryType.esriGeometryMultipoint || pFc.ShapeType == esriGeometryType.esriGeometryPoint)
                                {
                                    if (pGFMapLayer.Renderer is IUniqueValueRenderer)
                                    {
                                    }
                                }
                            }
                        }
                        //  }
                    }

                    #region 这段代码家的有点重复,如果不加有时候会弹出设置数据源的对话框
                    if (pLayer is IRasterLayer)
                    {
                        I3DProperties properties = null;

                        properties = new Raster3DPropertiesClass();
                        ILayerExtensions layerextensions = pLayer as ILayerExtensions;

                        object p3d;
                        for (int j = 0; j < layerextensions.ExtensionCount; j++)
                        {
                            p3d = layerextensions.get_Extension(j);
                            if (p3d != null)
                            {
                                properties = p3d as I3DProperties;
                                if (properties != null)
                                {
                                    break;
                                }
                            }
                        }
                        properties.BaseOption  = esriBaseOption.esriBaseSurface;
                        properties.BaseSurface = pSurface;
                        //I、更改分辨率后,如何让分辨率设置发挥作用。主要是刷新的问题(使用IActiveView刷新、而不能使用Iscene及IScenegraph刷新)
                        //II、分辨率数值在( 262144-268435456)范围之内,越大越清晰。使用3DProperties.MaxTextureMemory 方法
                        properties.MaxTextureMemory = 268435456;
                    }
                    #endregion
                    pScene.AddLayer(pLayer);
                    //if (((CheckBoxItem)itemPanelSetVisible.Items[i]).Checked == false)
                    //{
                    //    pLayer.Visible = false;
                    //}
                    //else
                    //{
                    //    pLayer.Visible = true;
                    //}
                    if (comboBoxExBaseHeightLayer.Items.Count > 0)
                    {
                        if (pLayer.Name == comboBoxExBaseHeightLayer.SelectedItem.ToString())
                        {
                            pBaseLayer = pLayer;
                        }
                    }
                }
            }

            if (pSurface != null)
            {
                for (int i = 0; i < m_pSceneCtrl.Scene.LayerCount; i++)
                {
                    ILayer pLayer = m_pSceneCtrl.Scene.get_Layer(i);

                    ILayerExtensions layerextensions = m_pSceneCtrl.Scene.get_Layer(i) as ILayerExtensions;
                    I3DProperties    properties      = null;
                    if (pLayer is IRasterLayer)
                    {
                        properties = new Raster3DPropertiesClass();
                    }
                    if (pLayer is IFeatureLayer)
                    {
                        properties = new Feature3DPropertiesClass();
                    }
                    if (pLayer is ITinLayer)
                    {
                        properties = new Tin3DPropertiesClass();
                    }
                    object p3d;
                    for (int j = 0; j < layerextensions.ExtensionCount; j++)
                    {
                        p3d = layerextensions.get_Extension(j);
                        if (p3d != null)
                        {
                            properties = p3d as I3DProperties;
                            if (properties != null)
                            {
                                break;
                            }
                        }
                    }
                    if (!(pLayer is IFeatureLayer))
                    {
                        properties.BaseOption  = esriBaseOption.esriBaseSurface;
                        properties.BaseSurface = pSurface;
                        //I、更改分辨率后,如何让分辨率设置发挥作用。主要是刷新的问题(使用IActiveView刷新、而不能使用Iscene及IScenegraph刷新)
                        //II、分辨率数值在( 262144-268435456)范围之内,越大越清晰。使用3DProperties.MaxTextureMemory 方法
                        properties.MaxTextureMemory = 268435456;
                    }
                    else
                    {
                        IFeatureLayer pFlayer = pLayer as IFeatureLayer;
                        //multipatch的本身有高度信息
                        if (pFlayer.FeatureClass != null && pFlayer.FeatureClass.ShapeType != ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultiPatch)
                        {
                            bool needConstantHeight = false;

                            /*
                             * try
                             * {
                             *  //把导航点转向角,视场角等信息都设置成不贴在表面而需要根据生产该信息的文件设置高度
                             *  IFeatureClass fc = pFlayer.FeatureClass;
                             *  IFeatureCursor pFcursor = fc.Search(null, false);
                             *  int OriginalFeatureidx = fc.FindField("OriginalFeatureClass");
                             *  int OriginalFeatureOIDidx = fc.FindField("OID");
                             *  IFeature pF = pFcursor.NextFeature();
                             *  IFeatureLayer pOFeatureLayer = null;
                             *  if (OriginalFeatureidx == -1|| OriginalFeatureOIDidx == -1)
                             *  {
                             *      pF = null;
                             *  }
                             *  else
                             *  {
                             *      if (pF != null)
                             *      {
                             *          //获取路径点图层名称
                             *          string orignalname = pF.get_Value(OriginalFeatureidx).ToString();
                             *          IMap pMap = m_pMapCtrl.Map;
                             *          for (int k = 0; k < pMap.LayerCount; k++)
                             *          {
                             *              if (pMap.get_Layer(k).Name.Equals(orignalname))
                             *              {
                             *                  pOFeatureLayer = pMap.get_Layer(k) as IFeatureLayer;
                             *                  break;
                             *              }
                             *          }
                             *          if (pOFeatureLayer == null)
                             *          {
                             *              pF = null;
                             *          }
                             *      }
                             *  }
                             *
                             *  while (pF != null)
                             *  {
                             *      //IFeatureClass pFClass = pOFeatureLayer.FeatureClass;
                             *      //pFClass.FindField(OriginalFeatureOIDidx);
                             *
                             *
                             *      pF = pFcursor.NextFeature();
                             *  }
                             * }
                             * catch
                             * {
                             *  ;
                             * }
                             */
                            if (needConstantHeight == false)
                            {
                                properties.BaseOption = esriBaseOption.esriBaseSurface;
                                //I3DProperties2 pr = properties as I3DProperties2;
                                //if (pr != null)
                                //{
                                //    pr.OffsetExpressionString = "0.005";
                                //}
                                //  properties.BaseOption = esriBaseOption.esriBaseExpression;
                                properties.BaseSurface = pSurface;
                                //I、更改分辨率后,如何让分辨率设置发挥作用。主要是刷新的问题(使用IActiveView刷新、而不能使用Iscene及IScenegraph刷新)
                                //II、分辨率数值在( 262144-268435456)范围之内,越大越清晰。使用3DProperties.MaxTextureMemory 方法
                                properties.MaxTextureMemory = 268435456;
                            }
                        }
                    }
                    //  properties.Apply3DProperties(domlayer);
                    // ps.SceneGraph.RefreshViewers();

                    IActiveView iv = m_pSceneCtrl.Scene as IActiveView;
                    iv.PartialRefresh(esriViewDrawPhase.esriViewGeography, pLayer, null);
                }
            }
        }
Пример #7
0
        /// <summary>
        /// 面积、体积统计及三维效果绘制    张琪  20110629
        /// </summary>
        private void StaTisTic()
        {
            SysCommon.CProgress vProgress = new SysCommon.CProgress("进度条");
            try
            {
                vProgress.EnableCancel    = false;//设置进度条
                vProgress.ShowDescription = true;
                vProgress.FakeProgress    = true;
                vProgress.TopMost         = true;
                vProgress.ShowProgress();
                vProgress.SetProgress("正在计算");
                object before = Type.Missing;
                object after  = Type.Missing;
                if (m_StaPolygon == null)
                {
                    txtArea2DSel.Text   = m_SurFace.GetProjectedArea(Convert.ToDouble(txtPlaneHeight.Text), esriPlaneReferenceType.esriPlaneReferenceAbove).ToString();
                    txtAreaAbove.Text   = m_SurFace.GetSurfaceArea(Convert.ToDouble(txtPlaneHeight.Text), esriPlaneReferenceType.esriPlaneReferenceAbove).ToString();
                    txtAreaBelow.Text   = m_SurFace.GetSurfaceArea(Convert.ToDouble(txtPlaneHeight.Text), esriPlaneReferenceType.esriPlaneReferenceBelow).ToString();
                    txtVolumeBelow.Text = m_SurFace.GetVolume(Convert.ToDouble(txtPlaneHeight.Text), esriPlaneReferenceType.esriPlaneReferenceBelow).ToString();
                    txtVolumeAbove.Text = m_SurFace.GetVolume(Convert.ToDouble(txtPlaneHeight.Text), esriPlaneReferenceType.esriPlaneReferenceAbove).ToString();
                }
                else//在地图上绘制多边形时
                {
                    if (m_IsTin)//为true是指数据为TIN
                    {
                        ITinSurface  pTinsurface  = m_SurFace as ITinSurface;
                        ITinAdvanced pTinAdvanced = pTinsurface as ITinAdvanced;
                        ////ITriangleLabelInPolyFilter  = new
                        //ITinFilter pTCFilterBasic = pTCFilter as ITinFilter;
                        //pTCFilterBasic.DataElementsOnly = true;
                        int Criteria = 4;
                        IEnumTinTriangle pEnumTriangles = pTinAdvanced.MakeTriangleEnumerator(m_StaPolygon.Envelope, Criteria, null);
                        object           dVolumeBelow   = null;
                        object           dSurfaceArea   = null;
                        object           dProjectedArea = null;
                        //根据绘制的多边形和Z值来计算基准面以上的面积和体积
                        pTinsurface.GetPartialVolumeAndArea(Convert.ToDouble(txtPlaneHeight.Text), esriPlaneReferenceType.esriPlaneReferenceAbove, pEnumTriangles, ref dVolumeBelow, ref dSurfaceArea, ref dProjectedArea);
                        txtAreaAbove.Text   = Convert.ToDouble(dSurfaceArea).ToString();
                        txtVolumeAbove.Text = dVolumeBelow.ToString();
                        txtArea2DSel.Text   = dProjectedArea.ToString();
                        //根据绘制的多边形和Z值来计算基准面以下的面积和体积
                        pTinsurface.GetPartialVolumeAndArea(Convert.ToDouble(txtPlaneHeight.Text), esriPlaneReferenceType.esriPlaneReferenceBelow, pEnumTriangles, ref dVolumeBelow, ref dSurfaceArea, ref dProjectedArea);
                        txtAreaBelow.Text   = dSurfaceArea.ToString();
                        txtVolumeBelow.Text = dVolumeBelow.ToString();
                    }
                    else
                    {
                        MessageBox.Show("抱歉该功能暂不支持Raster数据", "提示!");

                        vProgress.Close();
                        return;
                    }
                }

                IPointCollection            pPolygon;
                ESRI.ArcGIS.Geometry.IPoint pPoint = new ESRI.ArcGIS.Geometry.PointClass();
                //IPolygon pOutPoly;
                if (m_StaPolygon == null)//当绘制范围为空,获取整张图的范围
                {
                    pPolygon = new PolygonClass();
                    IZAware pZawre;
                    pPoint.SpatialReference = m_pCurrentSceneControl.Scene.SpatialReference;
                    pPoint.X      = m_SurFace.Domain.Envelope.XMin;
                    pPoint.Y      = m_SurFace.Domain.Envelope.YMin;
                    pZawre        = pPoint as IZAware;
                    pZawre.ZAware = true;
                    pPoint.Z      = Convert.ToDouble(txtPlaneHeight.Text);
                    pPolygon.AddPoint(pPoint, ref before, ref after);

                    pPoint                  = new ESRI.ArcGIS.Geometry.PointClass();
                    pZawre                  = pPoint as IZAware;
                    pZawre.ZAware           = true;
                    pPoint.SpatialReference = m_pCurrentSceneControl.Scene.SpatialReference;
                    pPoint.X                = m_SurFace.Domain.Envelope.XMax;
                    pPoint.Y                = m_SurFace.Domain.Envelope.YMin;
                    pPoint.Z                = Convert.ToDouble(txtPlaneHeight.Text);
                    pPolygon.AddPoint(pPoint, ref before, ref after);

                    pPoint                  = new ESRI.ArcGIS.Geometry.PointClass();
                    pZawre                  = pPoint as IZAware;
                    pZawre.ZAware           = true;
                    pPoint.SpatialReference = m_pCurrentSceneControl.Scene.SpatialReference;
                    pPoint.X                = m_SurFace.Domain.Envelope.XMax;
                    pPoint.Y                = m_SurFace.Domain.Envelope.YMax;
                    pPoint.Z                = Convert.ToDouble(txtPlaneHeight.Text);
                    pPolygon.AddPoint(pPoint, ref before, ref after);

                    pPoint                  = new ESRI.ArcGIS.Geometry.PointClass();
                    pZawre                  = pPoint as IZAware;
                    pZawre.ZAware           = true;
                    pPoint.SpatialReference = m_pCurrentSceneControl.Scene.SpatialReference;
                    pPoint.X                = m_SurFace.Domain.Envelope.XMin;
                    pPoint.Y                = m_SurFace.Domain.Envelope.YMax;
                    pPoint.Z                = Convert.ToDouble(txtPlaneHeight.Text);
                    pPolygon.AddPoint(pPoint, ref before, ref after);

                    pPoint                  = new ESRI.ArcGIS.Geometry.PointClass();
                    pZawre                  = pPoint as IZAware;
                    pZawre.ZAware           = true;
                    pPoint.SpatialReference = m_pCurrentSceneControl.Scene.SpatialReference;
                    pPoint.X                = m_SurFace.Domain.Envelope.XMin;
                    pPoint.Y                = m_SurFace.Domain.Envelope.YMin;
                    pPoint.Z                = Convert.ToDouble(txtPlaneHeight.Text);
                    pPolygon.AddPoint(pPoint, ref before, ref after);
                    //获得整张图范围组成的多边形
                    IGeometry pGeometry = pPolygon as IGeometry;
                    pGeometry.SpatialReference = m_pCurrentSceneControl.Scene.SpatialReference;
                }
                else
                {
                    pPolygon = m_StaPolygon as IPointCollection;
                }

                if (pPolygon == null)
                {
                    vProgress.Close();
                    return;
                }
                //显示参考面
                ShowRefPlane(pPolygon as IPolygon);
                //显示周边
                ShowCountour(pPolygon as IPolygon);
                //获取轮廓线的周长
                m_ScenePoly = pPolygon as IPolygon;
                ITopologicalOperator pTopo     = pPolygon as ITopologicalOperator;
                IPolyline            pPolyLine = pTopo.Boundary as IPolyline;
                txtPara.Text = pPolyLine.Length.ToString();
                vProgress.Close();
            }
            catch
            {
                vProgress.Close();
            }
        }
Пример #8
0
        public IRaster TINToDEM(ITin pTin)
        {
            IPoint pOrigin = pTin.Extent.LowerLeft;


            IWorkspaceFactory pworkspaceFactory = new RasterWorkspaceFactory();

            ESRI.ArcGIS.Geodatabase.IWorkspaceName pworkspaceName = pworkspaceFactory.Create(null, "MyWorkspace", null, 0);
            ESRI.ArcGIS.esriSystem.IName           pname          = (IName)pworkspaceName;
            ESRI.ArcGIS.Geodatabase.IWorkspace     inmemWor       = (IWorkspace)pname.Open();
            IPoint            originpoint = pOrigin;
            IRasterWorkspace2 rasterws    = (IRasterWorkspace2)inmemWor;

            int nCol, nRow;

            nCol = 500;
            nRow = 500;
            double cellsizeX, cellsizeY;

            cellsizeX = pTin.Extent.Width / nCol;
            cellsizeY = pTin.Extent.Height / nRow;

            //用于计算的 float型的栅格数据
            IRasterDataset demdataset = rasterws.CreateRasterDataset("Dataset", "MEM", originpoint, nCol, nRow,
                                                                     (double)cellsizeX, (double)cellsizeY, 1, rstPixelType.PT_DOUBLE, null, true);

            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pname);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pworkspaceFactory);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pworkspaceName);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(inmemWor);
            }
            catch { }

            //IRawPixels pRawPixels = GetRawPixels(pRDS, 0);
            IRaster pRaster    = demdataset.CreateDefaultRaster();
            IPnt    pBlockSize = new DblPnt();

            //nCol = 50;
            //nRow = 50;
            pBlockSize.X = nCol;
            pBlockSize.Y = nRow;
            IPixelBlock pPixelBlock = pRaster.CreatePixelBlock(pBlockSize);
            //IPixelBlock pPixelBlock = pRawPixels.CreatePixelBlock(pBlockSize);
            IPixelBlock3 pPixelBlock3 = pPixelBlock as IPixelBlock3;

            //object val = pPixelBlock.get_SafeArray(0);
            ITinSurface pTinSurf = pTin as ITinSurface;
            // IRasterProps pRasterProps = pRawPixels as IRasterProps;
            IRasterProps pRasterProps = pRaster as IRasterProps;
            object       nodata;

            //pOrigin.X = pOrigin.X + (cellsize * 0.5);
            //pOrigin.Y = pOrigin.Y + (cellsize * nRow) - (cellsize * 0.5);
            pOrigin.X = pOrigin.X;
            pOrigin.Y = pOrigin.Y + (cellsizeY * nRow);
            nodata    = pRasterProps.NoDataValue;
            IGeoDatabaseBridge2 pbridge2 = (IGeoDatabaseBridge2) new GeoDatabaseHelperClass();

            //这个pOrigin为栅格左上角
            //pbridge2.QueryPixelBlock(pTinSurf, pOrigin.X, pOrigin.Y, cellsize, cellsize, esriRasterizationType.esriElevationAsRaster, nodata, ref val);
            //if (pTin.ProcessCancelled)
            //    return null;
            //val.GetType();
            CalPixelArray(pTinSurf, pOrigin.X, pOrigin.Y, cellsizeX, cellsizeY, ref pPixelBlock3);
            IPnt pOffset = new DblPnt();

            pOffset.X = 0;
            pOffset.Y = 0;
            //pPixelBlock3.set_PixelData(0, val);
            //pRawPixels.Write(pOffset, (IPixelBlock)pPixelBlock3);//写入硬盘
            IRasterEdit prasteredit = pRaster as IRasterEdit;

            prasteredit.Write(pOffset, (IPixelBlock)pPixelBlock3);
            //pRDS = OpenOutputRasterDataset(sDir, sName);

            //IPixelBlock pb = pRaster.CreatePixelBlock(pBlockSize);
            //pRaster.Read(pOffset,pb);
            return(pRaster);
        }
Пример #9
0
        public IRasterDataset TinToRaster_new(ITinAdvanced pTin, esriRasterizationType eRastConvType, String sDir, String sName, rstPixelType ePixelType, Double cellsize, IEnvelope pExtent, bool bPerm)
        {
            IPoint pOrigin = pExtent.LowerLeft;

            //pOrigin.X = pOrigin.X - (cellsize * 0.5);
            //pOrigin.Y = pOrigin.Y - (cellsize * 0.5);
            pOrigin.X = pOrigin.X;
            pOrigin.Y = pOrigin.Y;
            int nCol, nRow;

            nCol = (int)Math.Round(pExtent.Width / cellsize);
            nRow = (int)Math.Round(pExtent.Height / cellsize);
            IGeoDataset        pGDS = pTin as IGeoDataset;
            ISpatialReference2 pSR  = pGDS.SpatialReference as ISpatialReference2;
            //这个pOrigin为栅格左下角
            IWorkspaceFactory pworkspaceFactory = new RasterWorkspaceFactory();
            IRasterWorkspace2 rasterws          = pworkspaceFactory.OpenFromFile(sDir, 0) as IRasterWorkspace2;
            IPoint            originpoint       = pOrigin;

            //用于计算的 float型的栅格数据
            IRasterDataset demdataset = rasterws.CreateRasterDataset(sName, "TIFF", originpoint, nCol, nRow,
                                                                     cellsize, cellsize, 1, rstPixelType.PT_DOUBLE, null, true);

            IRasterDataset pRDS = demdataset;

            //IRawPixels pRawPixels = GetRawPixels(pRDS, 0);
            IRaster pRaster    = pRDS.CreateDefaultRaster();
            IPnt    pBlockSize = new DblPnt();

            //nCol = 50;
            //nRow = 50;
            pBlockSize.X = nCol;
            pBlockSize.Y = nRow;
            IPixelBlock pPixelBlock = pRaster.CreatePixelBlock(pBlockSize);
            //IPixelBlock pPixelBlock = pRawPixels.CreatePixelBlock(pBlockSize);
            IPixelBlock3 pPixelBlock3 = pPixelBlock as IPixelBlock3;

            //object val = pPixelBlock.get_SafeArray(0);
            ITinSurface pTinSurf = pTin as ITinSurface;
            // IRasterProps pRasterProps = pRawPixels as IRasterProps;
            IRasterProps pRasterProps = pRaster as IRasterProps;
            object       nodata;

            //pOrigin.X = pOrigin.X + (cellsize * 0.5);
            //pOrigin.Y = pOrigin.Y + (cellsize * nRow) - (cellsize * 0.5);
            pOrigin.X = pOrigin.X;
            pOrigin.Y = pOrigin.Y + (cellsize * nRow);
            nodata    = pRasterProps.NoDataValue;
            IGeoDatabaseBridge2 pbridge2 = (IGeoDatabaseBridge2) new GeoDatabaseHelperClass();

            //这个pOrigin为栅格左上角
            //pbridge2.QueryPixelBlock(pTinSurf, pOrigin.X, pOrigin.Y, cellsize, cellsize, esriRasterizationType.esriElevationAsRaster, nodata, ref val);
            //if (pTin.ProcessCancelled)
            //    return null;
            //val.GetType();
            CalPixelArray(pTinSurf, pOrigin.X, pOrigin.Y, cellsize, cellsize, ref pPixelBlock3);
            IPnt pOffset = new DblPnt();

            pOffset.X = 0;
            pOffset.Y = 0;
            //pPixelBlock3.set_PixelData(0, val);
            //pRawPixels.Write(pOffset, (IPixelBlock)pPixelBlock3);//写入硬盘
            IRasterEdit prasteredit = pRaster as IRasterEdit;

            prasteredit.Write(pOffset, (IPixelBlock)pPixelBlock3);
            //pRDS = OpenOutputRasterDataset(sDir, sName);

            //IPixelBlock pb = pRaster.CreatePixelBlock(pBlockSize);
            //pRaster.Read(pOffset,pb);

            // ISaveAs pSaveas = pRasterProps as ISaveAs2;
            // pSaveas.SaveAs(sDir + "\\" + sName, null, "TIFF");

            prasteredit.Refresh();


            return(pRDS);
        }
Пример #10
0
        private void MapUserIdentify(double mapX, double mapY)
        {
            try
            {
                //axMapControl1.Map.ClearSelection();
                ESRI.ArcGIS.Controls.IMapControl3 m_mapControl = (IMapControl3)axMapControl1.Object;
                IMap        pMap        = axMapControl1.Map;
                IGroupLayer pGroupLayer = new GroupLayer();

                if (pMap.LayerCount == 0)
                {
                    return;
                }
                IEnumLayer pEnumLayer;
                ILayer     pLayer;
                pEnumLayer = pMap.get_Layers(null, true);
                if (pEnumLayer == null)
                {
                    return;
                }
                pEnumLayer.Reset();
                double dCurrScale = m_mapControl.MapScale;
                for (pLayer = pEnumLayer.Next(); pLayer != null; pLayer = pEnumLayer.Next())
                {
                    if (pLayer.Visible)
                    {
                        if (pLayer is IGroupLayer)
                        {
                            continue;
                        }
                        if (pLayer.MinimumScale != 0 && dCurrScale > pLayer.MinimumScale)
                        {
                            continue;
                        }
                        if (pLayer.MaximumScale != 0 && dCurrScale < pLayer.MaximumScale)
                        {
                            continue;
                        }
                        pGroupLayer.Add(pLayer);
                    }
                }

                IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
                pPoint.X = mapX; pPoint.Y = mapY;
                IIdentifyObj        pIdObj;
                IIdentify           pIdentify = pGroupLayer as IIdentify;
                IArray              pIDArray;
                IFeatureIdentifyObj pFeatIdObj;

                IEnvelope pEnv             = pPoint.Envelope;
                IDisplayTransformation pDT = m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation;
                pEnv.Expand(pDT.VisibleBounds.Width / 200, pDT.VisibleBounds.Height / 200, false);

                pIDArray = pIdentify.Identify(pEnv);

                if (pIDArray == null || pIDArray.Count == 0)
                {
                    return;
                }

                pFeatIdObj = pIDArray.get_Element(0) as IFeatureIdentifyObj;
                pIdObj     = pFeatIdObj as IIdentifyObj;

                IRowIdentifyObject pRowIdentifyObj = pFeatIdObj as IRowIdentifyObject;
                IFeature           pFeature        = pRowIdentifyObj.Row as IFeature;
                if (pFeature != null && pFeature.Shape != null && !pFeature.Shape.IsEmpty)
                {
                    //axMapControl1.FlashShape(pFeature.Shape);
                    axMapControl1.Map.SelectFeature(pIdObj.Layer, pFeature);
                    FlashFeature(axMapControl1, pFeature.Shape);
                }

                //  pIdObj.Flash(m_mapControl.ActiveView.ScreenDisplay);//The Flash method is not supported with ArcGIS Engine, use the IHookActions.DoActions() method with the esriHookActionsFlash for this functionality.
                ILayer pIdentiyLayer = pIdObj.Layer;

                DataTable  pTable      = new DataTable();
                DataColumn pDataColumn = pTable.Columns.Add();
                pDataColumn.ColumnName = "列名";
                pDataColumn            = pTable.Columns.Add();
                pDataColumn.ColumnName = "值";

                DataRow pFirestDataRow = pTable.Rows.Add();
                pFirestDataRow[0] = "所在层";
                pFirestDataRow[1] = pIdentiyLayer.Name;

                if (pIdentiyLayer is IFeatureLayer)
                {
                    IRowIdentifyObject pRowObj = pIdObj as IRowIdentifyObject;
                    //   IRow pRow = pRowObj.Row;

                    IFeature pRow    = pRowObj.Row as IFeature;
                    IFields  pFields = pRow.Fields;

                    for (int i = 0; i < pFields.FieldCount; i++)
                    {
                        IField  pField   = pFields.get_Field(i);
                        DataRow pDataRow = null;

                        /*
                         * switch (pField.Type)
                         * {
                         *  case esriFieldType.esriFieldTypeOID:
                         *      pDataRow = pTable.Rows.Add();
                         *      pDataRow[0] = pField.Name;
                         *      pDataRow[1] = pRow.OID.ToString();
                         *      break;
                         *  case esriFieldType.esriFieldTypeGeometry:
                         *      //pDataRow[0] = "Geometry";
                         *      //pDataRow[1] = QueryShapeType(pField.GeometryDef.GeometryType);;
                         *      break;
                         *  default:
                         *      pDataRow = pTable.Rows.Add();
                         *      pDataRow[0] = pField.Name;
                         *      pDataRow[1] = pRow.get_Value(i).ToString();
                         *      break;
                         * }
                         * * */

                        //////////////////////////////////////////////////
                        string sValue   = pRow.get_Value(i).ToString();
                        string strFName = pField.AliasName.ToUpper();
                        string strUName = strFName.ToUpper();
                        if (strUName == "SHAPE" || strUName == "LENGTH" || strUName == "OBJECTID" || strUName == "ID" || strUName == "FNODE_" || strUName == "TNODE_" || strUName == "LPOLY_" || strUName == "RPOLY_" || strUName == "SDXL_" || strUName == "SDXL_ID" || strUName == "OBJECTID_1" || strUName == "FID")
                        {
                            continue;
                        }
                        else if (strUName == "SHAPE.LEN" || strUName == "SHAPE_LENG")
                        {
                            strFName = "几何长度";
                        }
                        else if (strUName == "SHAPE_AREA" || strUName == "SHAPE.AREA")
                        {
                            strFName = "多边形面积";
                        }
                        else if (strUName == "HEIGHT")
                        {
                            strFName = "高程";
                        }
                        else if (strUName == "NAME")
                        {
                            strFName = "名称";
                        }
                        else if (strUName == "TYPE")
                        {
                            strFName = "类型";
                        }
                        else if (strUName == "SUBTYPE")
                        {
                            strFName = "子类型";
                        }

                        if (strUName == "LENGTH" || strUName == "SHAPE.LEN")
                        {
                            IUnitConverter myUnit = new UnitConverterClass();
                            sValue = Math.Round(myUnit.ConvertUnits((double)pRow.get_Value(i), esriUnits.esriMeters, esriUnits.esriKilometers), 2).ToString();
                            sValue = sValue.ToString() + "千米";
                        }
                        if (strUName == "SHAPE_AREA" || strUName == "SHAPE.AREA")
                        {
                            IGeometry pGeo = pRow.ShapeCopy;
                            pGeo.Project(axMapControl1.Map.SpatialReference);
                            IPolygon pPolygon = (IPolygon)pGeo;
                            IArea    pArea    = (IArea)pPolygon;
                            double   strValue = pArea.Area * 0.000001;
                            //// double strValue = Math.Abs((double)pFeature.get_Value(j)) * 10585;
                            strValue = Math.Round(strValue, 2);
                            sValue   = strValue.ToString() + "平方千米";
                        }
                        esriFieldType tFieldTypy = pField.Type;
                        if (tFieldTypy == esriFieldType.esriFieldTypeGeometry)
                        {
                            sValue = pField.GeometryDef.GeometryType.ToString();
                            sValue = sValue.Substring(12, sValue.Length - 12);
                        }

                        pDataRow    = pTable.Rows.Add();
                        pDataRow[0] = strFName;
                        pDataRow[1] = sValue;

                        //////////////////////////////////////////////////
                    }
                }
                else if (pIdentiyLayer is ITinLayer)
                {
                    ITinLayer   pTinLayer   = (ITinLayer)pIdentiyLayer;
                    ITinSurface pTinSurface = (ITinSurface)pTinLayer.Dataset;
                    if (pTinSurface == null)
                    {
                        return;
                    }
                    ITinSurfaceElement pTinSurfaceElement = pTinSurface.GetSurfaceElement(pPoint);

                    if (pTinSurfaceElement == null)
                    {
                        return;
                    }
                    IFields pFields  = pTinLayer.Dataset.Fields;
                    DataRow pDataRow = null;

                    pDataRow    = pTable.Rows.Add();
                    pDataRow[0] = "高度";
                    pDataRow[1] = pTinSurfaceElement.Elevation.ToString();

                    pDataRow    = pTable.Rows.Add();
                    pDataRow[0] = "坡度";
                    pDataRow[1] = pTinSurfaceElement.SlopeDegrees.ToString();

                    pDataRow    = pTable.Rows.Add();
                    pDataRow[0] = "方向";
                    pDataRow[1] = pTinSurfaceElement.AspectDegrees.ToString();
                }

                if (pIdentiyLayer is IRasterLayer)
                {
                    MessageBox.Show("aa");
                }
                //ShowIndetify(pTable);
                //m_pMainform.ShowIndetify(pTable);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return;
            }
        }
Пример #11
0
        public static IRasterDataset TinToRaster(ITinAdvanced itinAdvanced_0,
                                                 esriRasterizationType esriRasterizationType_0, string string_0, string string_1, string string_2,
                                                 rstPixelType rstPixelType_0, double double_0, IEnvelope ienvelope_0, bool bool_0)
        {
            object obj3;
            IPoint lowerLeft = ienvelope_0.LowerLeft;

            lowerLeft.X -= double_0 * 0.5;
            lowerLeft.Y -= double_0 * 0.5;
            int                num              = ((int)Math.Round((double)(ienvelope_0.Width / double_0))) + 1;
            int                num2             = ((int)Math.Round((double)(ienvelope_0.Height / double_0))) + 1;
            IGeoDataset        dataset          = itinAdvanced_0 as IGeoDataset;
            ISpatialReference2 spatialReference = dataset.SpatialReference as ISpatialReference2;
            IRasterDataset     dataset2         = CreateRasterSurf(string_0, string_1, string_2, lowerLeft, num, num2, double_0,
                                                                   double_0, 1, rstPixelType_0, spatialReference, bool_0);
            IRawPixels   rawPixels = GetRawPixels(dataset2, 0);
            object       cache     = rawPixels.AcquireCache();
            ITinSurface  pSurface  = itinAdvanced_0 as ITinSurface;
            IRasterProps o         = rawPixels as IRasterProps;
            double       zMin      = itinAdvanced_0.Extent.ZMin;

            if (rstPixelType_0 == rstPixelType.PT_FLOAT)
            {
                obj3 = (float)(zMin - 1.0);
            }
            else
            {
                obj3 = (int)(zMin - 1.0);
            }
            o.NoDataValue = obj3;
            IPnt tlc  = new DblPnt();
            int  num4 = 2048;

            if (num < 2048)
            {
                num4 = num;
            }
            int num5 = 2048;

            if (num2 < 2048)
            {
                num5 = num2;
            }
            IPnt size = new DblPnt
            {
                X = num4,
                Y = num5
            };
            IPixelBlock3 block  = rawPixels.CreatePixelBlock(size) as IPixelBlock3;
            ITrackCancel cancel = new CancelTracker
            {
                CancelOnClick    = false,
                CancelOnKeyPress = true
            };
            int num6 = (int)(Math.Round((double)((num / num4) + 0.49)) * Math.Round((double)((num2 / num5) + 0.49)));

            if (num6 == 1)
            {
                itinAdvanced_0.TrackCancel = cancel;
            }
            IPoint point2 = new Point();
            object obj4   = block.get_PixelDataByRef(0);

            for (int i = 0; i < num2; i += num5)
            {
                for (int j = 0; j < num; j += num4)
                {
                    if ((num - j) < num4)
                    {
                        size.X = num - j;
                        block  = rawPixels.CreatePixelBlock(size) as IPixelBlock3;
                        obj4   = block.get_PixelDataByRef(0);
                    }
                    point2.X = (lowerLeft.X + (j * double_0)) + (double_0 * 0.5);
                    point2.Y = (lowerLeft.Y + ((num2 - i) * double_0)) - (double_0 * 0.5);
                    IGeoDatabaseBridge2 bridge = new GeoDatabaseHelper() as IGeoDatabaseBridge2;
                    bridge.QueryPixelBlock(pSurface, point2.X, point2.Y, double_0, double_0, esriRasterizationType_0,
                                           obj3, ref obj4);
                    tlc.X = j;
                    tlc.Y = i;
                    block.set_PixelData(0, obj4);
                    rawPixels.Write(tlc, block as IPixelBlock);
                }
                bool flag = false;
                if (size.X != num4)
                {
                    size.X = num4;
                    flag   = true;
                }
                if ((num2 - i) < num5)
                {
                    size.Y = num2 - i;
                    flag   = true;
                }
                if (flag)
                {
                    block = rawPixels.CreatePixelBlock(size) as IPixelBlock3;
                    obj4  = block.get_PixelDataByRef(0);
                }
            }
            rawPixels.ReturnCache(cache);
            Marshal.ReleaseComObject(cache);
            cache = null;
            Marshal.ReleaseComObject(rawPixels);
            rawPixels = null;
            Marshal.ReleaseComObject(block);
            block = null;
            Marshal.ReleaseComObject(o);
            o    = null;
            obj4 = 0;
            GC.Collect();
            return(dataset2);
        }
Пример #12
0
        public static IRasterDataset TinToRaster(ITinAdvanced itinAdvanced_0,
                                                 esriRasterizationType esriRasterizationType_0, string string_0, string string_1, rstPixelType rstPixelType_0,
                                                 double double_0, IEnvelope ienvelope_0, bool bool_0)
        {
            IPoint lowerLeft = ienvelope_0.LowerLeft;

            lowerLeft.X -= double_0 * 0.5;
            lowerLeft.Y -= double_0 * 0.5;
            int                num              = (int)Math.Round((double)((ienvelope_0.Width / double_0) + 1.0));
            int                num2             = (int)Math.Round((double)((ienvelope_0.Height / double_0) + 1.0));
            IGeoDataset        dataset          = itinAdvanced_0 as IGeoDataset;
            ISpatialReference2 spatialReference = dataset.SpatialReference as ISpatialReference2;
            IRasterDataset     dataset2         = CreateRasterSurf(string_0, string_1, "GRID", lowerLeft, num, num2, double_0,
                                                                   double_0, rstPixelType_0, spatialReference, true);
            IRasterBandCollection bands    = dataset2 as IRasterBandCollection;
            IRawPixels            pixels   = bands.Item(0) as IRawPixels;
            ITinSurface           pSurface = itinAdvanced_0 as ITinSurface;

            pSurface.RasterInterpolationMethod = esriSurfaceInterpolationType.esriNaturalNeighborInterpolation;
            IRasterProps props       = pixels as IRasterProps;
            object       noDataValue = props.NoDataValue;
            IPnt         tlc         = new DblPnt();
            int          num3        = 2048;
            int          num4        = 2048;

            if (num < 2048)
            {
                num3 = num;
            }
            if (num2 < num4)
            {
                num4 = num2;
            }
            IPnt size = new DblPnt
            {
                X = num3,
                Y = num4
            };
            IPixelBlock pxls   = pixels.CreatePixelBlock(size);
            object      block  = pxls.get_SafeArray(0);
            IPoint      point2 = new Point();

            for (int i = 0; i < num2; i += num4)
            {
                for (int j = 0; j < num; j += num3)
                {
                    if ((num - j) < num3)
                    {
                        size.X = num - j;
                        pxls   = pixels.CreatePixelBlock(size);
                        block  = pxls.get_SafeArray(0);
                    }
                    point2.X = (lowerLeft.X + (j * double_0)) + (double_0 * 0.5);
                    point2.Y = (lowerLeft.Y + ((num2 - i) * double_0)) - (double_0 * 0.5);
                    IGeoDatabaseBridge2 bridge = new GeoDatabaseHelper() as IGeoDatabaseBridge2;
                    bridge.QueryPixelBlock(pSurface, point2.X, point2.Y, double_0, double_0, esriRasterizationType_0,
                                           noDataValue, ref block);
                    tlc.X = j;
                    tlc.Y = i;
                    pxls.set_SafeArray(0, block);
                    pixels.Write(tlc, pxls);
                }
                bool flag = false;
                if (size.X != num3)
                {
                    size.X = num3;
                    flag   = true;
                }
                if ((num2 - i) < num4)
                {
                    size.Y = num2 - i;
                }
                if (flag)
                {
                    block = pixels.CreatePixelBlock(size).get_SafeArray(0);
                }
            }
            return(dataset2);
        }
Пример #13
0
        public static void QueryPixelBlock(ITinSurface itinSurface_0, double double_0, double double_1, double double_2,
                                           double double_3, esriRasterizationType esriRasterizationType_0, object object_0, object object_1)
        {
            int    length = ((float[, ])object_1).GetLength(0);
            int    num2   = ((float[, ])object_1).GetLength(1);
            IPoint pPoint = new Point();
            int    num3   = 0;

Label_0024:
            if (num3 >= num2)
            {
                return;
            }
            int num4 = 0;

            while (true)
            {
                if (num4 < length)
                {
                    pPoint.X = double_0 + (num4 * double_2);
                    pPoint.Y = double_1 - (num3 * double_3);
                    float slopeDegrees = 0f;
                    try
                    {
                        switch (esriRasterizationType_0)
                        {
                        case esriRasterizationType.esriDegreeSlopeAsRaster:
                            slopeDegrees = (float)itinSurface_0.GetSlopeDegrees(pPoint);
                            break;

                        case esriRasterizationType.esriPercentageSlopeAsRaster:
                            slopeDegrees = (float)itinSurface_0.GetSlopePercent(pPoint);
                            break;

                        case esriRasterizationType.esriDegreeAspectAsRaster:
                            slopeDegrees = (float)itinSurface_0.GetAspectDegrees(pPoint);
                            break;

                        case esriRasterizationType.esriElevationAsRaster:
                            slopeDegrees = (float)itinSurface_0.GetElevation(pPoint);
                            break;
                        }
                        if (!double.IsNaN((double)slopeDegrees))
                        {
                            ((float[, ])object_1)[num4, num3] = slopeDegrees;
                        }
                        else
                        {
                            ((float[, ])object_1)[num4, num3] = (float)object_0;
                        }
                    }
                    catch
                    {
                    }
                }
                else
                {
                    num3++;
                    goto Label_0024;
                }
                num4++;
            }
        }