关闭

ArcGISPlotSilverlightAPI的标绘功能

标签: C#Silverlight地图
1271人阅读 评论(2) 收藏 举报
分类:

     ArcGISPlotSilverlightAPI.dll 提供了丰富的标绘图标,貌似不是esri的,网上也没有学习资料。

无奈之下我通过反编译学习,差不多掌握了ArcGISPlotSilverlightAPI的运用,下面就介绍下如何

使用。

演示网址:

http://tm.arcgisonline.cn:8038/App1/WaterPlot/SilverlightPlotMapTestPage.html

自定义Plot类:

    // 地图的标绘功能
    public class MapPlot
    {
        #region 字段
        //复杂标绘工具
        private PlotDraw _plotDraw;
        //简单标绘工具
        private Draw _draw;
        //地图对象
        private Map _mapObject;
        //线标注
        private LineSymbol _syLineSymbol;
        //面标注
        private FillSymbol _syFillSymbol;
        //图层
        private GraphicsLayer _gLayer;
        //标注枚举
        private MapPlotMode _plotMode;
        #endregion

        #region 构造函数
        public MapPlot(Map mapObject)
        {
            this._mapObject = mapObject;
            _plotDraw = new PlotDraw(this._mapObject);
            Layer _layer = this._mapObject.Layers.SingleOrDefault(a => string.IsNullOrEmpty(a.ID));
            if (_layer != null) _layer.ID = "_plotDraw";
            #region 保存标绘结果
            this._plotDraw.DrawEnd += (polygon, polyline) =>
               {
                   try
                   {
                       Graphic graphic;
                       //如果是面
                       if (polygon != null)
                       {
                           if (this._plotDraw.DrawMode == PlotDrawMode.CompassAndTarget)
                           {
                               graphic = new Graphic();
                               graphic.Symbol = _syFillSymbol;
                               graphic.Geometry = new Polygon();
                               for (int i = 0; i < (polygon.Rings.Count - 1); i++)
                               {
                                   (graphic.Geometry as Polygon).Rings.Add(polygon.Rings[i]);
                               }
                               this._gLayer.Graphics.Add(graphic);
                               if (polygon.Rings.Count > 4)
                               {
                                   Graphic item = new Graphic();
                                   item.Geometry = new Polygon();
                                   (item.Geometry as Polygon).Rings.Add(polygon.Rings[4]);
                               }
                           }
                           else
                           {
                               graphic = new Graphic();
                               graphic.Symbol = _syFillSymbol;
                               graphic.Geometry = polygon;
                               this._gLayer.Graphics.Add(graphic);
                           }
                       }
                       //如果是线
                       if (polyline != null)
                       {
                           graphic = new Graphic();
                           graphic.Geometry = polyline;
                           graphic.Symbol = _syLineSymbol;
                           this._gLayer.Graphics.Add(graphic);
                       }
                   }
                   catch { }
               };
            #endregion
            _draw = new Draw(this._mapObject);
            #region 保存标绘结果
            _draw.DrawComplete += (o, a) =>
               {
                   try
                   {
                       Graphic graphic = new Graphic();
                       graphic.Geometry = a.Geometry;
                       if (a.Geometry is ESRI.ArcGIS.Client.Geometry.Polygon)
                           graphic.Symbol = _syFillSymbol;
                       else
                           graphic.Symbol = _syLineSymbol;
                       _gLayer.Graphics.Add(graphic);
                   }
                   catch { }
               };
            #endregion
        }

        public MapPlot(Map mapObject, string htmlColor, double size)
            : this(mapObject)
        {
            //初始化标注
            InitSymbol(ColorManager.HtmlToColor(htmlColor), size);
        }
        #endregion

        #region 公共方法
        /// <summary>
        /// 设置标注
        /// </summary>
        public void InitSymbol(Color _color,double size)
        {            
            _syLineSymbol = new SimpleLineSymbol();
            _syLineSymbol.Color = new SolidColorBrush(_color);
            _syLineSymbol.Width = size;
            _syFillSymbol = new SimpleFillSymbol();
            LinearGradientBrush liner = new LinearGradientBrush();
            liner.Opacity = 0.8;
            liner.GradientStops.Add(new GradientStop() { Color = Colors.White, Offset = 0 });
            liner.GradientStops.Add(new GradientStop() { Color = _color, Offset = 1 });
            _syFillSymbol.Fill = liner;
            _syFillSymbol.BorderBrush = new SolidColorBrush(Colors.Black);
            _syFillSymbol.BorderThickness = 1;

            _draw.LineSymbol = _syLineSymbol;
            _draw.FillSymbol = _syFillSymbol;
        }
        /// <summary>
        /// 开始标绘
        /// </summary>
        public void StartPlot(GraphicsLayer gLayer, MapPlotMode mapPlotMode)
        {
            try
            {
                this._plotMode = mapPlotMode;
                //设置图层
                this._gLayer = gLayer;
                //枚举值
                int value = (int)mapPlotMode;
                //大于23使用简单标绘
                if (value > 23 && value <28)
                {
                    _plotDraw.setPlotDrawMode(PlotDrawMode.None);
                    _draw.IsEnabled = true;
                    _draw.LineSymbol = _syLineSymbol;
                    _draw.FillSymbol = _syFillSymbol;
                    _draw.DrawMode = (DrawMode)System.Enum.Parse(typeof(DrawMode), mapPlotMode.ToString(), false);
                }
                else if (value <= 23)  //复杂标绘
                {
                    _draw.IsEnabled = false;
                    _plotDraw.setPlotDrawMode((PlotDrawMode)System.Enum.Parse(typeof(PlotDrawMode), mapPlotMode.ToString(), false));
                }
                else  //文本标注
                {
                    _draw.IsEnabled = false;
                    _plotDraw.setPlotDrawMode(PlotDrawMode.None);
                    _mapObject.MouseClick += TextBoxPlot;
                }
            }
            catch { }
        }

        /// <summary>
        /// 文本标注
        /// </summary>
        private void TextBoxPlot(object sender, Map.MouseEventArgs e)
        {
            try
            {
                Graphic _g = new Graphic();
                if(this._plotMode == MapPlotMode.LTextBox)
                    _g.Symbol = CustomSymbols.GetLeftTxtMarker();
                else if(this._plotMode == MapPlotMode.RTextBox)
                    _g.Symbol = CustomSymbols.GetRightTxtMarker();
                _g.Geometry = e.MapPoint;
                _gLayer.Graphics.Add(_g);
            }
            catch { }
        }

        /// <summary>
        /// 结束标绘
        /// </summary>
        public void StopPlot()
        {
            _plotDraw.setPlotDrawMode(PlotDrawMode.None);
            _mapObject.MouseClick -= TextBoxPlot;
            _draw.IsEnabled = false;
        }

        public void DeletePlot(GraphicsLayer gLayer)
        {

        }
        #endregion
    }
懒得整理,直接贴代码了……

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Qt Qwt打点画图

源程序:FunCurve.h #ifndef FUNCURVE_H #define FUNCURVE_H #include #include #include #include na...
  • qustdjx
  • qustdjx
  • 2012-09-04 10:28
  • 6870

pandas中的绘图函数

摘自《利用python进行数据分析》——Wes McKinney 在pandas中,我们有行标签、列标签以及分组信息(可能有)。也就是说,要制作一张完整的图表,原本需要一大堆的matplotlib代...
  • hustqb
  • hustqb
  • 2017-01-13 17:32
  • 4621

QwtPolar 使用笔记(1)

QwtPolar 是Qt的一个第三方扩展控件,提供了极坐标下函数图形绘制的功能。我上一篇博客介绍了如何安装QwtPolar ,这次就写写如何使用QwtPolar 。 如果只是简单的用QwtPolar...
  • liyuanbhu
  • liyuanbhu
  • 2014-11-07 11:44
  • 5112

matplot 绘制图例和标注

#coding:utf8 import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1,2,50) y1 = 2*x +...
  • zh_JNU
  • zh_JNU
  • 2016-12-25 16:16
  • 1664

地图动态标绘--B/S应用(二)

作者:Sniper 动态标绘广泛应用于电力、通信和应急等多个行业和领域。它可以用形象生动的矢量符号描述各种业务对象,表示各种资源,还可以动态渲染业务进度和流程。
  • supermapsupport
  • supermapsupport
  • 2016-12-27 14:37
  • 1171

地图动态标绘--C/S应用

* 作者:小诗 *       动态标绘广泛应用于电力、通信和应急等多个行业和领域。它可以用形象生动的矢量符号描述各种业务对象,表示各种资源,还可以动态渲染业务进度和流程。SuperMap iObj...
  • supermapsupport
  • supermapsupport
  • 2016-09-29 16:13
  • 1956

标绘点、线导出含高程值的表格数据

点、线导出含高程值的表格  在标注的过程中,我们有时候需要导出的点信息里面包含高程值。 第一步:打开BIGEMAP软件,选在地图源【谷歌地球】,点击右上角【编辑】按钮,会出来标绘的图层管理(左边)...
  • nongkad51768
  • nongkad51768
  • 2017-07-27 14:36
  • 128

ArcGIS for Android示例解析之标绘-----DrawGraphicElements

DrawGraphicElements     在ArcGIS中除了显示不同地图,还有一块非常重要,就是这个实例要介绍的绘图,如:绘制点、线、面等图形。 废话少说直入主题,首先我们还是先来了解...
  • wozaifeiyang0
  • wozaifeiyang0
  • 2012-03-06 09:18
  • 8042

协同标绘在SuperMap中实现思路的探索

作者:爱古德拉 最近经常有客户来咨询协同标绘相关的问题,咨询实现思路。从功能应用上讲,协同标绘在军事指挥决策、作战规划、行动部署和执行监视、公共安全处理等方面具有重要的意义和作用。但是,功能实...
  • supermapsupport
  • supermapsupport
  • 2015-07-31 10:21
  • 1732

Flash图表控件FusionCharts如何在图表标绘非连续数据

你可能经常要以不完整的数据点绘制图表。例如,当绘制每月的销售图表时,你可能没有所有的月数据。所以,你可能只想以一个空白的区域来显示缺失的数据,不在这个区域中绘制任何东西。FusionCharts可以让...
  • u010270797
  • u010270797
  • 2013-08-19 15:02
  • 775
    个人资料
    • 访问:25722次
    • 积分:596
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:5篇
    • 译文:0篇
    • 评论:7条
    最新评论