• PIE SDK地图书签


        地图书签,可以理解为暂时记录当前地图的范围和放大级别,在后续的操作中如果想回到地图之前的状态,就可以点击保存的书签就可以回到此状态,如图所示:

        地图刚加载的时候是一幅世界地图

     

       我们将地图的中心拖到南美洲,将地图放大到一定比例,创建以“南美洲”为名称的书签,如下图所示:

        创建后书签,在地图上随意拖动地图,并进行放大或缩小,然后点击“南美洲”书签,地图会定位到书签的南美洲视图范围。

    下面来介绍下实现的主要代码:

    要实现地图书签功能主要有两个步骤:

    1、如何创建书签;

    2、点击书签地图如何定位到书签的范围

    一、创建书签

       显示书签的列表用的是Devexpress插件中的  LayoutControl控件,

    将要保存书签的视图范围输出为图片.png格式,然后用文件流将图片转换成Image,显示在书签列表中。示例中创建的书签信息数据存储在字典表IDictionary<string,object>  m_DicBookMarkInfo中,其中值存储形式格式定义的是结构体BookMarkInfo,书签信息数据可以根据数据库的不同进行存储;

     1 /// <summary>
     2 /// 存储书签信息结构体
     3 /// </summary>
     4 public struct BookMarkInfo
     5 {
     6     public string key;//书签名称
     7     public LayoutControlItem layoutControlItem;//书签子控件
     8     public PIE.Geometry.IEnvelope envelope;//书签范围
     9     public PictureBox image;//书签范围图片
    10     public PIE.Geometry.ISpatialReference spatialReference;//空间参考
    11 }

     

     1 /// <summary>
     2 /// 添加地图书签
     3 /// </summary>
     4 /// <param name="sender"></param>
     5 /// <param name="e"></param>
     6 private void tbn_AddBookMark_Click(object sender, EventArgs e)
     7 {
     8     //1、获取书签的名称
     9     FrmAddBookMark bookMark = new FrmAddBookMark(m_DicBookMarkInfo);
    10     if (bookMark.ShowDialog() != DialogResult.OK) return;
    11     m_BookMarkName = bookMark.GetBookMarkName();
    12     if (string.IsNullOrEmpty(m_BookMarkName)) return;
    13 
    14     //2、输出图片
    15     IDisplayTransformation displayTransformation = mapControlMain.ActiveView.DisplayTransformation;
    16     PIE.Carto.ExportPNG export = new ExportPNG();
    17     export.Width = (int)displayTransformation.DeviceFrame.Width;
    18     export.Height = (int)displayTransformation.DeviceFrame.Height;
    19     export.ExportFileName = @"..DataBookmarkpic" + m_BookMarkName + ".png";
    20 
    21     string filePath = Path.GetDirectoryName(export.ExportFileName);
    22     if (!Directory.Exists(filePath))
    23     {
    24         Directory.CreateDirectory(filePath);
    25     }
    26     export.StartExporting();
    27     mapControlMain.ActiveView.Output(export as IExport, 96, displayTransformation.DeviceFrame, mapControlMain.ActiveView.Extent, null);
    28     export.FinishExporting();
    29 
    30     //3、界面设计(将图片展示在书签列表)
    31     Design(export.ExportFileName);
    32 }
    33 /// <summary>
    34 /// 书签界面设计
    35 /// </summary>
    36 /// <param name="filePath">输出图片路径</param>
    37 private void Design(string filePath)
    38 {
    39     PictureBox pictureBox1 = new PictureBox();
    40     //将保存的图片展示在书签列表
    41     using (FileStream image = new FileStream(filePath, FileMode.Open))
    42     {
    43         pictureBox1.Image = Image.FromStream(image);
    44     }
    45     LayoutControlItem item = layoutControlGroup1.AddItem(m_BookMarkName, pictureBox1) as LayoutControlItem;
    46     item.Name = m_BookMarkName;
    47 
    48     pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
    49     IEnvelope envelope = m_ActiveView.Extent;
    50     pictureBox1.Name = m_BookMarkName;
    51     pictureBox1.Size = new Size(300, 100);
    52     pictureBox1.Enabled = false;
    53 
    54     //事件
    55     item.Click += ItemPictureBox_Click;
    56     item.DoubleClick += ItemPictureBox_DoubleClick;
    57 
    58     item.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
    59     item.MaxSize = new Size(250, 150);
    60     item.MinSize = new Size(250, 150);
    61     item.TextLocation = DevExpress.Utils.Locations.Bottom;
    62 
    63     item.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
    64     item.Spacing = new DevExpress.XtraLayout.Utils.Padding(10);
    65     item.AppearanceItemCaption.Font = new System.Drawing.Font("宋体", 13F, FontStyle.Bold);
    66 
    67     //存储标签信息
    68     BookMarkInfo bookMarkInfo = new BookMarkInfo();
    69     bookMarkInfo.key = m_BookMarkName;
    70     bookMarkInfo.layoutControlItem = item;
    71     bookMarkInfo.envelope = envelope;
    72     bookMarkInfo.image = pictureBox1;
    73     bookMarkInfo.spatialReference = mapControlMain.FocusMap.SpatialReference;
    74 
    75     m_DicBookMarkInfo.Add(m_BookMarkName, bookMarkInfo);//将信息存进字典表中
    76 }
     

    二、点击书签地图定位书签的范围

            点击书签分为单击和双击,单击时选中书签,双击时,地图范围更新变化,单击时:选中书签,其他选中的书签设置为不选中

     1 /// <summary>
     2 /// 单击事件
     3 /// </summary>
     4 /// <param name="sender"></param>
     5 /// <param name="e"></param>
     6 void ItemPictureBox_Click(object sender, EventArgs e)
     7 {
     8     LayoutControlItem item = (LayoutControlItem)sender;
     9     m_SelectedBookMarkName = item.Name;
    10 
    11     item.Selected = true;
    12     foreach (String key in m_DicBookMarkInfo.Keys)
    13     {
    14         if (key != item.Name)
    15         {
    16             BookMarkInfo structBookMark = new BookMarkInfo();
    17             structBookMark = (BookMarkInfo)m_DicBookMarkInfo[key];
    18 
    19            LayoutControlItem otherItem = structBookMark.layoutControlItem;
    20             otherItem.Selected = false;
    21         }
    22     }
    23 }
     

        双击时:获取存储的选中对应书签的范围,并根据地图坐标系的不同进行转换,然后将地图的视图更新为选中书签的范围

     1 /// <summary>
     2 /// 双击标签图片
     3 /// </summary>
     4 /// <param name="sender"></param>
     5 /// <param name="e"></param>
     6 void ItemPictureBox_DoubleClick(object sender, EventArgs e)
     7 {
     8     LayoutControlItem pb = (LayoutControlItem)sender;
     9     pan(pb);
    10 }
    11     /// <summary>
    12     /// 定位函数
    13     /// </summary>
    14     /// <param name="pb">书签控件</param>
    15     private void pan(LayoutControlItem pb)
    16     {
    17     BookMarkInfo structBookMarkInfo = new BookMarkInfo();
    18     structBookMarkInfo = (BookMarkInfo)m_DicBookMarkInfo[pb.Name];
    19     IEnvelope envelope = structBookMarkInfo.envelope;
    20     IPointCollection polygon = new Polygon();
    21     String name = pb.Name;
    22     polygon.AddPoint(transform(envelope.XMax, envelope.YMax, name, 1), transform(envelope.XMax, envelope.YMax, name, 2));
    23     polygon.AddPoint(transform(envelope.XMin, envelope.YMax, name, 1), transform(envelope.XMin, envelope.YMax, name, 2));
    24     polygon.AddPoint(transform(envelope.XMax, envelope.YMin, name, 1), transform(envelope.XMax, envelope.YMin, name, 2));
    25     polygon.AddPoint(transform(envelope.XMin, envelope.YMin, name, 1), transform(envelope.XMin, envelope.YMin, name, 2));
    26     IGeometry geometry = polygon as IGeometry;
    27 
    28     m_ActiveView.ZoomTo(geometry);
    29     m_ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
    30 
    31     LayoutControlItem item = structBookMarkInfo.layoutControlItem;
    32     item.Selected = true;
    33 
    34     foreach (String key in m_DicBookMarkInfo.Keys)
    35     {
    36         if (key != item.Name)
    37         {
    38             BookMarkInfo structBookMark = new BookMarkInfo();
    39             structBookMark = (BookMarkInfo)m_DicBookMarkInfo[key];
    40 
    41             LayoutControlItem otherItem = structBookMark.layoutControlItem;
    42             otherItem.Selected = false;
    43         }
    44     }
    45     }
    46 
    47     /// <summary>
    48     /// 不同坐标系间坐标转换函数
    49     /// </summary>
    50     /// <param name="x">原坐标系x坐标</param>
    51     /// <param name="y">原坐标系x坐标</param>
    52     /// <param name="name">书签名称</param>
    53     /// <param name="flag">判断返回x或y的对象</param>
    54     /// <returns>转换后xy坐标</returns>
    55     private double transform(double x, double y, String name, int flag)
    56     {
    57     BookMarkInfo structBookMarkInfo = new BookMarkInfo();
    58     structBookMarkInfo = (BookMarkInfo)m_DicBookMarkInfo[name];
    59     // 定义点
    60     IPoint point = new PIE.Geometry.Point();
    61     point.PutCoords(x, y);
    62     // 设置空间参考
    63     IGeometry geo = point as IGeometry;
    64     geo.SpatialReference = structBookMarkInfo.spatialReference;
    65     // 空间参考变换
    66     geo.Transform(m_ActiveView.FocusMap.SpatialReference);
    67     // 获取坐标值
    68     double x1, y1;
    69     x1 = y1 = 0;
    70     point.QueryCoords(ref x1, ref y1);
    71     if (flag == 1) return x1;
    72     else return y1;
    73     }

    代码路径:

    项目名称

    百度云盘地址下/PIE示例程序/13.小工具集锦/地图书签/ BookMarkDemo

    数据路径

    百度云盘地址下/PIE示例数据/栅格数据/04.World/World.tif

    视频路径

    百度云盘地址下/PIE视频教程/13.小工具集锦/地图书签.avi

    注意:

        在地图初始化的时候,图层树控件需要手动绑定地图控件:

        tocControlMain.SetBuddyControl(mapControlMain as PIE.Carto.IPmdContents);

        效果图: 

     

  • 相关阅读:
    RESTful API 设计指南
    理解RESTful架构
    django-mysqlclient_1193错误
    获取当前脚本所在的目录和路径
    20191007
    20191005
    20191001
    20190927
    20190922
    莫比乌斯反演证明
  • 原文地址:https://www.cnblogs.com/PIESat/p/10307336.html
Copyright © 2020-2023  润新知