PIE SDK地圖書籤

    地圖書籤,能夠理解爲暫時記錄當前地圖的範圍和放大級別,在後續的操做中若是想回到地圖以前的狀態,就能夠點擊保存的書籤就能夠回到此狀態,如圖所示:數據庫

    地圖剛加載的時候是一幅世界地圖express

 

   咱們將地圖的中心拖到南美洲,將地圖放大到必定比例,建立以「南美洲」爲名稱的書籤,以下圖所示:函數

    建立後書籤,在地圖上隨意拖動地圖,並進行放大或縮小,而後點擊「南美洲」書籤,地圖會定位到書籤的南美洲視圖範圍。工具

下面來介紹下實現的主要代碼:spa

要實現地圖書籤功能主要有兩個步驟:插件

一、如何建立書籤;設計

二、點擊書籤地圖如何定位到書籤的範圍3d

1、建立書籤code

   顯示書籤的列表用的是Devexpress插件中的  LayoutControl控件,orm

將要保存書籤的視圖範圍輸出爲圖片.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     //一、獲取書籤的名稱
 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     //二、輸出圖片
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 = @"..\Data\Bookmark\pic\" + 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     //三、界面設計(將圖片展現在書籤列表)
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 }
 

2、點擊書籤地圖定位書籤的範圍

        點擊書籤分爲單擊和雙擊,單擊時選中書籤,雙擊時,地圖範圍更新變化,單擊時:選中書籤,其餘選中的書籤設置爲不選中

 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);

    效果圖: 

 

相關文章
相關標籤/搜索