完整 ArcGIS Server 专题图的实现(转载)

简介:
ContractedBlock.gif ExpandedBlockStart.gif Code
  public static int getLayerId(string name, ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc)
    {
        
string[] lids;
        
string[] lnames;
        qfunc.GetQueryableLayers(
nullout lids, out lnames);
        
int layerid = 0;
        
for (int i = 0; i < lnames.Length; i++)
        {
            
if (lnames[i] == name)
            {
                
int.TryParse((string)lids[i], out layerid);
            }
        }
        
return layerid;
    }

    
protected void Button1_Click(object sender, EventArgs e)
    {
        
string resultstr = "";
        
int gisresource_index = 1;
        
string queryLayername = "usa_way";
        ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf 
= (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)Map1.GetFunctionality(gisresource_index);
        ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality ags_mf 
= (ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality)mf;
        ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource 
= mf.Resource;
        
bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
        
int layerid = 1;
        
if (supported)
        {            
            ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc 
= (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
            ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceBase ags_mr 
= (ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceBase)qfunc.Resource;

            layerid 
= MapUtil.getLayerId(queryLayername, qfunc);

        }
        ChartRender c 
= new ChartRender(this.Map1, this.Toc1);
        c.CreatePieRenderer(layerid, 
new string[] { "记录号"});



using System;
using System.Data;
using System.Web;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer;
using ESRI.ArcGIS.ADF.Connection.AGS;
using ESRI.ArcGIS.Server;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.ADF.Web.UI.WebControls;

/// BarChartRender 的摘要说明
public class ChartRender
{
    
private ESRI.ArcGIS.ADF.Web.UI.WebControls.Map pMap;
    
private ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc pToc;
    
private IServerContext pServerContext;
    
private MapResourceLocal pMapResLocal;
    
private IGeoFeatureLayer pGeoFeatureLyer;

    
public ChartRender()
    {
    }

    
public ChartRender(ESRI.ArcGIS.ADF.Web.UI.WebControls.Map map, Toc toc)
    {
        pMap 
= map;
        pToc 
= toc;
    }

    
/// <summary>
    
/// 获取当前map的servercontext
    
/// </summary>
    
/// <returns></returns>
    IServerContext GetServetContext()
    {
        
try
        {
            MapFunctionality pMapFunc 
= pMap.GetFunctionality(pMap.MapResourceManagerInstance.ResourceItems.Count - 1as MapFunctionality;
            MapDescription pMapDesc 
= pMapFunc.MapDescription as MapDescription;

            pMapResLocal 
= pMapFunc.MapResource as MapResourceLocal;
            
return pMapResLocal.ServerContextInfo.ServerContext;
        }
        
catch (Exception ex)
        {
            
throw new Exception("Fail to get the servercontext!");
        }
    }

    
/// <summary>
    
/// 创建柱状专题图表
    
/// </summary>
    
/// <param name="layerID"></param>
    
/// <param name="fields"></param>
    public void CreateBarRenderer(int layerID, string[] fields)
    {
        
try
        {
            pServerContext 
= GetServetContext();
            MapServer pMapServer 
= pMapResLocal.MapServer as MapServer;
            IMapServerObjects pMapServerObj 
= pMapServer as IMapServerObjects;
            
string mapName = pMapServer.get_MapName(0);
            ILayer pLayer 
= pMapServerObj.get_Layer(mapName, layerID);
            pGeoFeatureLyer 
= pLayer as IGeoFeatureLayer;

            
//设置专题图元素的属性名称列表           
            IChartRenderer pChartRender = pServerContext.CreateObject("esriCarto.ChartRenderer"as IChartRenderer;
            IRendererFields pRenderFields 
= pChartRender as IRendererFields;
            
foreach (string var in fields)
            {
                pRenderFields.AddField(var, var);
            }

            
//实例化图表对象并取得元素指定属性的最大值
            IBarChartSymbol pBarChartSymbol = pServerContext.CreateObject("esriDisplay.BarChartSymbol"as IBarChartSymbol;
            IChartSymbol pChartSymbol 
= pBarChartSymbol as IChartSymbol;
            pChartSymbol.MaxValue 
= GetStaMaxMin(fields)[0];
            pBarChartSymbol.Width 
= 8;
            IMarkerSymbol pMarkerSymbol 
= pBarChartSymbol as IMarkerSymbol;
            pMarkerSymbol.Size 
= 50;

            
//设置柱状图每列填充效果
            ISymbolArray pSymbolArray = pBarChartSymbol as ISymbolArray;
            Random ranColor 
= new Random();
            
for (int i = 0; i < fields.Length; i++)
            {
                IFillSymbol pFillSymbol 
= pServerContext.CreateObject("esriDisplay.SimpleFillSymbol"as IFillSymbol;
                pFillSymbol.Color 
= GetRGB(ranColor.Next(255), ranColor.Next(255), ranColor.Next(255));
                pSymbolArray.AddSymbol((ISymbol)pFillSymbol);
            }

            
//设置地图图层背景
            ISimpleFillSymbol pFSymbol = pServerContext.CreateObject("esriDisplay.SimpleFillSymbol"as SimpleFillSymbol;
            pFSymbol.Color 
= GetRGB(239228249);
            pChartRender.BaseSymbol 
= pFSymbol as ISymbol;

            
//应用柱状专题到指定图层
            pChartRender.ChartSymbol = pBarChartSymbol as IChartSymbol;
            pChartRender.Label 
= "Test";
            pChartRender.UseOverposter 
= false;
            pChartRender.CreateLegend();
            pGeoFeatureLyer.Renderer 
= pChartRender as IFeatureRenderer;

            
//刷新地图显示图表及图例
            pMap.Refresh();
            pToc.Refresh();
            pToc.ExpandDepth 
= 2;

        }
        
catch (Exception ex)
        {
            
throw new Exception("Fail to create bar chart!");
        }
    }

    
/// <summary>
    
/// 创建饼状专题地图
    
/// </summary>
    
/// <param name="layerID"></param>
    
/// <param name="fields"></param>
    public void CreatePieRenderer(int layerID, string[] fields)
    {
        
try
        {
            pServerContext 
= GetServetContext();
            MapServer pMapServer 
= pMapResLocal.MapServer as MapServer;
            IMapServerObjects pMapServerObj 
= pMapServer as IMapServerObjects;
            
string mapName = pMapServer.get_MapName(0);
            ILayer pLayer 
= pMapServerObj.get_Layer(mapName, layerID);
            pGeoFeatureLyer 
= pLayer as IGeoFeatureLayer;

            
//设置专题图元素的属性名称列表           
            IChartRenderer pChartRender = pServerContext.CreateObject("esriCarto.ChartRenderer"as IChartRenderer;
            IRendererFields pRenderFields 
= pChartRender as IRendererFields;
            
foreach (string var in fields)
            {
                pRenderFields.AddField(var, var);
            }
           

            
//实例化图表对象并取得元素指定属性的最大值
            IPieChartSymbol pPieChartSymbol = pServerContext.CreateObject("esriDisplay.PieChartSymbol"as IPieChartSymbol;
            IChartSymbol pChartSymbol 
= pPieChartSymbol as IChartSymbol;
            pPieChartSymbol.Clockwise 
= true;
            pPieChartSymbol.UseOutline 
= true;
            pChartSymbol.MaxValue 
= GetStaMaxMin(fields)[0];
            
//设置饼图外围线
            ISimpleLineSymbol pOutLine = pServerContext.CreateObject("esriDisplay.SimpleLineSymbol"as ISimpleLineSymbol;
            pOutLine.Color 
= GetRGB(2550255);
            pOutLine.Style 
= esriSimpleLineStyle.esriSLSSolid;
            pOutLine.Width 
= 1;
            pPieChartSymbol.Outline 
= pOutLine;
            IMarkerSymbol pMarkerSymbol 
= pPieChartSymbol as IMarkerSymbol;
            pMarkerSymbol.Size 
= 25;

            
//设置饼状图外围填充效果
            ISymbolArray pSymbolArray = pPieChartSymbol as ISymbolArray;
            ISimpleFillSymbol pFSymbol 
= pServerContext.CreateObject("esriDisplay.SimpleFillSymbol"as SimpleFillSymbol;
            pFSymbol.Color 
= GetRGB(213212252);
            pFSymbol.Outline 
= pOutLine;
            
//设置饼状图每列填充效果
            Random ranColor = new Random();
            
for (int i = 0; i < fields.Length; i++)
            {
                IFillSymbol pFillSymbol 
= pServerContext.CreateObject("esriDisplay.SimpleFillSymbol"as IFillSymbol;
                pFillSymbol.Color 
= GetRGB(ranColor.Next(255), ranColor.Next(255), ranColor.Next(255));
                pSymbolArray.AddSymbol((ISymbol)pFillSymbol);
            }

            
//设置地图图层背景
            pFSymbol = pServerContext.CreateObject("esriDisplay.SimpleFillSymbol"as SimpleFillSymbol;
            pFSymbol.Color 
= GetRGB(239228249);
            pChartRender.BaseSymbol 
= pFSymbol as ISymbol;

            
//设置饼状图表属性
            IPieChartRenderer pPieChartRenderer = pChartRender as IPieChartRenderer;
            pPieChartRenderer.MinValue 
= 453588;
            pPieChartRenderer.MinSize 
= 10;
            pPieChartRenderer.FlanneryCompensation 
= false;
            pPieChartRenderer.ProportionalBySum 
= true;
            pPieChartRenderer.ProportionalField 
= fields[0];
            pChartRender.ChartSymbol 
= pPieChartSymbol as IChartSymbol;
            pChartRender.Label 
= "Population";

            
//应用饼状专题到指定图层
            pChartRender.UseOverposter = false;
            pChartRender.CreateLegend();
            pGeoFeatureLyer.Renderer 
= pChartRender as IFeatureRenderer;

            
//刷新地图显示图表及图例
            pMap.Refresh();
            pToc.Refresh();
        }
        
catch (Exception ex)
        {
            
throw new Exception("Fail to create bar chart!");
        }
    }

    
/// <summary>
    
/// 计算元素指定属性的最大值
    
/// </summary>
    
/// <param name="fields">元素的属性名称列表</param>
    
/// <returns></returns>
    double[] GetStaMaxMin(string[] fields)
    {
        
double pMaxValue = 0;
        
double pMinValue = 0;
        
double pStaMax;
        
double pStaMin;
        
double[] PMaxMin = new double[2];

        
for (int i = 0; i < fields.Length; i++)
        {
            ICursor pCursor 
= pGeoFeatureLyer.Search(nulltrueas ICursor;
            IDataStatistics pDataSta 
= new DataStatisticsClass();
            pDataSta.Cursor 
= pCursor;
            pDataSta.Field 
= fields[i];
            pStaMax 
= pDataSta.Statistics.Maximum;
            pStaMin 
= pDataSta.Statistics.Minimum;
            
if (pMaxValue < pStaMax)
            {
                pMaxValue 
= pStaMax;
            }
            
if (pMinValue > pStaMin)
            {
                pMinValue 
= pStaMin;
            }
        }
        PMaxMin[
0= pMaxValue;
        PMaxMin[
1= pMinValue;

        
return PMaxMin;
    }

    
/// <summary>
    
/// 获取GRB颜色
    
/// </summary>
    
/// <param name="red"></param>
    
/// <param name="green"></param>
    
/// <param name="blue"></param>
    
/// <returns></returns>
    IColor GetRGB(int red, int green, int blue)
    {
        IRgbColor rgbColor 
= pServerContext.CreateObject("esriDisplay.RGBColor"as IRgbColor;
        IColor color 
= rgbColor as IColor;
        rgbColor.Red 
= red;
        rgbColor.Green 
= green;
        rgbColor.Blue 
= blue;
        
return color;
    }
}

 

以上代码也是来自社区里的代码,测试可以运行。
但是有个严重问题,
1、饼状图绘完后不能清除(除非重启服务)
2、不能再次设置新的render(出现ComException),尝试release com对象,出现com 与RCW不能分开的提示,也就是不能手动release com

这么多问题存在,这个chartRender基本还是不敢使用,大家研究研究。

版权说明

  如果标题未标有<转载、转>等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。
  作      者:温景良
  文章出处:http://wenjl520.cnblogs.com/  或  http://www.cnblogs.com/

posted @ 2009-02-03 18:35 温景良(Jason) Views( 2891) Comments( 2) Edit 收藏

  
#1楼 2009-09-20 10:41 | yuan123
你好,我有些问题想问你,我用了你的这个方法,可是有些地方不太明白, layerid = MapUtil.getLayerId(queryLayername, qfunc);其中MapUtil是指什么?
c.CreatePieRenderer(layerid, new string[] { "记录号"});还有这个"记录号"是什么?

  
#2楼 2210095 2011/9/28 16:22:32 2011-09-28 16:22 | Arking  
良兄,能否把你那地图和项目打个包供下载啊?

公告

 
本文转自  

我的程序人生博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2009/02/03/1383370.html,如需转载请自行联系原作者

 
相关文章
|
定位技术
一步到位, ArcGIS Pro区位图教学来啦
一步到位, ArcGIS Pro区位图教学来啦
313 0
|
7月前
|
数据采集 存储 定位技术
ArcGIS校园3D展示图制作详细教程
ArcGIS校园3D展示图制作详细教程
86 0
|
7月前
|
SQL 定位技术 索引
ArcGIS上海市行政区划图制作
ArcGIS上海市行政区划图制作
153 0
|
7月前
|
定位技术
ENVI结合ArcGIS制作2001-2018年NDVI趋势图(附实用工具和数据下载)
ENVI结合ArcGIS制作2001-2018年NDVI趋势图(附实用工具和数据下载)
83 0
|
10月前
|
定位技术 数据格式
GIS开发:arcgis server发布CGCS2000切片
GIS开发:arcgis server发布CGCS2000切片
159 0
|
10月前
|
编解码 数据可视化 定位技术
ArcGIS应用基础4 专题图的制作
😉🏆🏆在本文中,作者以人口密度图为例,详细讲解了基于ArcGIS布局视图下专题图制作的流程,介绍了地图要素的配置。
117 0
ArcGIS应用基础4 专题图的制作
|
数据可视化 定位技术
ArcGIS Pro曲线OD图
ArcGIS Pro曲线OD图
206 0
【ArcGIS制图案例】城市关系强度图
【ArcGIS制图案例】城市关系强度图
89 0
|
定位技术
GIS教程—ArcGIS等温线图制作
大家好,我是南南的女朋友图片 今天是我做的GIS教程第二期,ArcGIS等温线图制作
283 0
|
缓存 定位技术
GIS开发:arcgis server切片数据和wmts
GIS开发:arcgis server切片数据和wmts
128 0