天天看點

AO調用挂載soe的server服務的,指定圖層的指定範圍的圖檔

實作效果如下:

AO調用挂載soe的server服務的,指定圖層的指定範圍的圖檔

最開始說要寫這個功能的時候,還挺煩躁的。因為好久沒有沒有動腦子寫AO功能了,習慣了搬磚~(萬年也寫一篇部落格,今天實在沒啥事覺得寫一篇,嘿嘿嘿~)

然後百度了網上的一些案例,發現多多少燒走到某一步的時候,就發現不是少了這個參數就是少了哪個參數。然後自己要去補全這些東西,它們到底是怎麼來的,然後就補全了。

因為soe測試比較麻煩,其他的功能我都再測試程式調試好,再保class放到真正的soe程式裡邊直接運作的。

一、既然是導出server中的指定圖層指定範圍的圖檔,那soe所挂載的這個server必須有這個圖層名稱,名稱必須是SDE庫原來的名稱!

二、再然後就是導出的時候,控制server圖層的顯示。

三、就是範圍了,不能直接整個指定範圍導出吧,就像我上邊的截圖,也需要周邊的一些内容,還需要畫出範圍本身的這個紅線。

/// <summary>
        /// 調用soe挂載的server服務地圖,并導出為圖檔流
        /// </summary>
        /// <param name="serverObjectHelper">目前SOE挂載在的server服務</param>
        /// <param name="pGeometry">目前地塊的幾何範圍</param>
        /// <param name="pFeatClsNames">目前調用服務使用到的圖層名稱</param>
        /// <returns></returns>
        public static string fnExportImgbyte(IServerObjectHelper  serverObjectHelper, IGeometry pGeometry, List<string> pFeatClsNames)
        {
            try
            {
                string imgbyte = string.Empty;
                //--------1、擷取soe挂載的地圖服務
                IMapServer3 pMapServer =  (IMapServer3)serverObjectHelper.ServerObject;
                //--------2、設定輸出圖檔格式,并導出服務圖檔流----功能有效
                #region 設定輸出圖檔格式
                IImageType imgtype = new ImageTypeClass();
                imgtype.Format = esriImageFormat.esriImagePNG;
                imgtype.ReturnType = esriImageReturnType.esriImageReturnMimeData;
                //imgtype.ReturnType = esriImageReturnType.esriImageReturnURL;
                IImageDisplay imgdisp = new ImageDisplayClass();
                imgdisp.Height = 400;
                imgdisp.Width = 500;
                imgdisp.DeviceResolution = 150;
                IImageDescription imgdesc = new ImageDescriptionClass();
                imgdesc.Display = imgdisp;
                imgdesc.Type = imgtype;
                #endregion
                IMapServerInfo pMapServerInfo =  pMapServer.GetServerInfo(pMapServer.DefaultMapName);
                IMapDescription pMapDescription =  pMapServerInfo.DefaultMapDescription;
                IMapLayerInfos layerInfos =  pMapServer.GetServerInfo(pMapServer.DefaultMapName).MapLayerInfos;//擷取目前服務的所有圖層
                //IMapServerDataAccess dataAccess =  (IMapServerDataAccess)pMapServer;//擷取指定id的圖層的矢量資料
                //IFeatureClass pfeatureclass =  (IFeatureClass)dataAccess.GetDataSource(pMapServer.DefaultMapName,  Layerindex);//擷取指定id的圖層的矢量資料
                //--------3、設定導出圖檔的範圍為地塊範圍
                #region 設定導出圖檔的範圍為地塊範圍----功能有效
                IMapArea pMapArea = pMapDescription.MapArea;
                IEnvelope pExtent = (pGeometry as IPolygon).Envelope;
                pExtent.Expand(1.1, 1.1, true);
                IMapExtent pMapExtent = (IMapExtent)pMapArea;
                pMapExtent.Extent = pExtent;
                pMapDescription.MapArea = pMapArea;
                #endregion
                //--------4、控制圖層顯示
                #region 控制圖層顯示----功能有效
                //--------4-1、擷取每個矢量圖層的名稱SDE.--
                List<int> pLayerIDs = new List<int>();//目前調用服務參數,使用到的圖層id
                IMapLayerInfo layerInfo;
                for (int i = 0; i < layerInfos.Count; i++)
                {
                    layerInfo = layerInfos.get_Element(i);
                    foreach (string str in pFeatClsNames)
                    {
                        if (str.Trim().ToUpper() == layerInfo.Name.ToUpper())
                        {
                            pLayerIDs.Add(i);
                        }
                    }
                }
                //--------4-2、目前soe使用的圖層顯示,其他隐藏
                ILayerDescriptions pLayerDescriptions =  pMapDescription.LayerDescriptions;
                for (int i = 0; i < pLayerDescriptions.Count; i++)
                {
                    bool flage = false;
                    foreach (int id in pLayerIDs)
                    {
                        if (i == id)
                        {
                            flage = true;
                        }
                    }
                    ILayerDescription pLayerDescription =  pLayerDescriptions.get_Element(i);
                    pLayerDescription.Visible = flage;
                }
                #endregion
                //5、導出圖檔前,添加地塊元素
                #region 添加地塊元素
                IPolygonElement PolygonElement = new PolygonElementClass();
                IElement pElement = PolygonElement as IElement;
                pElement.Geometry = pGeometry;
                //設定地塊元素樣式
                IFillShapeElement pFillShapeElement = (IFillShapeElement)pElement;
                ISymbol pSymbol = CreateSimpleFillSymbol(Color.Red, 100,  esriSimpleFillStyle.esriSFSNull);
                pFillShapeElement.Symbol = (IFillSymbol)pSymbol;
                //新增到地圖服務
                IGraphicElements pGraphicElements = new GraphicElementsClass();
                pGraphicElements.Add(pElement as IGraphicElement);
                pMapDescription.CustomGraphics = pGraphicElements;
                #endregion
                IImageResult pImageResult =  pMapServer.ExportMapImage(pMapDescription, imgdesc);
                byte[] pMimeData = pImageResult.MimeData;//圖檔流
                imgbyte = Convert.ToBase64String(pMimeData);//圖檔流轉字元串
                //imgbyte = pImageResult.URL;//圖檔位址
                return imgbyte;
            }
            catch (Exception ex) { return "fnExportImgbyte方法報錯:" +  ex.ToString(); }
        }
        /// <summary>
        /// 設定面元素樣式
        /// </summary>
        /// <param name="fillColor"></param>
        /// <param name="oLineWidth"></param>
        /// <param name="fillStyle"></param>
        /// <returns></returns>
        public static ISymbol CreateSimpleFillSymbol(Color fillColor, int  oLineWidth, esriSimpleFillStyle fillStyle)
        {
            ISimpleFillSymbol pSimpleFillSymbol;
            pSimpleFillSymbol = new SimpleFillSymbol();
            pSimpleFillSymbol.Style = fillStyle;
            pSimpleFillSymbol.Color = GetColor(fillColor.R, fillColor.G,  fillColor.B);
            pSimpleFillSymbol.Outline =  (ILineSymbol)CreateSimpleLineSymbol(fillColor, 1,  esriSimpleLineStyle.esriSLSDash);
            return (ISymbol)pSimpleFillSymbol;
        }
        /// <summary>
        /// 擷取顔色
        /// </summary>
        /// <param name="r"></param>
        /// <param name="g"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static IRgbColor GetColor(int r, int g, int b)
        {
            RgbColor color = new RgbColor();
            color.Red = r;
            color.Green = g;
            color.Blue = b;
            return color;
        }
        /// <summary>
        /// 建立線樣式
        /// </summary>
        /// <param name="color"></param>
        /// <param name="width"></param>
        /// <param name="style"></param>
        /// <returns></returns>
        public static ISymbol CreateSimpleLineSymbol(Color color, int width,  esriSimpleLineStyle style)
        {
            ISimpleLineSymbol pSimpleLineSymbol;
            pSimpleLineSymbol = new SimpleLineSymbol();
            pSimpleLineSymbol.Width = width;
            pSimpleLineSymbol.Color = GetColor(color.R, color.G, color.B);
            pSimpleLineSymbol.Style = style;
            return (ISymbol)pSimpleLineSymbol;
        }
           

繼續閱讀