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);
                    }
     
                };

    }

  • 相关阅读:
    ElasticSearch-03-远行、停止
    ElasticSearch-02-elasticsearch.yaml
    Go-31-杂序
    Go-30-main包
    SpringBoot 初入门
    Spring 事务管理
    JDBC Template
    Spring 基于 AspectJ 的 AOP 开发
    Spring AOP 代理
    Spring 的 AOP 概述和底层实现
  • 原文地址:https://www.cnblogs.com/malingbo/p/2207623.html
Copyright © 2011-2022 走看看