ArcGISPlotSilverlightAPI的标绘功能
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
}
懒得整理,直接贴代码了……
转载自:https://blog.csdn.net/zxian610/article/details/9815975