在最近做Gis应用时,有这样一个场景:在地图上实时绘制小区。小区数据大约是20万,全部绘制会导致系统崩溃。为什么不做成静态图层呢?因为小区数据会发生变化,会有小区新增、割接等情况。所以在这里我使用了区域绘制的方法,当arcgis控件缩放到一定高度时,再将显示区域的小区绘制出来,这样性能上可以得到很大改观,唯一的问题是访问数据库会比较频繁,操作较快时显示会有一些延迟,不过我们的系统是在局域网环境下,可以忽略不计。
开发环境:oracle9i,vs2010,silverlight4 sdk,arcgis for silverlight
第三方控件:ibatis.net
步骤如下:
1,添加Map控件的ExtentChanged事件
<esri:Map x:Name="MyMap" ExtentChanged="MyMap_ExtentChanged" Extent="12840835,3190714,13612539,3565714">
2,在MyMap_ExtentChanged方法中获取屏幕坐标,高度
private void MyMap_ExtentChanged(object sender, ExtentEventArgs e) { double xMax = MyMap.Extent.XMax; double xMin = MyMap.Extent.XMin; double yMax = MyMap.Extent.YMax; double yMin = MyMap.Extent.YMin; double height = MyMap.Extent.Height; 3,读取数据库,获取区域内小区对象
// 调用动态绘图方法绘制站点 if (MyMap.Extent.Height <3000) { CellGraphicsLayer.Visible = true; DynamicDrawSymbol(CellGraphicsLayer, MyMap); }
/// <summary> /// 动态的绘制图层 /// 当然地图移动到相应的坐标后绘制(保留原来的点,绘制新的数据) /// 实现了无刷新绘制 /// </summary> /// <param name="glayer">表示地图上的层</param> /// <param name="map">表示一张 ArcGis 地图</param> private void DynamicDrawSymbol(ESRI.ArcGIS.Client.GraphicsLayer glayer, ESRI.ArcGIS.Client.Map map) {// 以下四个变量分别表示地图的四个边 // 即最大经纬度和最小经纬度 // xMax最大经度,yMax最大纬度 double xMax = map.Extent.XMax; double xMin = map.Extent.XMin; double yMax = map.Extent.YMax; double yMin = map.Extent.YMin; var lefttop=FromGeoMetry(new MapPoint(xMin,yMin)); var rightbottom = FromGeoMetry(new MapPoint(xMax, yMax)); //获取范围内的小区 glayer.ClearGraphics(); ValueCellServiceSoapClient client = new ValueCellServiceSoapClient(); client.GetValueCellByRangeAsync(lefttop.Extent.XMin, lefttop.Extent.YMin, rightbottom.Extent.XMax, rightbottom.Extent.YMax); //加入图层 client.GetValueCellByRangeCompleted += (s, ep) => { foreach (var v in ep.Result) { ESRI.ArcGIS.Client.Geometry.Geometry geometry=new MapPoint(Convert.ToDouble(v.LONGITUDE),Convert.ToDouble(v.LATITUDE)); Graphic graphic = new Graphic() { Geometry = ToGeoMetry(geometry), Symbol = new SimpleMarkerSymbol() { Color = new SolidColorBrush(Colors.Red), Size = 6, Style = SimpleMarkerSymbol.SimpleMarkerStyle.Circle } };
//增加一个参数,用于和小区实体关联
graphic.Attributes.Add("CELLKEY", v);
glayer.Graphics.Add(graphic);
//tooltip
Graphic graphicsText = CreateTextGraphics(graphic);
glayer.Graphics.Add(graphicsText);
}
};
}