【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(二)
五、Graphics layer
1、新增Graphics layer
Graphics layer用于显示用户自定义绘制的点、线、面图形。使用时确保xaml文件中Graphics layer定义在其它图层的下面,以确保它能显示在其它图层的上面。
<esri:Map x:Name="MyMap" Extent=", , , " >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayerID="."Url="http://../rest/./MapServer"/>
<esri:GraphicsLayer ID=”.” />
</esri:Map.Layers>
</esri:Map>
2、管理Graphics features
在Graphics layer上创建Graphics的步骤一般如下:
(1)获取Graphics layer
(2)创建或获取Graphic
(3)设置Graphic的Geometry
(4)应用Graphic的Symbol
(5)将Graphic添加到Graphics layers
代码如下:
GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
foreach (Graphic graphic in graphicsList)
{
graphic.Symbol = MySymbol;
graphicsLayer.Graphics.Add(graphic);
}
3、使用Draw surface
Draw surface用于获取Geometries,Geometries可添加到Graphics Layer或用作identify和buffer操作。
使用Draw surface,你必须
(1)设置绘图操作的Symbols
(2)设置Draw surface的地图
(3)执行逻辑以激活|解除surface
(4)处理Geometries,以在surface上绘图
示例代码如下:
xaml文件:
<Grid x:Name="LayoutRoot" Background="White">
<Grid.Resources>
<esriSymbols:SimpleFillSymbol x:Name="RedFillSymbol" Fill="#66FF0000" BorderBrush="Red" BorderThickness="2" />
</Grid.Resources>
<esri:Map …>
…
cs文件:
MyDrawObject = new Draw(MyMap)
{ LineSymbol =LayoutRoot.Resources["DrawLineSymbol"] as LineSymbol,
FillSymbol =LayoutRoot.Resources["DrawFillSymbol"] as FillSymbol };
MyDrawObject.DrawComplete += MyDrawObject_DrawComplete;
MyDrawObject.DrawMode = DrawMode.Polygon;
MyDrawObject.IsEnabled = true;
private void MyDrawObject_DrawComplete(object sender, ESRI.ArcGIS.Client.DrawEventArgs args)
{
Graphic graphic = new Graphic() { Geometry = args.Geometry, Symbol = RedFillSymbol };
GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
graphicsLayer.Graphics.Add(graphic);
}
4、Symbols和Renderers
Symbols定义了Graphic的非几何学方面的显示特性,如颜色、边框宽度、透明度等。
Renderers定义了一个或多个应用于Graphics layer的Symbols,指定哪些Graphics属性与哪个Symbol相符。
Symbols和Geometries类型:
|
Symbol |
Geometry |
描述 |
|
SimpleMarkerSymbol |
Point |
用简单形状来表现点 |
|
PictureMarkerSymbol |
Point |
用images来表现点 |
|
SimpleLineSymbol |
Polyline |
用预定义的风格来表现线 |
|
CartographicLineSymbol |
Polyline |
用定制的风格来表现线 |
|
SimpleFillSymbol |
Polygon |
用Silverlight Brush来填充多边形 |
|
PictureFillSymbol |
Polygon |
用images填充多边形 |
通常,视觉定义在xaml文件中,行为逻辑定义在.cs文件中,让表现层和业务逻辑层分开,使得应用程序更容易开发、维护和扩展。
Symbol的使用:
(1)添加命名空间:symbol类定义在ESRI.ArcGIS.Client.Symbols命名空间中(ESRI.ArcGIS.Client集)
xmlns:esriSymbols="clr-namespace:ESRI.ArcGIS.Client.Symbols;assembly=ESRI.ArcGIS.Client"
(2)xaml文件中定义Symbol
<Grid.Resources>
<esriSymbols:SimpleFillSymbol x:Name="MyRedFillSymbol" Fill="#66FF0000" BorderBrush="Red" BorderThickness="2" />
</Grid.Resources>
//Symbol运用于FeatureLayer
<esri:FeatureLayer ID="." Where="1=1" FeatureSymbol="{StaticResource MyRedFillSymbol}"
Url="http://./ArcGIS/rest/services/./MapServer/5" >
<esri:FeatureLayer.OutFields>
<sys:String>POP07_SQMI</sys:String>
</esri:FeatureLayer.OutFields>
</esri:FeatureLayer>
(3)cs文件中动态生成
SimpleFillSymbol fillSymbol = new SimpleFillSymbol()
{
BorderBrush = new SolidColorBrush(Color.FromArgb(0, 255, 0, 0)),
BorderThickness = 2,
Fill = new SolidColorBrush(Color.FromArgb(alphaVal, redVal, greenVal, blueVal))
};
//Symbol运用于GraphicsLayer的每一个graphic
GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
foreach (Graphic graphic in graphicsLayer.Graphics)
graphic.Symbol = fillSymbol;
创建Unique Value Renderer:
<Grid.Resources>
<esriSymbols:SimpleFillSymbol x:Name="a" Fill=""BorderBrush=""BorderThickness="" />
<esriSymbols:SimpleFillSymbol x:Name="b" Fill=""BorderBrush=""BorderThickness="" />
<esriSymbols:SimpleFillSymbol x:Name="c" Fill=""BorderBrush=""BorderThickness="" />
<esri:UniqueValueRenderer x:Name="abcRenderer" Attribute="STATE_NAME" >
<esri:UniqueValueRenderer.Infos>
<esri:UniqueValueInfo Value="California" Symbol="{StaticResource a}" />
<esri:UniqueValueInfo Value="New York" Symbol="{StaticResource b}" />
<esri:UniqueValueInfo Value="Kansas" Symbol="{StaticResource c}" />
</esri:UniqueValueRenderer.Infos>
</esri:UniqueValueRenderer>
</Grid.Resources>
// FeatureLayer中,指定一个过滤,仅仅California、New York、Kansas被绘制
//并且将其STATE_NAME字段的值显示在layer的Graphics中
<esri:FeatureLayer ID=""
Where="(STATE_NAME='California') OR (STATE_NAME='New York') OR (STATE_NAME = 'Kansas')"
Renderer="{StaticResource abcRenderer}"
Url="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5" >
<esri:FeatureLayer.OutFields>
<sys:String>STATE_NAME</sys:String>
</esri:FeatureLayer.OutFields>
</esri:FeatureLayer>
创建Class Breaks Renderer:即将symbol应用于一组指定范围的graphics中。
<Grid.Resources>
<esriSymbols:SimpleFillSymbol x:Name="a" Fill="" BorderBrush=""BorderThickness="" />
<esriSymbols:SimpleFillSymbol x:Name="b" Fill="" BorderBrush=""BorderThickness="" />
<esriSymbols:SimpleFillSymbol x:Name="c" Fill="" BorderBrush=""BorderThickness="" />
<esri:ClassBreaksRenderer x:Name="abcRenderer" Attribute="POP07_SQMI" >
<esri:ClassBreaksRenderer.Classes>
<esri:ClassBreakInfo MinimumValue="0" MaximumValue="50" Symbol="{StaticResource a}" />
<esri:ClassBreakInfo MinimumValue="51" MaximumValue="125" Symbol="{StaticResource b}" />
<esri:ClassBreakInfo MinimumValue="125" MaximumValue="2000" Symbol="{StaticResource c}" />
</esri:ClassBreaksRenderer.Classes>
</esri:ClassBreaksRenderer>
</Grid.Resources>
// FeatureLayer中,将renderer和Feature layer联系起来,进行地图绘制
//并且将其POP07_SQMI字段的值显示在layer的Graphics中
<esri:FeatureLayer ID="" Where="1=1" Renderer="{StaticResource abcRenderer}"
Url="http://./ArcGIS/rest/services/./MapServer/5" >
<esri:FeatureLayer.OutFields>
<sys:String>POP07_SQMI</sys:String>
</esri:FeatureLayer.OutFields>
</esri:FeatureLayer>
5、使用Clustering(聚类分组,用于render的数量很大时)
当点很多和密集时,使用Clustering将点分组,使得在cluster distance内的多个点用一个点代替。Clustering可用于GraphicsLayer和Feature Layer。
(1)使用FlareClusterer
FlareClusterer可按如下方式添加到GraphicsLayer和FeatureLayer中:
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.Clusterer>
<esri:FlareClusterer />
</esri:GraphicsLayer.Clusterer>
</esri:GraphicsLayer>
效果如下图:
FlareClusterer的属性如下表:
|
FlareClusterer属性 |
描述 |
|
FlareBackground |
填充的背景颜色(默认红色) |
|
FlareForeground |
边界和文字颜色(默认白色) |
|
MaximumFlareCount |
当鼠标移动到cluster时,各小点是否展开的最大数量界限 小于此值时,鼠标移上去会展开各小点;大于此值时,称为large clusters,其颜色和大小会根据点多少变化。(默认=10) |
|
Radius |
被cluster的半径,单位pixels(默认20) |
|
Gradient |
LinearGradientBrush线性渐变刷用于large clusters (默认:Default = LinearGradientBrush; MappingMode = RelativeToBoundingBox; GradientStop1: Offset = 0, Argb = 127,255,255,0, GradientStop2: Offset = 1, Argb = 127,255,0,0) |
示例:修改FlareClusterer的默认属性
<Grid.Resources>
<LinearGradientBrush x:Name="aGradient" MappingMode="RelativeToBoundingBox" >
<GradientStop Color="#990011FF" Offset="0"/>
<GradientStop Color="#990055FF" Offset="0.25"/>
<GradientStop Color="#990099FF" Offset="0.5"/>
<GradientStop Color="#9900CCFF" Offset="0.75"/>
<GradientStop Color="#9900FFFF" Offset="1"/>
</LinearGradientBrush>
</Grid.Resources>
<esri:Map x:Name="MyMap">
<esri:Map.Layers>
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.Clusterer>
<esri:FlareClusterer FlareBackground="Yellow" FlareForeground="#99000000"
MaximumFlareCount="5" Radius="15" Gradient="{StaticResource aGradient}" />
</esri:GraphicsLayer.Clusterer>
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
(2)扩展GraphicsClusterer
为了定制cluster的外观,你可以创建一个继承自ESRI.ArcGIS.Client.GraphicsClusterer的类,并重写OnCreateGraphic()方法来定义cluster graphic。示例代码如下:
public class SumClusterer : GraphicsClusterer
{
public SumClusterer()
{
MinimumColor = Colors.Red;
MaximumColor = Colors.Yellow;
SymbolScale = 1;
base.Radius = 50;
}
public string AggregateColumn { get; set; }
public double SymbolScale { get; set; }
public Color MinimumColor { get; set; }
public Color MaximumColor { get; set; }
protected override Graphic OnCreateGraphic(GraphicCollection cluster, MapPoint point, int maxClusterCount)
{
if (cluster.Count == 1) return cluster[0];
Graphic graphic = null;
double sum = 0;
foreach (Graphic g in cluster)
{
if (g.Attributes.ContainsKey(AggregateColumn))
{try{sum += Convert.ToDouble(g.Attributes[AggregateColumn]); }}
}
double size = (sum + 450) / 30;
size = (Math.Log(sum * SymbolScale / 10) * 10 + 20);
if (size < 12) size = 12;
graphic=new Graphic(){Symbol=new ClusterSymbol() {Size = size},Geometry= point};
graphic.Attributes.Add("Count", sum);
graphic.Attributes.Add("Size", size);
graphic.Attributes.Add("Color", InterpolateColor(size - 12, 100));
return graphic;
}
private static Brush InterpolateColor(double value, double max)
{
value = (int)Math.Round(value * 255.0 / max);
if (value > 255) value = 255;
else if (value < 0) value = 0;
return new SolidColorBrush(Color.FromArgb(127, 255, (byte)value, 0));
}
}
【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(二)的更多相关文章
- ArcGIS API for Silverlight/WPF 2.1学习笔记(一)——精简版
一.安装 1.Visual Studio: (1)Visual Studio 2010或Visual Web Developer Express 2010 (2)Silverlight 4 Tools ...
- 【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(一)
源自:http://blog.163.com/zwx_gis/blog/static/32434435201122193611576/ (主页:http://blog.163.com/zwx_gis/ ...
- 【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(四)
七.Editing ArcGIS Server 10提供了: 通过feature service,在Web上编辑Feature layers的geographic data的功能. 通过geome ...
- 【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(五)
2.Find示例代码 (1)xaml文件: //添加Symbol命名空间 xmlns:esriSymbols="clr-namespace:ESRI.ArcGIS.Client.Symbol ...
- 【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(三)
六.Feature Layer Feature Layer是一种特殊的Graphics layer(继承自Graphics layer),除了像Graphics layer一样包含和显示Graphic ...
- 扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注
原文 http://blog.csdn.net/esricd/article/details/7587136 在ArcGIS API for Silverlight/WPF中原版的TextSymbol ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- ArcGIS API for Silverlight学习笔记
ArcGIS API for Silverlight学习笔记(一):为什么要用Silverlight API(转) 你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我都 ...
- ArcGIS API for Silverlight开发入门
你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我 都没关系.但你不能否认3G是一种趋势,最终我们每个人都会被包裹在3G网络中.1100也不是一成不变,没准哪天为了打击 ...
随机推荐
- Azkaban学习笔记(一)
1. 任务调度概述 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后及前后依赖关系 现成的开源调 ...
- 日志处理(一) log4j 入门和详解(转)
log4j 入门. 详解 转自雪飘寒的文章 1. Log4j 简介 在应用程序中添加日志记录总的来说基于三 个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作 ...
- 远程获得的有趣的linux命令
使用这些工具从远程了解天气.阅读资料等. 我们即将结束为期 24 天的 Linux 命令行玩具日历.希望你有一直在看,如果没有,请回到开始,从头看过来.你会发现 Linux 终端有很多游戏.消遣和奇怪 ...
- 含有虚函数的类sizeof大小
#include <iostream> using namespace std; class Base1{ virtual void fun1(){} virtual void fun11 ...
- http协议/获得请求/中文参数处理/访问数据库
# 1. http协议(了解)## (1)什么是http协议?一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的的数据包的结构.注:tcp/ip协议:保证数据可靠的传递.(UDP不可 ...
- npm 查看全局安装过的包
查看全局安装的包 npm list -g --depth 0 非全局安装的包 npm list --depth 0 如果不加参数 --depth 0会显示安装的包以及相关的依赖包,会显示的很详细.
- 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解
20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...
- JavaScript:正则表达式 前瞻 找位置
js中全部都是顺序环视 顺序环视匹配过程 对于顺序肯定环视(?=Expression)来说,当子表达式Expression匹配成功时,(?=Expression)匹配成功,并报告(?=Expressi ...
- Linq 对List的一些操作
代码: public class Person { public int ID { get; set; } public string Name { get; set; } public int Ag ...
- 地宫取宝|2014年蓝桥杯B组题解析第九题-fishers
地宫取宝 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...