zoukankan      html  css  js  c++  java
  • 在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);
                    }
     
                };

    }

  • 相关阅读:
    模拟器 | 如何安装ENSP,附上最详细的步骤,含安装软件!
    《平凡的世界》孙少平给妹妹孙兰香的信
    Date类添加一个新的方法,用prototype
    jquery动画相关函数
    斐波那契数列 递归调用
    怎样才能升天?
    jquery tabs切换插件
    vmware桥接共享的问题
    C#,mysql 添加数据的问题
    一根神奇的网线
  • 原文地址:https://www.cnblogs.com/malingbo/p/2207623.html
Copyright © 2011-2022 走看看