地圖書籤,能夠理解爲暫時記錄當前地圖的範圍和放大級別,在後續的操做中若是想回到地圖以前的狀態,就能夠點擊保存的書籤就能夠回到此狀態,如圖所示:數據庫
地圖剛加載的時候是一幅世界地圖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);
效果圖: