在arcgis上根据区域显示小区

在最近做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);
                }
 
            };

}

原文地址:https://www.cnblogs.com/malingbo/p/2207623.html