问题提出:
在实际中通常会遇到这样的情况,如果地图范围小,而且需要在地图上展示的元素又比较多的时候(在展现元素符号的同时,还展示元素名称或其他属性值等),这样如果在首次加载地图的时候一次性全部显示,必然会出现严重的重叠现象,怎么解决?
解决思路:
我想大家首先想到的就是分层显示,不错,其实这就是一个方便可行的思路。为数据库表中增加一个显示层次的字段,比如叫ShowLevel,默认是0-第一层显示,1-第二层显示...,然后在Map的Layers中添加多个Graphics,有几层就设置多少个,然后在后台程序中通过判断元素是ShowLevel属性,将元素添加到各自不同的Graphics当中去,最后处理Map的ExtendChanged事件,找到一个显示的边界值,然后通过判断当前的缩放比例是否达到了这个边界值,如果达到了,就显示第二层,如果没有达到就隐藏。
具体实现及部分代码如下:
1、首先数据库中增加一个字段,ShowLevel,默认值为0
2、在MainPage.xaml中多增加几个Graphics
<esri:Map.Layers>
<esri:GraphicsLayer ID="MyGraphicsLayer">
</esri:GraphicsLayer>
<esri:GraphicsLayer ID="MyGraphicsLayer3">
</esri:GraphicsLayer>
<!--站点名称-->
<esri:GraphicsLayer ID="GraphicsLayer1">
</esri:GraphicsLayer>
<esri:GraphicsLayer ID="GraphicsLayer11">
</esri:GraphicsLayer>
<!--站点数据-->
<esri:GraphicsLayer ID="GraphicsLayer2">
</esri:GraphicsLayer>
<esri:GraphicsLayer ID="GraphicsLayer22">
</esri:GraphicsLayer>
<!--站点编码-->
<esri:GraphicsLayer ID="GraphicsLayer3">
</esri:GraphicsLayer>
<esri:GraphicsLayer ID="GraphicsLayer33">
</esri:Map.Layers>
3、MainPage.xaml.cs中根据ShowLevel字段值,分别添加到各自的Graphics中
ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();
//每次加载时先清空地图上数据
GraphicsLayer graphicsLayer = myMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
graphicsLayer.ClearGraphics();
GraphicsLayer graphicsLayer0 = myMap.Layers["MyGraphicsLayer3"] as GraphicsLayer;
graphicsLayer0.ClearGraphics();
GraphicsLayer graphicsLayer1 = myMap.Layers["GraphicsLayer1"] as GraphicsLayer;
graphicsLayer1.ClearGraphics();
GraphicsLayer graphicsLayer2 = myMap.Layers["GraphicsLayer2"] as GraphicsLayer;
graphicsLayer2.ClearGraphics();
GraphicsLayer graphicsLayer3 = myMap.Layers["GraphicsLayer3"] as GraphicsLayer;
graphicsLayer3.ClearGraphics();
GraphicsLayer graphicsLayer11 = myMap.Layers["GraphicsLayer11"] as GraphicsLayer;
graphicsLayer11.ClearGraphics();
GraphicsLayer graphicsLayer22 = myMap.Layers["GraphicsLayer22"] as GraphicsLayer;
graphicsLayer22.ClearGraphics();
GraphicsLayer graphicsLayer33 = myMap.Layers["GraphicsLayer33"] as GraphicsLayer;
graphicsLayer33.ClearGraphics();
//获取到所有的山洪雨量点
ObservableCollection<RainFall> lists = e.Result;
//从集合中找出最大值对应的经纬度坐标
RainFall max = lists.OrderByDescending(s => s.YL24).FirstOrDefault();
//动态添加点到地图上
Graphic graphic = null; //第一层
Graphic graphic2 = null; //第二层
foreach (RainFall item in lists)
{
if (!string.IsNullOrEmpty(item.Latitute.ToString()) && !string.IsNullOrEmpty(item.Longitute.ToString()))
{
//有坐标值时,将该监测点添加到地图上去
if (max.YLZBM == item.YLZBM)
{
if (max.YL24 != 0)
{
//最大值不为0,红点闪烁
graphic = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim()), double.Parse(item.Longitute.ToString().Trim()))),
Symbol = LayoutRoot.Resources["DefaultMarkerSymbol"] as Symbol
};
}
else
{
//保持原来的蓝色标记点符号
graphic = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim()), double.Parse(item.Longitute.ToString().Trim()))),
Symbol = LayoutRoot.Resources["BlueMarkerSymbol"] as Symbol
};
}
//保存属性
graphic.Attributes["YLZBM"] = item.YLZBM; //雨量站编码
graphic.Attributes["YLZMC"] = item.ZDMC; //雨量站名称
graphic.Attributes["YL24"] = item.YL24; //24小时雨量
graphic.Attributes["DTNow"] = item.DTNow; //当前时间
graphic.Attributes["Latitute"] = item.Latitute; //纬度
graphic.Attributes["Longitute"] = item.Longitute; //经度
//将该Graphics添加到GraphicsLayer中去
graphicsLayer.Graphics.Add(graphic);
graphicsLayer.Opacity = 1;
//鼠标移入事件
graphic.MouseEnter += new MouseEventHandler(sh_graphic_MouseEnter);
graphic.MouseLeave += new MouseEventHandler(sh_graphic_MouseLeave);
//鼠标点击事件
#region 站点名称
//动态添加文本
TextSymbol textSymbol = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 117, 20, 99)),
FontSize = 12,
Text = item.ZDMC,
OffsetX = 12,
OffsetY = -5
};
Graphic graphicText1 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol
};
graphicText1.Attributes["TextYLZMC"] = item.ZDMC;
graphicsLayer1.Graphics.Add(graphicText1);
#endregion
#region 水位/雨量 数值
if (item.YL24 != 0)
{
TextSymbol textSymbol2 = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 255, 0, 0)),
FontSize = 14,
Text = item.YL24.ToString(),
OffsetX = 10,
OffsetY = 23
};
Graphic graphicText2 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol2
};
graphicText2.Attributes["TextYL"] = item.YL24;
graphicsLayer2.Graphics.Add(graphicText2);
}
#endregion
#region 站点编码
//动态添加站点编码
TextSymbol textSymbol3 = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 0, 0, 0)),
FontSize = 12,
Text = item.YLZBM,
OffsetX = 27,
OffsetY = 23
};
Graphic graphicText3 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol3
};
graphicText3.Attributes["TextYLZBM"] = item.YLZBM;
graphicsLayer3.Graphics.Add(graphicText3);
graphicsLayer3.Visible = false;
#endregion
//左键点击事件
graphic.MouseLeftButtonDown += new MouseButtonEventHandler(sh_graphic_MouseLeftButtonDown);
graphic.MouseLeftButtonUp += new MouseButtonEventHandler(sh_graphic_MouseLeftButtonUp);
}
else
{
//这里判断显示层数
if (item.ShowLevel == 0)
{
#region 显示第一层数据
graphic = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim()), double.Parse(item.Longitute.ToString().Trim()))),
Symbol = LayoutRoot.Resources["BlueMarkerSymbol"] as Symbol
};
//保存属性
graphic.Attributes["YLZBM"] = item.YLZBM; //雨量站编码
graphic.Attributes["YLZMC"] = item.ZDMC; //雨量站名称
graphic.Attributes["YL24"] = item.YL24; //24小时雨量
graphic.Attributes["DTNow"] = item.DTNow; //当前时间
graphic.Attributes["Latitute"] = item.Latitute; //纬度
graphic.Attributes["Longitute"] = item.Longitute; //经度
//将该Graphics添加到GraphicsLayer中去
graphicsLayer.Graphics.Add(graphic);
graphicsLayer.Opacity = 1;
//鼠标移入事件
graphic.MouseEnter += new MouseEventHandler(sh_graphic_MouseEnter);
graphic.MouseLeave += new MouseEventHandler(sh_graphic_MouseLeave);
//鼠标点击事件
#region 站点名称
//动态添加文本
TextSymbol textSymbol = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 117, 20, 99)),
FontSize = 12,
Text = item.ZDMC,
OffsetX = 12,
OffsetY = -5
};
Graphic graphicText1 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol
};
graphicText1.Attributes["TextYLZMC"] = item.ZDMC;
graphicsLayer1.Graphics.Add(graphicText1);
#endregion
#region 水位/雨量 数值
if (item.YL24 != 0)
{
TextSymbol textSymbol2 = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 255, 0, 0)),
FontSize = 14,
Text = item.YL24.ToString(),
OffsetX = 10,
OffsetY = 23
};
Graphic graphicText2 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol2
};
graphicText2.Attributes["TextYL"] = item.YL24;
graphicsLayer2.Graphics.Add(graphicText2);
}
#endregion
#region 站点编码
//动态添加站点编码
TextSymbol textSymbol3 = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 0, 0, 0)),
FontSize = 12,
Text = item.YLZBM,
OffsetX = 27,
OffsetY = 23
};
Graphic graphicText3 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol3
};
graphicText3.Attributes["TextYLZBM"] = item.YLZBM;
graphicsLayer3.Graphics.Add(graphicText3);
graphicsLayer3.Visible = false;
#endregion
//左键点击事件
graphic.MouseLeftButtonDown += new MouseButtonEventHandler(sh_graphic_MouseLeftButtonDown);
graphic.MouseLeftButtonUp += new MouseButtonEventHandler(sh_graphic_MouseLeftButtonUp);
#endregion
}
else
{
#region 显示第二层数据
graphic2 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim()), double.Parse(item.Longitute.ToString().Trim()))),
Symbol = LayoutRoot.Resources["BlueMarkerSymbol"] as Symbol
};
//保存属性
graphic2.Attributes["YLZBM"] = item.YLZBM; //雨量站编码
graphic2.Attributes["YLZMC"] = item.ZDMC; //雨量站名称
graphic2.Attributes["YL24"] = item.YL24; //24小时雨量
graphic2.Attributes["DTNow"] = item.DTNow; //当前时间
graphic2.Attributes["Latitute"] = item.Latitute; //纬度
graphic2.Attributes["Longitute"] = item.Longitute; //经度
//将该Graphics添加到GraphicsLayer中去
graphicsLayer0.Graphics.Add(graphic2);
graphicsLayer0.Opacity = 1;
if (currentValue > tip_Base.sideValue)
{
graphicsLayer0.Visible = false;
}
else
{
graphicsLayer0.Visible = true;
}
//鼠标移入事件
graphic2.MouseEnter += new MouseEventHandler(sh_graphic_MouseEnter);
graphic2.MouseLeave += new MouseEventHandler(sh_graphic_MouseLeave);
//鼠标点击事件
#region 站点名称
//动态添加文本
TextSymbol textSymbol = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 117, 20, 99)),
FontSize = 12,
Text = item.ZDMC,
OffsetX = 12,
OffsetY = -5
};
Graphic graphicText1 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol
};
graphicText1.Attributes["TextYLZMC"] = item.ZDMC;
graphicsLayer11.Graphics.Add(graphicText1);
if (currentValue > tip_Base.sideValue)
{
graphicsLayer11.Visible = false;
}
else
{
graphicsLayer11.Visible = true;
}
#endregion
#region 水位/雨量 数值
if (item.YL24 != 0)
{
TextSymbol textSymbol2 = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 255, 0, 0)),
FontSize = 14,
Text = item.YL24.ToString(),
OffsetX = 10,
OffsetY = 23
};
Graphic graphicText2 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol2
};
graphicText2.Attributes["TextYL"] = item.YL24;
graphicsLayer22.Graphics.Add(graphicText2);
if (currentValue > tip_Base.sideValue)
{
graphicsLayer22.Visible = false;
}
else
{
graphicsLayer22.Visible = true;
}
}
#endregion
#region 站点编码
//动态添加站点编码
TextSymbol textSymbol3 = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(Color.FromArgb(255, 0, 0, 0)),
FontSize = 12,
Text = item.YLZBM,
OffsetX = 27,
OffsetY = 23
};
Graphic graphicText3 = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture), double.Parse(item.Longitute.ToString().Trim(), System.Globalization.CultureInfo.InvariantCulture))),
Symbol = textSymbol3
};
graphicText3.Attributes["TextYLZBM"] = item.YLZBM;
graphicsLayer33.Graphics.Add(graphicText3);
graphicsLayer33.Visible = false;
#endregion
//左键点击事件
graphic2.MouseLeftButtonDown += new MouseButtonEventHandler(sh_graphic_MouseLeftButtonDown);
graphic2.MouseLeftButtonUp += new MouseButtonEventHandler(sh_graphic_MouseLeftButtonUp);
#endregion
}
}
}
else
{
//不做任何处理,不添加任何点信息
}
}
4、在Map的ExtendChanged事件中处理
private void myMap_ExtentChanged(object sender, ExtentEventArgs e)
{
currentValue = (e.NewExtent.XMax - e.NewExtent.XMin) / (myMap.Layers.GetFullExtent().XMax - myMap.Layers.GetFullExtent().XMin);
ShowSiteByGrade();
}
/// <summary>
/// 判断是在第一层还是第二层显示
/// </summary>
private void ShowSiteByGrade()
{
if (currentValue >= tip_Base.sideValue)
{
GraphicsLayer graphicsLayer0 = myMap.Layers["MyGraphicsLayer3"] as GraphicsLayer;
graphicsLayer0.Visible = false;
GraphicsLayer graphicsLayer2 = myMap.Layers["GraphicsLayer11"] as GraphicsLayer;
graphicsLayer2.Visible = false;
GraphicsLayer graphicsLayer3 = myMap.Layers["GraphicsLayer22"] as GraphicsLayer;
graphicsLayer3.Visible = false;
GraphicsLayer graphicsLayer4 = myMap.Layers["GraphicsLayer33"] as GraphicsLayer;
graphicsLayer4.Visible = false;
}
else
{
GraphicsLayer graphicsLayer = myMap.Layers["MyGraphicsLayer3"] as GraphicsLayer;
graphicsLayer.Visible = true;
GraphicsLayer graphicsLayer2 = myMap.Layers["GraphicsLayer11"] as GraphicsLayer;
graphicsLayer2.Visible = true;
GraphicsLayer graphicsLayer3 = myMap.Layers["GraphicsLayer22"] as GraphicsLayer;
graphicsLayer3.Visible = true;
GraphicsLayer graphicsLayer4 = myMap.Layers["GraphicsLayer33"] as GraphicsLayer;
graphicsLayer4.Visible = false;
}
}