热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ArcGisForSilverlightAPI,地图显示Gis,绘制点,线,绘制图等(四)动态绘制点

平台:Vs2010,Blend4,Silverlight4调用API:ArcGisforSilverligthAPI(ESRI.ArcGIS.Client)本节就作为

平台:Vs 2010,Blend 4,Silverlight 4

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


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


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


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

代码

           
           
<esri:GraphicsLayer ID&#61;"GLayer">
           
esri:GraphicsLayer>
           
<esri:GraphicsLayer ID&#61;"WDLayer">
           
esri:GraphicsLayer>

 

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

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

全局变量

        List<Graphic> mapPoint &#61; new List<Graphic>(); // 绘制站点的图形
        List<Graphic> WDPic &#61; new List<Graphic>();    // 绘制风符号图片

 

代码

///
       
/// 海浪一号报文
       
///

        private void WaveIInit()
        {
            GetWaveService.WaveServiceSoapClient porxy
&#61; new MapSilverlight.GetWaveService.WaveServiceSoapClient();
            porxy.GetSeaInfoCompleted
&#43;&#61; new EventHandler<MapSilverlight.GetWaveService.GetSeaInfoCompletedEventArgs>(porxy_GetSeaInfoCompleted);
            porxy.GetSeaInfoAsync();
        }
       
///
       
/// 异步接收完海浪一号报文后即绘制图形到地图上
       
///

       
///
       
///
        void porxy_GetSeaInfoCompleted(object sender, MapSilverlight.GetWaveService.GetSeaInfoCompletedEventArgs e)
        {
           
// 获取数据长度
            int length &#61; e.Result.Count;

           
// 绘制站点层
            GraphicsLayer glayer &#61; new GraphicsLayer();
            glayer
&#61; myMap.Layers["GLayer"] as GraphicsLayer;

           
// 绘制风向层
            GraphicsLayer WDLayer &#61; new GraphicsLayer();
            WDLayer
&#61; myMap.Layers["WDLayer"] as GraphicsLayer;


           
// 定义一个转换类,将字符串地址转化为图片
            ImageSourceConverter converter &#61; new ImageSourceConverter();

           
// 实例化站点和风向
            mapPoint &#61; new List<Graphic>();
            WDPic
&#61; new List<Graphic>();

           
// 循环从结果集中取数据
            for (int i &#61; 0; i < length; i&#43;&#43;)
            {
                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
&#61; new MapPoint(Convert.ToDouble(e.Result[i].Longitude), Convert.ToDouble(e.Result[i].Latitude)),
                    Symbol
&#61; new SimpleMarkerSymbol()
                    {
                        Color
&#61; new SolidColorBrush(Colors.Red),
                        Size
&#61; 6,
                        Style
&#61; SimpleMarkerSymbol.SimpleMarkerStyle.Circle
                    }
                });

               
// 将风向添加到风向层
                WDPic.Add(new Graphic()
                {
                    Geometry
&#61; new MapPoint(Convert.ToDouble(e.Result[i].Longitude), Convert.ToDouble(e.Result[i].Latitude)),
                    Symbol
&#61; new PictureMarkerSymbol()
                    {
                        Source
&#61; (ImageSource)converter.ConvertFromString("wind/1.png")
                    }
                });
            }

           
// 调用动态绘图方法绘制站点
            DynamicDrawSymbol(glayer, mapPoint, myMap);
           
// 调用动态绘图方法绘制风向
            DynamicDrawSymbol(WDLayer, WDPic, myMap);
        }

 


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

代码

<esri:Map x:Name&#61;"myMap" ExtentChanged&#61;"myMap_ExtentChanged"  Extent&#61;"117.356,29.4949,124.299,32.567" RenderTransformOrigin&#61;"0.5,0.5" UseLayoutRounding&#61;"False"
                  d:LayoutRounding
&#61;"Auto" Margin&#61;"0,0,0,-30" d:LayoutOverrides&#61;"GridBox" Background&#61;"Transparent">

 


当事件改变时&#xff1a;

代码

GraphicsLayer glayer &#61; new GraphicsLayer();
            glayer
&#61; myMap.Layers["GLayer"] as GraphicsLayer;

            GraphicsLayer WDLayer
&#61; new GraphicsLayer();
            WDLayer
&#61; myMap.Layers["WDLayer"] as GraphicsLayer;

           
// 调用动态绘图方法绘制站点
            DynamicDrawSymbol(glayer, mapPoint, myMap);

           
           
// 调用动态绘图方法绘制风向
            if (myMap.Extent.Height < 10)
            {
                WDLayer.Visible
&#61; true;
                DynamicDrawSymbol(WDLayer, WDPic, myMap);
            }
           
else
            {
                WDLayer.Visible
&#61; false;
            }

 


上面的代码中我们看到了myMap.Extent.Height <10当地图的高度大于10时会隐藏WDLayer
这样我们就实现了动态隐藏层

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

代码

///
       
/// 动态的绘制图层
       
/// 当然地图移动到相应的坐标后绘制(保留原来的点,绘制新的数据)
       
/// 实现了无刷新绘制
       
///

       
/// 表示地图上的层
       
/// 存放 Graphics 的缓存
       
/// 表示一张 ArcGis 地图
        private void DynamicDrawSymbol(ESRI.ArcGIS.Client.GraphicsLayer glayer,List<ESRI.ArcGIS.Client.Graphic> cacheGraphic, ESRI.ArcGIS.Client.Map map)
        {
           
// 以下四个变量分别表示地图的四个边
           
// 即最大经纬度和最小经纬度
           
// xMax最大经度,yMax最大纬度
            double xMax &#61; map.Extent.XMax;
           
double xMin &#61; map.Extent.XMin;
           
double yMax &#61; map.Extent.YMax;
           
double yMin &#61; map.Extent.YMin;

           
// 去除不在坐标范围内的点,先检查图层是否为空
            if (glayer !&#61; null)
            {
               
int graphicCount &#61; glayer.Graphics.Count;
               
for (int i &#61; 0; i < graphicCount; i&#43;&#43;)
                {
                   
// 判断经度,纬度
                    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 !&#61; null)
            {
               
int count &#61; cacheGraphic.Count;
               
for (int i &#61; 0; i < count; i&#43;&#43;)
                {
                   
// 判断经度,纬度
                    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;
                    }
                }
            }
        }

 


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

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

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

在Gis上可不可行&#xff0c;个人认为还是可行的&#xff0c;有空再去研究这个东西吧&#xff01;


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


OK, happy every day~


转:https://www.cnblogs.com/Royal_WH/archive/2010/11/10/1873779.html



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
author-avatar
勉情于你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有