ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(四)--动态绘制点

ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(四)--动态绘制点,第1张

概述     平台:Vs 2010,Blend 4,Silverlight 4   调用API: ArcGis for Silverligth API(ESRI.ArcGIS.Client)   本节就作为ArcGis 的最后一讲吧,本来想写点其它的,发觉和 Gis 没什么关系。   本节主要以介绍如何动态的在ArcGis上绘制图形,图像并显示隐藏要的层   我们知道如果要在ArcGis上绘制图形的话
  

  平台:Vs 2010,Blend 4,Silverlight 4

  调用API: ArcGis for Silverligth API(ESRI.ArcGIS.ClIEnt)

  本节就作为ArcGis 的最后一讲吧,本来想写点其它的,发觉和 Gis 没什么关系。

  本节主要以介绍如何动态的在ArcGis上绘制图形,图像并显示隐藏要的层

  我们知道如果要在ArcGis上绘制图形的话得先在xmal中加入用户的图层

12345
<!--与用户交互的Graphicslayer-->            <esri:Graphicslayer ID="GLayer">            </esri:Graphicslayer>            <esri:Graphicslayer ID="WDLayer">            </esri:Graphicslayer>

  当然我们需要数据源,这里我以调用WebService为例为大家讲解

  以下代码调用了一报文并生成了List 以便存储在内存里方便实时绘制时取得数据

  全局变量

12
List<Graphic> mapPoint = new List<Graphic>(); // 绘制站点的图形        List<Graphic> WDPic = new List<Graphic>();    // 绘制风符号图片
 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
/// <summary>        /// 海浪一号报文        /// </summary>        private voID WaveIInit()        {            GetWaveService.WaveServiceSoapClIEnt porxy = new MapSilverlight.GetWaveService.WaveServiceSoapClIEnt();            porxy.GetSeaInfoCompleted += new EventHandler<MapSilverlight.GetWaveService.GetSeaInfoCompletedEventArgs>(porxy_GetSeaInfoCompleted);            porxy.GetSeaInfoAsync();        }        /// <summary>        /// 异步接收完海浪一号报文后即绘制图形到地图上        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        voID porxy_GetSeaInfoCompleted(object sender,MapSilverlight.GetWaveService.GetSeaInfoCompletedEventArgs e)        {            // 获取数据长度            int length = e.Result.Count;            // 绘制站点层            Graphicslayer glayer = new Graphicslayer();            glayer = myMap.Layers["GLayer"] as Graphicslayer;            // 绘制风向层            Graphicslayer WDLayer = new Graphicslayer();            WDLayer = myMap.Layers["WDLayer"] as Graphicslayer;            // 定义一个转换类,将字符串地址转化为图片            ImageSourceConverter converter = new ImageSourceConverter();            // 实例化站点和风向            mapPoint = new List<Graphic>();            WDPic = new List<Graphic>();            // 循环从结果集中取数据            for (int i = 0; i < length; i++)            {                waveI.Add(new WebModel.Sites(e.Result[i].Longitude,e.Result[i].Latitude,e.Result[i].SiteNo,e.Result[i].Pressure,e.Result[i].RH,e.Result[i].Temperature,e.Result[i].Visibility));                // 将站点添加到站点层                mapPoint.Add(new Graphic()                {                    Geometry = new MapPoint(Convert.Todouble(e.Result[i].Longitude),Convert.Todouble(e.Result[i].Latitude)),Symbol = new SimpleMarkerSymbol()                    {                        color = new SolIDcolorBrush(colors.Red),Size = 6,Style = SimpleMarkerSymbol.SimpleMarkerStyle.Circle                    }                });                // 将风向添加到风向层                WDPic.Add(new Graphic()                {                    Geometry = new MapPoint(Convert.Todouble(e.Result[i].Longitude),Symbol = new PictureMarkerSymbol()                     {                        Source = (ImageSource)converter.ConvertFromString("wind/1.png")                    }                });            }            // 调用动态绘图方法绘制站点            DynamicDrawSymbol(glayer,mapPoint,myMap);            // 调用动态绘图方法绘制风向            DynamicDrawSymbol(WDLayer,WDPic,myMap);        }

  当然我们要在地图发生改变时去实时的绘制,需要在ArcGis图层里添加ExtentChanged事件代码如下:

<esri:Map x:name="myMap" ExtentChanged="myMap_ExtentChanged" 

 Extent="117.356,29.4949,124.299,32.567" RendertransformOrigin="0.5,0.5" UseLayoutRounding="False" 


 d:LayoutRounding
="auto" margin="0,-30" d:LayoutOverrIDes="GrIDBox" Background="transparent">

  当事件改变时:

 1 2 3 4 5 6 7 8 91011121314151617181920
Graphicslayer glayer = new Graphicslayer();            glayer = myMap.Layers["GLayer"] as Graphicslayer;            Graphicslayer WDLayer = new Graphicslayer();            WDLayer = myMap.Layers["WDLayer"] as Graphicslayer;            // 调用动态绘图方法绘制站点            DynamicDrawSymbol(glayer,myMap);                        // 调用动态绘图方法绘制风向            if (myMap.Extent.Height < 10)            {                WDLayer.Visible = true;                DynamicDrawSymbol(WDLayer,myMap);            }            else            {                WDLayer.Visible = false;            }

  上面的代码中我们看到了myMap.Extent.Height < 10当地图的高度大于10时会隐藏WDLayer

  这样我们就实现了动态隐藏层

  我们再看最重要的一段代码,这就是动态的从缓存中绘制到图层上

 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
/// <summary>        /// 动态的绘制图层        /// 当然地图移动到相应的坐标后绘制(保留原来的点,绘制新的数据)        /// 实现了无刷新绘制        /// </summary>        /// <param name="glayer">表示地图上的层</param>        /// <param name="cacheGraphic">存放 Graphics 的缓存</param>        /// <param name="map">表示一张 ArcGis 地图</param>        private voID DynamicDrawSymbol(ESRI.ArcGIS.ClIEnt.Graphicslayer glayer,List<ESRI.ArcGIS.ClIEnt.Graphic> cacheGraphic,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;            // 去除不在坐标范围内的点,先检查图层是否为空            if (glayer != null)            {                int graphicCount = glayer.Graphics.Count;                for (int i = 0; i < graphicCount; i++)                {                    // 判断经度,纬度                    if (!((glayer.Graphics[i].Geometry.Extent.XMax < xMax && glayer.Graphics[i].Geometry.Extent.XMax > xMin)                        && (glayer.Graphics[i].Geometry.Extent.YMax < yMax && glayer.Graphics[i].Geometry.Extent.YMax > yMin)))                    {                        // 将点在地图上移除,并放在缓存中                        cacheGraphic.Add(glayer.Graphics[i]);                        glayer.Graphics.Remove(glayer.Graphics[i]);                        graphicCount--;   // 当从集合中移除元素时应该把 graphicCount 减1                        i--;              // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1                    }                } // i            }            // 检查缓存是否为空,并将点绘制到图形上            if (cacheGraphic != null)            {                int count = cacheGraphic.Count;                for (int i = 0; i < count; i++)                {                    // 判断经度,纬度                    if ((cacheGraphic[i].Geometry.Extent.XMax < myMap.Extent.XMax && cacheGraphic[i].Geometry.Extent.XMax > myMap.Extent.XMin)                        && (cacheGraphic[i].Geometry.Extent.YMax < myMap.Extent.YMax && cacheGraphic[i].Geometry.Extent.YMax > myMap.Extent.YMin))                    {                        // 运行到此则该点在目前地图范围内,将该点加入到地图中                        glayer.Graphics.Add(cacheGraphic[i]);                        cacheGraphic.Remove(cacheGraphic[i]);                        count--;    // 当从集合中移除元素时应该把 count 减1                        i--;        // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1                        continue;                    }                }            }        }

  这篇文章早在已前已经写好了,其实恩路很简单,在Gis大量数据加载到地图上的时候我们拖动地图的时候就会比较卡,

  我们当然把在地图上的数据加载到地图上,也就是当前 myMap.Extent 里的 XMax,YMax,Xmin,YMin,这个范围内的点

  加载到地图上!不在这个范围内的就移除,这样速度就会快一点,但是看到网上有人用CacheMode来解决游戏的问题的不知道

  在Gis上可不可行,个人认为还是可行的,有空再去研究这个东西吧!

  OK,Gis东西就先写到这,大家有什么问题可以给我留言!欢迎大家一起讨论!

  OK,happy every day~

本文来自Royal_Wh的博客,原文地址:http://www.cnblogs.com/Royal_WH/archive/2010/11/10/1873779.HTML

总结

以上是内存溢出为你收集整理的ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(四)--动态绘制点全部内容,希望文章能够帮你解决ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(四)--动态绘制点所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1016148.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存