我们与地图交互的过程时刻在进行着:一个拉框放大操作,或者对地图内容的查询等。这些交互过程中的输入输出,通常都是反映在独立于地图数据一个“层”上。比如拉框放大,我们能看见鼠标所画的一个矩形;又比如对兴趣点的查询,结果通常是将符合条件的兴趣点的形状高亮显示在那个独立的“层”中,通过它既可以反映用户的输入,又可以展现地图的输出。这个“层”就是Graphicslayer。其实ADF开发中也有Graphicslayer的概念,同样在其他两个客户端API(JavaScript/Flex)中也能找到Graphicslayer的身影,它们都是一样一样的。
本节我们主要看如何在Graphicslayer中展现内容。当然第一个工作就是添加ESRI.ArcGIS.dll的引用,引入esri的xml命名空间;接下来在Map中添加一个Graphicslayer图层:
- <esri:Map x:Name="Map1">
- <esri:Map.Layers>
- <!-- 其他图层 -->
- <esri:Graphicslayer ID="GLayer" />
- </esri:Map.Layers>
- </esri:Map>
要让一个Graphic显示出来,总共分3步:
1、定义Graphic:
在xaml中
- <esri:Graphic>
- </esri:Graphic>
Graphic g= new Graphic()
2、设置Graphic的Geometry和Symbol属性:
- <esri:Graphic.Symbol>
- <esriSymbols:SimpleMarkerSymbol Color="Blue" Size="12" Style="Square" />
- </esri:Graphic.Symbol>
- <esriGeometry:MapPoint X="108" Y="30" />
- 复制代码
- Graphic g = new Graphic()
- {
- Geometry = new MapPoint(108,30),
- Symbol = new SimpleMarkerSymbol()
- Color = new SolidColorBrush(Colors.Blue),255)">Size = 12,255)">Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square
- }
- };
图中还有其他的图形,无非是改变了Graphic的Geometry和Symbol属性。图上的那只灰熊是一段动画文件,利用Silverlight的特性,能够定义出表现力丰富的各种符号。
尽管能够完全在xaml中来完成工作,但还是建议将可视化元素的定义放在xaml中,将实现的逻辑部分放在code-behind中。看一下添加图中那些Graphic的代码:
- <Grid.Resources>
- <esriSymbols:SimpleMarkerSymbol x:Name="RedMarkerSymbol" Color="Red" Size="12" Style="Circle" />
- <!-- 可惜目前Silverlight只支持Jpeg和PNG格式的图像,所以PictureMarkerSymbol无法显示GIF格式的图像,否则会报ImagingError的错误 -->
- <esriSymbolsictureMarkerSymbol x:Name="PinPictureMarkerSymbol" Source="imgs/pin.png" OffsetX="10" OffsetY="10" />
- <esriSymbols:SimpleLinesymbol x:Name="RedLinesymbol" Color="Red" Width="4" Style="Solid" />
- <esriSymbols:CartographicLinesymbol x:Name="CartoLinesymbol" Color="Red" Width="10" DashCap="Triangle" LineJoin="Round" DashArray="6,2" />
- <esriSymbols:SimpleFillSymbol x:Name="RedFillSymbol" Fill="#66FF0000" BorderBrush="Red" BorderThickness="2" />
- </Grid.Resources>
- <MediaElement x:Name="BearVideo" />
- private void AddGraphics()
- Graphic[] graphics = new Graphic[8];
- graphics[0] = new Graphic()
- Symbol = RedMarkerSymbol
- graphics[1] = new Graphic()
- graphics[2] = new Graphic()
- Symbol = PinPictureMarkerSymbol
- graphics[3] = new Graphic()
- Symbol = new TextSymbol()
- FontFamily = new FontFamily("微软雅黑,宋体"),255)">FontSize = 14,255)">Foreground = new SolidColorBrush(Colors.Black),255)">Text = "这是text symbol"
- graphics[4] = new Graphic();
- graphics[4].Symbol = RedLinesymbol;
- ESRI.ArcGIS.Geometry.PointCollection pc = new ESRI.ArcGIS.Geometry.PointCollection()
- new MapPoint(95,10),255)">new MapPoint(110,-15),255)">new MapPoint(130,10)
- ESRI.ArcGIS.Geometry.polyline pl = new ESRI.ArcGIS.Geometry.polyline();
- pl.Paths.Add(pc);
- graphics[4].Geometry = pl;
- graphics[5] = new Graphic();
- graphics[5].Symbol = CartoLinesymbol;
- ESRI.ArcGIS.Geometry.PointCollection pc1 = new ESRI.ArcGIS.Geometry.PointCollection()
- ESRI.ArcGIS.Geometry.polyline pl1 = new ESRI.ArcGIS.Geometry.polyline();
- pl1.Paths.Add(pc1);
- graphics[5].Geometry = pl1;
- graphics[6] = new Graphic()
- Symbol = RedFillSymbol
- ESRI.ArcGIS.Geometry.PointCollection pc2 = new ESRI.ArcGIS.Geometry.PointCollection()
- new MapPoint(120,-55),-30)
- ESRI.ArcGIS.Geometry.polygon pg = new ESRI.ArcGIS.Geometry.polygon();
- pg.Rings.Add(pc2);
- graphics[6].Geometry=pg;
- graphics[7] = new Graphic();
- //MediaElement的Name属性只能在xaml中定义(见帮助),所以决定了MediaElement不能完全在cs代码中定义
- BearVideo.source = new Uri("http://serverapps.esri.com/media/bear.wmv",UriKind.RelativeOrAbsolute);
- BearVideo.IsHitTestVisible=false;
- BearVideo.IsMuted=true;
- BearVideo.Autoplay=true;
- BearVideo.Opacity=0;
- ESRI.ArcGIS.Geometry.polygon pg2 = new ESRI.ArcGIS.Geometry.polygon();
- ESRI.ArcGIS.Geometry.PointCollection pc3 = new ESRI.ArcGIS.Geometry.PointCollection()
- new MapPoint(10,-20),255)">new MapPoint(32,7),255)">new MapPoint(62,-35),255)">new MapPoint(11,-36),-20)
- pg2.Rings.Add(pc3);
- graphics[7].Geometry=pg2;
- graphics[7].Symbol = new SimpleFillSymbol()
- Fill = new VideoBrush()
- SourceName = BearVideo.Name,255)">Opacity = 0.6,255)">Stretch = Stretch.UniformToFill
- foreach (Graphic g in graphics)
- glayer.Graphics.Add(g);
- g.MouseLeftButtonDown+=new MouseButtonEventHandler(graphic_MouseLeftButtonDown);
- private void graphic_MouseLeftButtonDown(object o,MouseButtonEventArgs e)
- Graphic g=o as Graphic;
- MessageBox.Show(string.Format("Geometry:{0}\nSymbol:{1}",g.Geometry.GetType().ToString(),g.Symbol.GetType().ToString()));
- }
可以把Draw理解成一块画板,调用Draw的Active()方法,就可以开始在画板上面绘画,程序会自动记录鼠标画出的每个Geometry,调用DeActive()方法,停止绘画。Active()有一个DrawMode参数,它决定了我们即将在这个画板上画出的内容类型:Point,polyline,polygon等。在画的过程中我们可以看到地图上可以实时反映出我们绘画的内容,而这些则利用了Draw的预定义Symbol:DefaultMarkerSymbol,DefaultLinesymbol,DefaultpolygonSymbol等。对应关系如下:
每当完成一个图形的绘制,就会触发Draw.OnDrawComplete事件,利用事件参数就可以获得Geometry,之后可以创建一个Graphic,设置一个Symbol(一般使用Draw的预定义Symbol),把画好的这个Graphic添加到一个Graphicslayer中。
点击这里,查看一个比较完整的Graphics的例子。
最后来看一下这个例子的部分代码:
- <esriSymbols:SimpleMarkerSymbol x:Name="DefaultMarkerSymbol" Color="Red" Size="12" Style="Circle" />
- <esriSymbols:CartographicLinesymbol x:Name="DefaultLinesymbol" Color="Red" Width="4" />
- <esriSymbols:SimpleFillSymbol x:Name="DefaultFillSymbol" Fill="#33FF0000" BorderBrush="Red" BorderThickness="2" />
- <esriSymbols:SimpleFillSymbol x:Name="DefaultpolygonSymbol" Fill="#33FF0000" BorderBrush="Red" BorderThickness="2" />
- <esriraw x:Name="Draw1"
- DefaultRectangleSymbol="{StaticResource DefaultFillSymbol}"
- DefaultMarkerSymbol="{StaticResource DefaultMarkerSymbol}"
- DefaultLinesymbol="{StaticResource DefaultLinesymbol}"
- DefaultpolygonSymbol="{StaticResource DefaultpolygonSymbol}"
- Loaded="Draw1_Loaded"
- OnDrawComplete="Draw1_OnDrawComplete" />
- <Canvas VerticalAlignment="Top" HorizontalAlignment="Left" Margin="20,20,0" Width="430" Height="110">
- <Rectangle RadiusX="10" RadiusY="10" Width="430" Height="110" Fill="#98000000" stroke="#FF6495ED" />
- <Rectangle Fill="#FFFFFFFF" stroke="DarkGray" RadiusX="5" RadiusY="5" Canvas.Left="10" Canvas.Top="10" Width="410" Height="90" />
- <StackPanel Orientation="Vertical" Canvas.Top="5" Canvas.Left="20">
- <esriWidgets:Toolbar x:Name="ToolBar1" MaxItemHeight="80" MaxItemWidth="80" Width="380" Height="80"
- ToolbarIndexChanged="ToolBar1_ToolbarIndexChanged"
- ToolbarItemClicked="ToolBar1_ToolbarItemClicked">
- <esriWidgets:Toolbar.Items>
- <esriWidgets:ToolbarItemCollection>
- <esriWidgets:ToolbarItem Text="添加点">
- <esriWidgets:ToolbarItem.Content>
- <Image Source="imgs/DrawPoint.png" Stretch="UniformToFill" Margin="5" />
- </esriWidgets:ToolbarItem.Content>
- </esriWidgets:ToolbarItem>
- <esriWidgets:ToolbarItem Text="添加折线">
- <Image Source="imgs/Drawpolyline.png" Stretch="UniformToFill" Margin="5" />
- <esriWidgets:ToolbarItem Text="添加多边形">
- <Image Source="imgs/Drawpolygon.png" Stretch="UniformToFill" Margin="5" />
- <esriWidgets:ToolbarItem Text="添加矩形">
- <Image Source="imgs/DrawRectangle.png" Stretch="UniformToFill" Margin="5" />
- <esriWidgets:ToolbarItem Text="添加曲线">
- <Image Source="imgs/DrawFreehand.png" Stretch="UniformToFill" Margin="5" />
- <esriWidgets:ToolbarItem Text="停止添加动作">
- <Image Source="imgs/StopDraw.png" Stretch="UniformToFill" Margin="5" />
- <esriWidgets:ToolbarItem Text="清空绘制的图形">
- <Image Source="imgs/eraser.png" Stretch="UniformToFill" Margin="5" />
- </esriWidgets:ToolbarItemCollection>
- </esriWidgets:Toolbar.Items>
- </esriWidgets:Toolbar>
- <TextBlock x:Name="StatusTextBlock" Text="" FontWeight="Bold" HorizontalAlignment="Center"/>
- </StackPanel>
- </Canvas>
- private void Draw1_Loaded(object sender,RoutedEventArgs e)
- Draw1.Map = Map1;
- private void Draw1_OnDrawComplete(object sender,ESRI.ArcGIS.DrawEventArgs args)
- ESRI.ArcGIS.Graphicslayer graphicslayer = Map1.Layers["GLayer2"] as ESRI.ArcGIS.Graphicslayer;
- ESRI.ArcGIS.Graphic graphic = new ESRI.ArcGIS.Graphic()
- Geometry = args.Geometry,255)">Symbol = _activeSymbol,255)">graphicslayer.Graphics.Add(graphic);
- private void ToolBar1_ToolbarIndexChanged(object sender,ESRI.ArcGIS.Widgets.SelectedToolbarItemArgs e)
- StatusTextBlock.Text = e.Item.Text;
- private void ToolBar1_ToolbarItemClicked(object sender,255)">Draw1.Deactivate();
- switch (e.Index)
- case 0: // Point
- Draw1.Activate(ESRI.ArcGIS.DrawMode.Point);
- _activeSymbol = strobeSymbol;
- break;
- case 1: // polyline
- Draw1.Activate(ESRI.ArcGIS.DrawMode.polyline);
- _activeSymbol = DefaultLinesymbol;
- case 2: // polygon
- Draw1.Activate(ESRI.ArcGIS.DrawMode.polygon);
- _activeSymbol = DefaultpolygonSymbol;
- case 3: // Rectangle
- Draw1.Activate(ESRI.ArcGIS.DrawMode.Rectangle);
- _activeSymbol = DefaultFillSymbol;
- case 4: // Freehand
- Draw1.Activate(ESRI.ArcGIS.DrawMode.Freehand);
- _activeSymbol = waveLinesymbol;
- case 5: // Stop Graphics
- case 6: // Clear Graphics
- graphicslayer.Cleargraphics();
- 大家可以注意一下例子中添加的点符号和曲线符号。只要有足够的想象力,完全可以利用Silverlight定制出非常炫的符号效果来。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。