/// <summary> /// 把一个mark按照网格的大小,分配到具体的网格中 /// </summary> /// <param name="map">地图容器,需要该地图容器中已经装载基础图层</param> /// <param name="mark"></param> /// <param name="gridstep">单位为像素,网格大小(int),网格设计为gridstep*gridstep</param> /// <returns></returns> protected bool calGrid(MapContainerBase map, ImyMark mark, double gridstep) { if (map == null) { MessageBox.Show("没有地图!"); return(false); } if (mark == null) { MessageBox.Show("没有标注!"); return(false); } if (mark.X < map.WinViewBound.XMin || mark.X > map.WinViewBound.XMax || mark.Y < map.WinViewBound.YMin || mark.Y > map.WinViewBound.YMax) { //MessageBox.Show("mark没在当前视图范围内"); return(false); } if (gridstep > map.CurShowScale * (map.WinViewBound.XMax - map.WinViewBound.XMin) || gridstep > map.CurShowScale * (map.WinViewBound.YMax - map.WinViewBound.YMin)) { MessageBox.Show("网格步长太长"); return(false); } int col = new int(); int row = new int(); col = (int)Math.Floor((mark.X - map.WinViewBound.XMin) / (gridstep / map.CurShowScale)); row = (int)Math.Floor((mark.Y - map.WinViewBound.YMin) / (gridstep / map.CurShowScale)); if (temMarkArr[row][col] == null) { temMarkArr[row][col] = new List <ImyMark>(); } temMarkArr[row][col].Add(mark); return(true); }
/// <summary> /// 释放资源 /// </summary> public virtual void Dispose() { FlickerStop(); if (m_mapContainer != null) { m_mapContainer.MouseMove -= new MouseEventHandler(OnMouseMove); } m_markLayer = null; m_mapContainer = null; }
/// <summary> /// 构造函数 /// </summary> /// <param name="markControl">要显示的标注点控件对象</param> /// <param name="coordinateType">坐标类型(默认是屏幕坐标,如果是逻辑坐标,在绘图时会根据地图容器的LogicToScreen方法转换坐标)</param> /// <param name="mLayer">标注图层对象,为“null”时会内部自动获取</param> public MarkBase(FrameworkElement markControl, CoordinateType coordinateType = CoordinateType.Screen, MarkLayer mLayer = null) { if (mLayer != null) { m_markLayer = mLayer; m_mapContainer = mLayer.MapContainer; } if (markControl != null) { this.m_markControl = markControl; m_coordinateType = coordinateType; this.m_markControl.Tag = this; this.m_markControl.Loaded += new RoutedEventHandler(OnLoaded); m_markControl.MouseLeftButtonDown += new MouseButtonEventHandler(OnMouseLeftButtonDown); m_markControl.MouseLeftButtonUp += new MouseButtonEventHandler(OnMouseLeftButtonUp); } }
/// <summary> /// 控件加载完毕 /// </summary> /// <param name="sender">事件发送者</param> /// <param name="e">事件数据源</param> protected virtual void OnLoaded(object sender, RoutedEventArgs e) { this.m_markControl.Loaded -= new RoutedEventHandler(OnLoaded); if (m_markControl != null && m_markControl.Parent is MarkLayer) { m_markLayer = m_markControl.Parent as MarkLayer; m_mapContainer = m_markLayer.MapContainer; if (m_mapContainer != null) { if (m_xLogicChange || m_yLogicChange) { double ml_x = Canvas.GetLeft(this.m_markLayer); double ml_y = Canvas.GetTop(this.m_markLayer); double w = double.IsNaN(m_markControl.Width) ? 0 : m_markControl.Width / 2; //m_markControl.ActualWidth / 2;// double h = double.IsNaN(m_markControl.Height) ? 0 : m_markControl.Height / 2; //m_markControl.ActualHeight / 2;// if (m_coordinateType == CoordinateType.Logic && m_mapContainer != null) { Point pnt = m_mapContainer.LogicToScreen(m_x, m_y); if (!double.IsNaN(pnt.X) && !double.IsNaN(pnt.Y)) { Canvas.SetLeft(m_markControl, pnt.X - w - ml_x); Canvas.SetTop(m_markControl, pnt.Y - h - ml_y); } } else { Canvas.SetLeft(m_markControl, m_x - w - ml_x); Canvas.SetTop(m_markControl, m_y - h - ml_y); } } if (m_enableDrag) { m_mapContainer.MouseMove += new MouseEventHandler(OnMouseMove); } else { m_mapContainer.MouseMove -= new MouseEventHandler(OnMouseMove); } } } m_yLogicChange = false; m_xLogicChange = false; }