Example #1
0
        /// <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);
        }
Example #2
0
 /// <summary>
 /// 释放资源
 /// </summary>
 public virtual void Dispose()
 {
     FlickerStop();
     if (m_mapContainer != null)
     {
         m_mapContainer.MouseMove -= new MouseEventHandler(OnMouseMove);
     }
     m_markLayer    = null;
     m_mapContainer = null;
 }
Example #3
0
 /// <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);
     }
 }
Example #4
0
 /// <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;
 }