在silverlight api中测距和测面积有多种实现方式,
第一种,使用GeometryServer服务;
第二种,使用行为动作MeasureAction;
第三种,使用ESRI.ArcGIS.Client.Geometry.Euclidian类;
我主要说说第三种实现方式,前两种网上已经有很多资料了。
代码如下:
private Draw _DrawTool;
private EventHandler<DrawEventArgs> _DrawComplete;
//测距
public void Ranging(EventHandler<DrawEventArgs> drawComplete = null)
{
if (drawComplete == null) drawComplete = Ranging_Complete;
CreateFreeBursh(drawComplete);
_DrawTool.DrawMode = DrawMode.Polyline;
OpenFreeBursh();
}
private void Ranging_Complete(object sender, DrawEventArgs e)
{
double length = Math.Abs(ESRI.ArcGIS.Client.Geometry.Euclidian.Length(e.Geometry as Polyline));
if (length > 0)
{
this.Graphics.Add(new Graphic()
{
Geometry = e.Geometry,
Symbol = new SimpleLineSymbol() { Color = new SolidColorBrush(Colors.Red), Width = 2 },
});
this.Graphics.Add(new Graphic()
{
Geometry = (e.Geometry as Polyline).Paths.LastOrDefault().LastOrDefault(),
Symbol = new TextSymbol() { Text = string.Format("{0:F} km", length / 1000), FontFamily = new FontFamily("SimSun"), FontSize = 13 },
});
}
}
//测面积
public void Polygon(EventHandler<DrawEventArgs> drawComplete = null)
{
if (drawComplete == null) drawComplete = Polygon_Complete;
CreateFreeBursh(drawComplete);
_DrawTool.DrawMode = DrawMode.Polygon;
OpenFreeBursh();
}
private void Polygon_Complete(object sender, DrawEventArgs e)
{
double area = Math.Abs(ESRI.ArcGIS.Client.Geometry.Euclidian.Area(e.Geometry as Polygon));
if (area > 0)
{
this.Graphics.Add(new Graphic()
{
Geometry = e.Geometry,
Symbol = new SimpleFillSymbol() { Fill = new SolidColorBrush(AppColorManager.HtmlToColor("#22FF0000")), BorderBrush = new SolidColorBrush(Colors.Red), BorderThickness = 2 }
});
this.Graphics.Add(new Graphic()
{
Geometry = (e.Geometry as Polygon).Rings.LastOrDefault().FirstOrDefault(),
Symbol = new TextSymbol() { Text = string.Format("{0:F} km2", area / 1000000), FontFamily = new FontFamily("SimSun"), FontSize = 13 },
});
}
}