實作效果如下:
最開始說要寫這個功能的時候,還挺煩躁的。因為好久沒有沒有動腦子寫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;
}