ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(三)--绘制点、线、圆,显示提示信息

ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(三)--绘制点、线、圆,显示提示信息,第1张

概述OK,今天又有空来写点啦,这个例子自己不想拉的太长了,所以这节多写点东西,我尽量把东西都介绍全面,有不懂的可以留言~ 有空大家共同讨论。 好进入正题,如今天标题所示,我们先来看画点,线,圆吧!   /// <summary>   /// 绘制界面上的点和线   /// </summary>   /// <param name="myMap"></p

OK,今天又有空来写点啦,这个例子自己不想拉的太长了,所以这节多写点东西,我尽量把东西都介绍全面,有不懂的可以留言~

有空大家共同讨论。


好进入正题,如今天标题所示,我们先来看画点,线,圆吧!

 

  /// <summary>      /// 绘制界面上的点和线      /// </summary>      /// <param name="myMap"></param>      /// <param name="point"></param>      /// <param name="pointline"></param>      public voID DrawAnimationCompleted(Map myMap, List<Graphic> point,ESRI.ArcGIS.ClIEnt.Geometry.PointCollection pointline)      {          Graphicslayer gPointLayer = new Graphicslayer();          Graphicslayer lineLayer = new Graphicslayer();          Simplelinesymbol linesymbol = new Simplelinesymbol();          linesymbol.color = new SolIDcolorBrush(colors.brown);          linesymbol.WIDth = 1;          linesymbol.Style = Simplelinesymbol.linestyle.solID;               // 画线到图层上并绘制到地图上          GisMap.AddLayersToMap(myMap, new Graphicslayer[] { lineLayer });          Gisline.DrawlineOnMap(pointline, lineLayer, linesymbol);               GisMap.DrawAllLayers(myMap, new Graphicslayer[] { gPointLayer }, point);          GisMap.AddLayersToMap(myMap, new Graphicslayer[] { gPointLayer });        

好,看一下如何画圆吧。

 

  /// <summary>      /// 在地图上绘制圆      /// </summary>      /// <param name="myMap">地图</param>      /// <param name="container">绘制容器</param>      /// <param name="pt">要绘制的点</param>      /// <param name="drawCircleLayer"></param>      /// <param name="circleKm">直径</param>      /// <param name="color">填充色</param>      /// <param name="ellipsestroke">边框色</param>      public voID DrawEllipse(Map myMap, Canvas container, MapPoint pt,ref ElementLayer drawCircleLayer, double circleKm,color color,color ellipsestroke)      {          if (!drawCircleLayer.Children.Contains(container))          {              drawCircleLayer.Children.Add(container);              container.Opacity = 0.5;              container.SetValue(ElementLayer.EnvelopeProperty, new Envelope(myMap.Extent.XMax, myMap.Extent.YMax, myMap.Extent.XMin, myMap.Extent.YMin));          }               Point ptFirst = myMap.MapToScreen(new MapPoint(Convert.Todouble(pt.X),             Convert.Todouble(pt.Y)));               Point pt7 = myMap.MapToScreen(new MapPoint((Convert.Todouble(pt.X) + circleKm * kmToEN),             Convert.Todouble(pt.Y)));               Ellipse ellipse7 = new Ellipse();          ellipse7.WIDth = (pt7.X - ptFirst.X) * 2;          ellipse7.Height = ellipse7.WIDth;          ellipse7.strokeThickness = 1;          ellipse7.stroke = new SolIDcolorBrush(ellipsestroke);          ellipse7.Fill = new SolIDcolorBrush(color);          Canvas.Setleft(ellipse7, ptFirst.X - ellipse7.WIDth / 2);          Canvas.Settop(ellipse7, ptFirst.Y - ellipse7.WIDth / 2);          ellipse7.Opacity = 0.5;               container.Children.Add(ellipse7);          container.IsHitTestVisible = false;          container.SetValue(Canvas.ZIndexProperty, -10);        

这是一个画圆的方法,需要地图类,点,Canvas容器,Gis 的地图层ElementLayer和color

我前台是这样调用的

 

  &nbsp;{&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GisMap.DeleteLayersToMap(myMap, "WindCircleLayer");&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}                       ElementLayer circleLayer = new ElementLayer();                  circleLayer.ID = "WindCircleLayer";                       Canvas circleCanvas = new Canvas();                       Graphic tipGraphic = sender as Graphic;                       if (Convert.Todouble(tipGraphic.Attributes["WindCircle7"]) != 0)                  {                      color color = new color();                      color.A = 255;                      color.R = 153;                      color.G = 105;                      color.B = 192;                           DrawEllipse(myMap, circleCanvas, new MapPoint(Convert.Todouble(tipGraphic.Attributes["Longitude"]),                         Convert.Todouble(tipGraphic.Attributes["Latitude"])), ref circleLayer,                         Convert.Todouble(300), color, colors.Blue);                       }                       if (Convert.Todouble(tipGraphic.Attributes["WindCircle10"]) != 0)                  {                      color color = new color();                      color.A = 255;                      color.R = 111;                      color.G = 91;                      color.B = 171;                           this.DrawEllipse(myMap,                         Convert.Todouble(tipGraphic.Attributes["WindCircle10"]), colors.Blue);                  }                            GisMap.AddLayersToMap(myMap, new ElementLayer[] { circleLayer });              }   

这里的sender是一个Gis元素 Graphic,根据我的WebService 取到的实体后我把这个点加上了Attributes,一系列属性,所以在上面的代码可以看到tipGraphic.Attributes["WindCircle10"],


下面的代码就是在我从WebService取到实体后做添加点的代码:

 

  /// <summary>      /// 添加台风点代码      /// 添加鼠标移入、移出事件      /// </summary>      /// <param name="model"></param>      /// <param name="i"></param>      private voID AddPointToGraphic(typhoonModel model, int i, List<Graphic> pointParam)      {          SimpleMarkerSymbol symbol = new SimpleMarkerSymbol();          color color = new color();          color.A = 255;                    if (Convert.Todouble(model.WS) <= 17.1)          {              color.R = 0;              color.G = 254;              color.B = 223;              symbol.color = new SolIDcolorBrush(color);          }          else if (Convert.Todouble(model.WS) > 17.1 && Convert.Todouble(model.WS) <= 24.4)          {              color.R = 254;              color.G = 243;              color.B = 0;              symbol.color = new SolIDcolorBrush(color);          }          else if (Convert.Todouble(model.WS) > 24.4 && Convert.Todouble(model.WS) <= 32.6)          {              color.R = 254;              color.G = 144;              color.B = 44;              symbol.color = new SolIDcolorBrush(color);          }          else if (Convert.Todouble(model.WS) > 32.6 && Convert.Todouble(model.WS) <= 41.4)          {              color.R = 254;              color.G = 4;              color.B = 4; symbol.color = new SolIDcolorBrush(color);          }          else if (Convert.Todouble(model.WS) > 41.4 && Convert.Todouble(model.WS) <= 50.9)          {              color.R = 254;              color.G = 58;              color.B = 163; symbol.color = new SolIDcolorBrush(color);          }          else if (Convert.Todouble(model.WS) > 50.9)          {              color.R = 174;              color.G = 0;              color.B = 217; symbol.color = new SolIDcolorBrush(color);          }               symbol.Size = 10;          if (i == 0)          {              symbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square;          }          else         {              symbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Circle;          }               pointParam.Add(new Graphic()          {              Geometry = new MapPoint(model.Longitude, model.Latitude),             Symbol = symbol          });               pointParam[i].Attributes.Add("typhoonID", model.typhoonID);          pointParam[i].Attributes.Add("typhoonNo", model.typhoonNo);          pointParam[i].Attributes.Add("typhoonname", model.typhoonname);          pointParam[i].Attributes.Add("WindCircle7", model.WindCircle7);          pointParam[i].Attributes.Add("WindCircle10", model.WindCircle10);          pointParam[i].Attributes.Add("WS", model.WS);          pointParam[i].Attributes.Add("Pressure", model.Pressure);          pointParam[i].Attributes.Add("IssueTime", model.IssueTime);          pointParam[i].Attributes.Add("Future", model.Future);          pointParam[i].Attributes.Add("Latitude", model.Latitude);          pointParam[i].Attributes.Add("Longitude", model.Longitude);        

信息提示功能如图:




我们先看下Xmal中的代码:

 

  <Canvas x:name="typhoonPointInfoCanvas" Visibility="Visible" Height="188" HorizontalAlignment="left" margin="0,-272,0" VerticalAlignment="top" WIDth="360">         <Path Stretch="Fill" stroke="Black"  Height="168.5" WIDth="328.5" UseLayoutRounding="False" Canvas.left="0.5" Canvas.top="-0.5" Data="M113,25 C113,11.745166 123.74516,1.0000004 137,1.0000004 L304,1.0000004 C317.25482,1.0000004 328,11.745166 328,25 L328,144 C328,157.25484 317.25482,168 304,168 L137,168 C123.74516,168 113,157.25484 113,144 z M112.5,24.499998 L0.5,0.5 L112.5,72.499992 z" Fill="{StaticResource CommonGradIEnt2}"/>              <StackPanel OrIEntation="Vertical" Height="168" WIDth="176" Canvas.left="137" Canvas.top="15">             <TextBlock x:name="typhoonnameTextBlock" Height="20" Text="名称:" Foreground="White" textwrapPing="Wrap"/>             <TextBlock x:name="typhoonCollectionTimeTextBlock" Height="20" Text="时间:" Foreground="White" textwrapPing="Wrap" d:LayoutOverrIDes="HorizontalAlignment"/>             <TextBlock x:name="typhoonpositionTextBlock" Height="20" Text="位置:" Foreground="White" textwrapPing="Wrap" d:LayoutOverrIDes="HorizontalAlignment"/>             <TextBlock x:name="typhoonWSTextBlock" Height="20" Text="最大风速:" Foreground="White" textwrapPing="Wrap" d:LayoutOverrIDes="HorizontalAlignment"/>             <TextBlock x:name="typhoonPressureTextBlock" Height="20" Text="中心气压:" Foreground="White" textwrapPing="Wrap" d:LayoutOverrIDes="HorizontalAlignment"/>             <TextBlock x:name="typhoonCircle7TextBlock" Height="20" Text="7级风圈半径:" Foreground="White" textwrapPing="Wrap" d:LayoutOverrIDes="HorizontalAlignment"/>             <TextBlock x:name="typhoonCircle10TextBlock" Height="20" Text="10级风圈半径:" Foreground="White" textwrapPing="Wrap" d:LayoutOverrIDes="HorizontalAlignment"/>              </StackPanel>     </Canvas>   

 

  <linearGradIEntBrush x:Key="CommonGradIEnt" StartPoint="0.5,0" EndPoint="0.5,1">            <GradIEntStop Offset="0" color="#ee76a8d3"/>            <GradIEntStop Offset="0.25" color="#ee5b8cb5"/>            <GradIEntStop Offset="0.75" color="#ee4b7ba7"/>        </linearGradIEntBrush

 

看下c# 中的代码:

 

当我们添加那些点也就是 Graphic 的时候有这样一个事件MouseEventHandler

 

  // 添加点和线,先显示点层,动画结束后显示线层      mapDraw.DrawlineAndPoint(ref point, myMap, gLayer, ref pointline, e, length);                // 添加点事件      foreach (Graphic item in point)      {          item.MouseEnter += new MouseEventHandler(MainPage_MouseEnter);          item.MouseLeave += new MouseEventHandler(MainPage_Drawline);        

 

  /// <summary>      /// 绘制单条台风动画前的信息      /// </summary>      /// <param name="point"></param>      /// <param name="myMap"></param>      /// <param name="gLayer"></param>      /// <param name="pointline"></param>      /// <param name="e"></param>      /// <param name="length"></param>      public voID DrawlineAndPoint(ref List<Graphic> point,Map myMap,Graphicslayer gLayer,        ref ESRI.ArcGIS.ClIEnt.Geometry.PointCollection pointline, GettyphoonsCompletedEventArgs e, int length)      {          #region 添加点代码          point = new List<Graphic>();          for (int i = 0; i < length; i++)          {              AddPointToGraphic(e.Result[i], i, point);          }          #endregion               // 添加线的代码          pointline = new ESRI.ArcGIS.ClIEnt.Geometry.PointCollection();          AddlinetoMap(e.Result.ToList(), length, pointline);               // 显示点层          GisMap.DrawAllLayers(myMap, new Graphicslayer[] { gLayer }, new Graphicslayer[] { gLayer });        

 AddPointToGraphic这个方法就是图片上面的那段代码

<SPAN style="Font-SIZE: 14px"> item.MouseEnter += new MouseEventHandler(MainPage_MouseEnter);     </SPAN>

item.MouseLeave += new MouseEventHandler(MainPage_Drawline);

这两段代码就是我们添加鼠标移入和移出事件了,我们看下移入事件:

 

  <div class=cnblogs_Highlighter><PRE class=brush:csharp>        voID MainPage_MouseEnter(object sender, MouseEventArgs e)              {                  Graphic graphic = sender as Graphic;                  Cursor = Cursors.Hand;                       typhoonPointInfoCanvas.Visibility = Visibility.Visible;                       Point pt = myMap.MapToScreen(new MapPoint(Convert.Todouble(graphic.Attributes["Longitude"]), Convert.Todouble(graphic.Attributes["Latitude"])));                       typhoonPointInfoCanvas.SetValue(GrID.marginProperty, new Thickness(pt.X, pt.Y, 0, 0));                       typhoonnameTextBlock.Text = "台风:" + graphic.Attributes["typhoonname"].ToString();                  typhoonCollectionTimeTextBlock.Text = "时间:" + graphic.Attributes["IssueTime"].ToString();                  typhoonpositionTextBlock.Text = "位置:" + graphic.Attributes["Longitude"].ToString() + "°E," + graphic.Attributes["Latitude"].ToString() + "°N";                  typhoonWSTextBlock.Text = "最大风速:" + graphic.Attributes["WS"].ToString() + " m/s";                  typhoonPressureTextBlock.Text = "中心气压:" + graphic.Attributes["Pressure"].ToString() + " hPa";                  typhoonCircle7TextBlock.Text = "7级风圈半径:" + graphic.Attributes["WindCircle7"].ToString() + " km";                  typhoonCircle10TextBlock.Text = "10级风圈半径:" + graphic.Attributes["WindCircle10"].ToString() + " km";                       circle.DrawEllipse7And10WindCircle(myMap, sender);                  selectedGarphic = sender as Graphic;              }</PRE>     </div>   

 

我们看到在显示信息的同时我们又把圆画了上去<SPAN >DrawEllipse7And10WindCircle()这个函数</SPAN>
GisMap是个静态类,以下是他的代码

 

 

  /// <summary>      /// ArcGis 调用类      /// 动态加载、显示隐藏层数据、加载层上的点等      /// 日期:2010-5-10      /// 作者:AngelSoft      /// </summary>      public static class GisMap      {               /// <summary>          /// 绘制所有的点到地图上          /// </summary>          /// <param name="glayer"></param>          /// <param name="cacheGraphic"></param>          public static voID DrawSymbol(Graphicslayer glayer, List<Graphic> cacheGraphic)          {              if (glayer != null)              {                  int graphicCount = cacheGraphic.Count;                  for (int i = 0; i < graphicCount; i++)                  {                      glayer.Graphics.Add(cacheGraphic[i]);                  } // i              }          }   
  /// <summary>      /// 加载所有图层上的点      /// 动态绘制      /// 图层和点的对应关系要正确      /// 有几个图层就要有几个点集合      /// </summary>      /// <param name="map">ArcGis 地图变量</param>      /// <param name="layers">GraphicLayer 层数组</param>      /// <param name="graphicParam">Graphic 点数组</param>      public static voID DrawLayers(Map map, Graphicslayer[] layers, params List<Graphic>[] graphicParam)      {          // 计算要绘制的层数并一层一层的绘制(调用动态绘制方法)          if (layers != null)          {              int length = layers.Length;              for (int i = 0; i < length; i++)              {                  if (layers[i] == null)                  {                      layers[i] = new Graphicslayer();                  }                  DynamicDrawSymbol(layers[i], graphicParam[i], map);              }          }      }                /// <summary>      /// 加载所有图层上的点      /// 画所有点      /// 图层和点的对应关系要正确      /// 有几个图层就要有几个点集合      /// </summary>      /// <param name="map">ArcGis 地图变量</param>      /// <param name="layers">GraphicLayer 层数组</param>      /// <param name="graphicParam">Graphic 点数组</param>      public static voID DrawAllLayers(Map map, params List<Graphic>[] graphicParam)      {          // 计算要绘制的层数并一层一层的绘制(调用动态绘制方法)          if (layers != null)          {              int length = layers.Length;              for (int i = 0; i < length; i++)              {                  if (layers[i] == null)                  {                      layers[i] = new Graphicslayer();                  }                  DrawAllGraphics(layers[i], graphicParam[i]);              }          }      }                     /// <summary>      /// 隐藏或显示 ArcGis 层      /// </summary>      /// <param name="show">隐藏或显示</param>      /// <param name="layers">层</param>      public static voID LayersVisibility(bool show, params Graphicslayer[] layers)      {          if (layers != null)          {              foreach (Graphicslayer item in layers)              {                  item.Visible = show;              }          }      }                /// <summary>      /// 将图层数组全部从 map 中移除      /// </summary>      /// <param name="map">表示一张 ArcGis 地图</param>      /// <param name="layers">表示地图层的数组</param>      public static voID DeleteLayersToMap(Map map, Graphicslayer[] layers)      {          // 逐个将数据移除          foreach (Graphicslayer item in layers)          {              map.Layers.Remove(item);          }      }           /// <summary>      /// 根据 ID 号删除某层      /// </summary>      /// <param name="map"></param>      /// <param name="ID"></param>      /// <returns></returns>      public static voID DeleteLayersToMap(Map map, string[] ID)      {          int length = ID.Length;               for (int i = 0; i < length; i++)          {              foreach (Layer item in map.Layers)              {                  if (item.ID == ID[i])                  {                      map.Layers.Remove(item);                      length--;                      break;                  }              }          }      }           /// <summary>      /// 将图层数组全部从 map 中移除      /// </summary>      /// <param name="map">表示一张 ArcGis 地图</param>      /// <param name="layers">表示地图层的数组</param>      public static voID DeleteLayersToMap(Map map, ElementLayer[] layers)      {          // 逐个将数据移除          foreach (ElementLayer item in layers)          {              map.Layers.Remove(item);          }      }                /// <summary>      /// 删除地图上的某一层      /// </summary>      /// <param name="myMap"></param>      /// <param name="ID">ID号</param>      public static voID DeleteLayersToMap(Map myMap, string ID)      {          int layers = myMap.Layers.Count;          for (int i = 0; i < layers; i++)          {              if (myMap.Layers[i].ID == ID)              {                  myMap.Layers.RemoveAt(i);                  return;              }          }      }                public static bool LayerExist(Map myMap, string ID)      {          int layers = myMap.Layers.Count;          for (int i = 0; i < layers; i++)          {              if (myMap.Layers[i].ID == ID)              {                  return true;              }          }          return false;      }                /// <summary>      /// 将图层数组全部添加到 map 中      /// </summary>      /// <param name="map">表示一张 ArcGis 地图</param>      /// <param name="layers">表示地图层的数组</param>      public static voID AddLayersToMap(Map map, Graphicslayer[] layers)      {          // 逐个将数据添加到当前地图中          foreach (Graphicslayer item in layers)          {              if (item != null)              {                  map.Layers.Add(item);              }          }      }           /// <summary>      /// 将图层数组全部添加到 map 中      /// </summary>      /// <param name="map">表示一张 ArcGis 地图</param>      /// <param name="layers">表示地图层的数组</param>      public static voID AddLayersToMap(Map map, ElementLayer[] layers)      {          // 逐个将数据添加到当前地图中          foreach (ElementLayer item in layers)          {              map.Layers.Add(item);          }      }           /// <summary>      /// 绘制所有的点到地图上      /// </summary>      /// <param name="eLayer"></param>      /// <param name="image"></param>      public static voID AddImagetoElementLayer(ElementLayer eLayer, List<Image> image)      {          if (eLayer != null)          {              foreach (Image item in image)              {                  eLayer.Children.Add(item);              }          }      }           /// <summary>      /// 隐藏或显示 ArcGis 层      /// </summary>      /// <param name="show">隐藏或显示</param>      /// <param name="layers">层</param>      public static voID LayersVisibility(bool show, params ElementLayer[] layers)      {          if (layers != null)          {              foreach (ElementLayer item in layers)              {                  item.Visible = show;              }          }      }           /// <summary>      /// 动态加载图层      /// 使用 ElementLayer 层      /// </summary>      /// <param name="eLayer"></param>      /// <param name="cacheGraphic"></param>      /// <param name="map"></param>      public static voID DynamicDrawElementLayer(ElementLayer eLayer, List<UIElement> cacheElement, Map map)      {          // 以下四个变量分别表示地图的四个边          // 即最大经纬度和最小经纬度          // xMax最大经度,yMax最大纬度          double xMax = map.Extent.XMax + 2;          double xMin = map.Extent.XMin - 2;          double yMax = map.Extent.YMax + 2;          double yMin = map.Extent.YMin - 2;               // 去除不在坐标范围内的点,先检查图层是否为空          if (eLayer != null)          {              int graphicCount = eLayer.Children.Count;              for (int i = 0; i < graphicCount; i++)              {                  UIElement element = eLayer.Children[i];                                    // 判断经度,纬度                  if (!(((element.GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.XMax < xMax && (element.GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.XMax > xMin)                      && ((element.GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.YMax < yMax && (element.GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.YMax > yMin)))                  {                      // 将点在地图上移除,并放在缓存中                      cacheElement.Add(eLayer.Children[i]);                      eLayer.Children.Remove(eLayer.Children[i]);                      graphicCount--;   // 当从集合中移除元素时应该把 graphicCount 减1                      i--;              // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1                  }              } // i          }               // 检查缓存是否为空,并将点绘制到图形上          if (cacheElement != null)          {              int count = cacheElement.Count;              for (int i = 0; i < count; i++)              {                  // 判断经度,纬度                  if (((cacheElement[i].GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.XMax < xMax && (cacheElement[i].GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.XMax > xMin)                      && ((cacheElement[i].GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.YMax < yMax && (cacheElement[i].GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.YMax > yMin))                  {                      // 运行到此则该点在目前地图范围内,将该点加入到地图中                      eLayer.Children.Add(cacheElement[i]);                      cacheElement.Remove(cacheElement[i]);                      count--;    // 当从集合中移除元素时应该把 count 减1                      i--;        // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1                      continue;                  }              }          }      }           /// <summary>      /// 将所有元素画到地图上      /// </summary>      /// <param name="eLayer"></param>      /// <param name="cacheElement"></param>      public static voID DrawAllUIElement(ElementLayer eLayer, List<UIElement> cacheElement)      {          if (eLayer != null)          {              foreach (UIElement item in cacheElement)              {                  eLayer.Children.Add(item);              }          }      }           /// <summary>      /// 动态的绘制图层      /// 当然地图移动到相应的坐标后绘制(保留原来的点,绘制新的数据)      /// 实现了无刷新绘制      /// </summary>      /// <param name="glayer">表示地图上的层</param>      /// <param name="cacheGraphic">存放 Graphics 的缓存</param>      /// <param name="map">表示一张 ArcGis 地图</param>      private static voID DynamicDrawSymbol(Graphicslayer glayer, List<Graphic> cacheGraphic,先检查图层是否为空          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,并将点绘制到图形上          if (cacheGraphic != null)          {              int count = cacheGraphic.Count;              for (int i = 0; i < count; i++)              {                  // 判断经度,纬度                  if ((cacheGraphic[i].Geometry.Extent.XMax < xMax && cacheGraphic[i].Geometry.Extent.XMax > xMin)                      && (cacheGraphic[i].Geometry.Extent.YMax < yMax && cacheGraphic[i].Geometry.Extent.YMax > yMin))                  {                      // 运行到此则该点在目前地图范围内,将该点加入到地图中                      glayer.Graphics.Add(cacheGraphic[i]);                      cacheGraphic.Remove(cacheGraphic[i]);                      count--;    // 当从集合中移除元素时应该把 count 减1                      i--;        // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1                      continue;                  }              }          }      }           /// <summary>      /// 将所有元素画到地图上      /// </summary>      /// <param name="eLayer"></param>      /// <param name="cacheElement"></param>      private static voID DrawAllGraphics(Graphicslayer eLayer, List<Graphic> cacheGraphic)      {          if (eLayer != null)          {              foreach (Graphic item in cacheGraphic)              {                  eLayer.Graphics.Add(item);              }          }      }             

 

今天把 GisMap 这个类都写出来了也为了我写下一篇文章做准备吧!后面会写一篇动态加载数据点的文章!因为当大批量点(2000)左右加载到地图上的时候,

就会非常的卡,基本都动不了,所以我们要动态去加载这些点。

总结

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

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

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

原文地址: http://www.outofmemory.cn/web/1018261.html

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

发表评论

登录后才能评论

评论列表(0条)

保存