缓冲区分析的需求:有时候我们需要在地图某个点上,画出方圆5公里的区域,目的是查看该点所影响的地区。那么直接先看看效果:
源码:
<Grid x:Name="LayoutRoot">
<Grid.Resources>
<esri:PictureMarkerSymbol x:Key="DefaultClickSymbol" OffsetX="11" OffsetY="39" Source="/Assets/images/i_pushpin.png" />
<esri:SimpleFillSymbol x:Key="DefaultBufferSymbol" Fill="#660000FF" BorderBrush="Blue" BorderThickness="2" />
</Grid.Resources>
<esri:Map x:Name="MyMap" Extent="-10863035.970,3838021.340,-10744801.344,3887145.299"
MouseClick="MyMap_MouseClick" >
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" />
<esri:GraphicsLayer ID="MyGraphicsLayer" />
</esri:Map>
<Grid HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,10,10,0" >
<Rectangle Fill="#77919191" Stroke="Gray" RadiusX="10" RadiusY="10" Margin="0,0,0,5" >
<Rectangle.Effect>
<DropShadowEffect/>
</Rectangle.Effect>
</Rectangle>
<Rectangle Fill="#FFFFFFFF" Stroke="DarkGray" RadiusX="5" RadiusY="5" Margin="10,10,10,15" />
<TextBlock x:Name="InformationTextBlock" Text="Click on map to set a location. A buffer of 5 miles will be displayed."
Width="200" TextAlignment="Left" Margin="30,20,25,30" TextWrapping="Wrap" />
</Grid>
</Grid>
public BufferPoint()
{
InitializeComponent();
}
private void MyMap_MouseClick(object sender, ESRI.ArcGIS.Client.Map.MouseEventArgs e)
{
GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
graphicsLayer.ClearGraphics();
e.MapPoint.SpatialReference = MyMap.SpatialReference;
Graphic graphic = new ESRI.ArcGIS.Client.Graphic()
{
Geometry = e.MapPoint,
Symbol = LayoutRoot.Resources["DefaultClickSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol
};
graphic.SetZIndex(1);
graphicsLayer.Graphics.Add(graphic);
GeometryService geometryService =
new GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
geometryService.BufferCompleted += GeometryService_BufferCompleted;
geometryService.Failed += GeometryService_Failed;
// If buffer spatial reference is GCS and unit is linear, geometry service will do geodesic buffering
BufferParameters bufferParams = new BufferParameters()
{
Unit = LinearUnit.StatuteMile,
BufferSpatialReference = new SpatialReference(4326),
OutSpatialReference = MyMap.SpatialReference
};
bufferParams.Features.Add(graphic);
bufferParams.Distances.Add(5);
geometryService.BufferAsync(bufferParams);
}
void GeometryService_BufferCompleted(object sender, GraphicsEventArgs args)
{
IList<Graphic> results = args.Results;
GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
foreach (Graphic graphic in results)
{
graphic.Symbol = LayoutRoot.Resources["DefaultBufferSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
graphicsLayer.Graphics.Add(graphic);
}
}
private void GeometryService_Failed(object sender, TaskFailedEventArgs e)
{
MessageBox.Show("Geometry Service error: " + e.Error);
}
相信大部分代码大家都会明白,只是其中GeometryService是什么东东,其实它是arcgis server一种服务,用于协助应用程序执行各种几何计算,如缓冲区、简化、面积和长度计算以及投影。简单浏览一下ArcGIS Server提供的各种服务:
服务类型 | 所需的 GIS 资源 |
地图服务(Map service) | 地图文档(.mxd、.pmf)或地图服务定义 (.msd) |
地理编码服务(Geocode service) | 地址定位器(.loc、.mxs、SDE 批量定位器) |
地理数据服务(Geodata service) | 数据库连接文件 (.sde) 或个人地理数据库或文件地理数据库或具有从版本化的地理数据库中引用数据的图层的地图文档 |
几何服务(Geometry service) | 不需要 GIS 资源 |
地理处理服务(Geoprocessing service) | 具有工具图层或工具箱 (.tbx) 的地图文档 |
Globe 服务(Globe service) | Globe 文档(.3dd、.pmf) |
影像服务(Image service) | 栅格数据集或引用栅格数据集的图层文件或镶嵌数据集或已编译的影像服务定义 (.iscdef) |
那么如何发布几何服务(Geometry service)呢 ?
其实发布Geometry service是最简单的,因为它不需要任何地图资源。
1、打开ArcCatalog,添加服务
2、类型选择Geometry service,名称必须用"Geometry"命名。
然后下一步完成,Geometry service发布就ok了。