MapImage.cs
上传用户:sex100000
上传日期:2013-11-09
资源大小:1377k
文件大小:13k
源码类别:

GIS编程

开发平台:

C#

  1. // Copyright 2005, 2006 - Morten Nielsen (www.iter.dk)
  2. //
  3. // This file is part of SharpMap.
  4. // SharpMap is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. // 
  9. // SharpMap is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU Lesser General Public License for more details.
  13. // You should have received a copy of the GNU Lesser General Public License
  14. // along with SharpMap; if not, write to the Free Software
  15. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  16. using System;
  17. using System.Collections.Generic;
  18. using System.ComponentModel;
  19. using System.Drawing;
  20. using System.Data;
  21. using System.Text;
  22. using System.Windows.Forms;
  23. namespace SharpMap.Forms
  24. {
  25. /// <summary>
  26. /// MapImage Class - MapImage control for Windows forms
  27. /// </summary>
  28. /// <remarks>
  29. /// The MapImage control adds basic functionality to a Windows Form, such as dynamic pan, zoom and data query.
  30. /// </remarks>
  31. [DesignTimeVisible(true)]
  32. public class MapImage : System.Windows.Forms.PictureBox
  33. {
  34. private bool _isCtrlPressed = false;
  35. /// <summary>
  36. /// Map tools enumeration
  37. /// </summary>
  38. public enum Tools
  39. {
  40. /// <summary>
  41. /// Pan
  42. /// </summary>
  43. Pan,
  44. /// <summary>
  45. /// Zoom in
  46. /// </summary>
  47. ZoomIn,
  48. /// <summary>
  49. /// Zoom out
  50. /// </summary>
  51. ZoomOut,
  52. /// <summary>
  53. /// Query tool
  54. /// </summary>
  55. Query,
  56. /// <summary>
  57. /// No active tool
  58. /// </summary>
  59. None
  60. }
  61. /// <summary>
  62. /// Initializes a new map
  63. /// </summary>
  64. public MapImage()
  65. {
  66. _Map = new SharpMap.Map(base.Size);
  67. _Activetool = Tools.None;
  68. base.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MapImage_MouseMove);
  69. base.MouseUp += new System.Windows.Forms.MouseEventHandler(this.MapImage_MouseUp);
  70. base.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MapImage_MouseDown);
  71. base.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.MapImage_Wheel);
  72. this.Cursor = Cursors.Cross;
  73. this.DoubleBuffered = true;
  74. }
  75. private double _wheelZoomMagnitude = 2;
  76. [Description("The amount which a single movement of the mouse wheel zooms by.")]
  77. [DefaultValue(2)]
  78. [Category("Behavior")]
  79. public double WheelZoomMagnitude
  80. {
  81. get { return _wheelZoomMagnitude; }
  82. set { _wheelZoomMagnitude = value; }
  83. }
  84. private double _fineZoomFactor = 10;
  85. [Description("The amount which the WheelZoomMagnitude is divided by " + 
  86. "when the Control key is pressed. A number greater than 1 decreases " +
  87. "the zoom, and less than 1 increases it. A negative number reverses it.")]
  88. [DefaultValue(10)]
  89. [Category("Behavior")]
  90. public double FineZoomFactor
  91. {
  92. get { return _fineZoomFactor; }
  93. set { _fineZoomFactor = value; }
  94. }
  95. private SharpMap.Map _Map;
  96. /// <summary>
  97. /// Map reference
  98. /// </summary>
  99. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  100. public SharpMap.Map Map
  101. {
  102. get { return _Map; }
  103. set
  104. {
  105. _Map = value;
  106. if (_Map != null)
  107. this.Refresh();
  108. }
  109. }
  110. private int _queryLayerIndex;
  111. /// <summary>
  112. /// Gets or sets the index of the active query layer 
  113. /// </summary>
  114. public int QueryLayerIndex
  115. {
  116. get { return _queryLayerIndex; }
  117. set { _queryLayerIndex = value; }
  118. }
  119. private SharpMap.Forms.MapImage.Tools _Activetool;
  120. /// <summary>
  121. /// Sets the active map tool
  122. /// </summary>
  123. public SharpMap.Forms.MapImage.Tools ActiveTool
  124. {
  125. get { return _Activetool; }
  126. set
  127. {
  128. bool fireevent = (value != _Activetool);
  129. _Activetool = value;
  130. if (value == Tools.Pan)
  131. this.Cursor = Cursors.Hand;
  132. else
  133. this.Cursor = Cursors.Cross;
  134. if (fireevent)
  135. if (ActiveToolChanged != null)
  136. ActiveToolChanged(value);
  137. }
  138. }
  139. /// <summary>
  140. /// Refreshes the map
  141. /// </summary>
  142. public override void Refresh()
  143. {
  144. if (_Map != null)
  145. {
  146. _Map.Size = this.Size;
  147. if (_Map.Layers == null || _Map.Layers.Count == 0)
  148. this.Image = null;
  149. else
  150. this.Image = _Map.GetMap();
  151. base.Refresh();
  152. if (MapRefreshed != null)
  153. MapRefreshed(this, null);
  154. }
  155. }
  156. #region Events
  157. /// <summary>
  158. /// MouseEventtype fired from the MapImage control
  159. /// </summary>
  160. /// <param name="WorldPos"></param>
  161. /// <param name="ImagePos"></param>
  162. public delegate void MouseEventHandler(SharpMap.Geometries.Point WorldPos, System.Windows.Forms.MouseEventArgs ImagePos);
  163. /// <summary>
  164. /// Fires when mouse moves over the map
  165. /// </summary>
  166. public new event MouseEventHandler MouseMove;
  167. /// <summary>
  168. /// Fires when map received a mouseclick
  169. /// </summary>
  170. public new event MouseEventHandler MouseDown;
  171. /// <summary>
  172. /// Fires when mouse is released
  173. /// </summary>
  174. public new event MouseEventHandler MouseUp;
  175. /// <summary>
  176. /// Fired when mouse is dragging
  177. /// </summary>
  178. public event MouseEventHandler MouseDrag;
  179. /// <summary>
  180. /// Fired when the map has been refreshed
  181. /// </summary>
  182. public event System.EventHandler MapRefreshed;
  183. /// <summary>
  184. /// Eventtype fired when the zoom was or are being changed
  185. /// </summary>
  186. /// <param name="zoom"></param>
  187. public delegate void MapZoomHandler(double zoom);
  188. /// <summary>
  189. /// Fired when the zoom value has changed
  190. /// </summary>
  191. public event MapZoomHandler MapZoomChanged;
  192. /// <summary>
  193. /// Fired when the map is being zoomed
  194. /// </summary>
  195. public event MapZoomHandler MapZooming;
  196. /// <summary>
  197. /// Eventtype fired when the map is queried
  198. /// </summary>
  199. /// <param name="data"></param>
  200. public delegate void MapQueryHandler(SharpMap.Data.FeatureDataTable data);
  201. /// <summary>
  202. /// Fired when the map is queried
  203. /// </summary>
  204. public event MapQueryHandler MapQueried;
  205. /// <summary>
  206. /// Eventtype fired when the center has changed
  207. /// </summary>
  208. /// <param name="center"></param>
  209. public delegate void MapCenterChangedHandler(SharpMap.Geometries.Point center);
  210. /// <summary>
  211. /// Fired when the center of the map has changed
  212. /// </summary>
  213. public event MapCenterChangedHandler MapCenterChanged;
  214. /// <summary>
  215. /// Eventtype fired when the map tool is changed
  216. /// </summary>
  217. /// <param name="tool"></param>
  218. public delegate void ActiveToolChangedHandler(SharpMap.Forms.MapImage.Tools tool);
  219. /// <summary>
  220. /// Fired when the active map tool has changed
  221. /// </summary>
  222. public event ActiveToolChangedHandler ActiveToolChanged;
  223. #endregion
  224. protected override void OnKeyDown(KeyEventArgs e)
  225. {
  226. _isCtrlPressed = e.Control;
  227. System.Diagnostics.Debug.WriteLine(String.Format("Ctrl: {0}", _isCtrlPressed));
  228. base.OnKeyDown(e);
  229. }
  230. protected override void OnKeyUp(KeyEventArgs e)
  231. {
  232. _isCtrlPressed = e.Control;
  233. System.Diagnostics.Debug.WriteLine(String.Format("Ctrl: {0}", _isCtrlPressed));
  234. base.OnKeyUp(e);
  235. }
  236. protected override void OnMouseHover(EventArgs e)
  237. {
  238. if (!Focused)
  239. {
  240. bool isFocused = Focus();
  241. System.Diagnostics.Debug.WriteLine(isFocused);
  242. }
  243. base.OnMouseHover(e);
  244. }
  245. private System.Drawing.Point mousedrag;
  246. private System.Drawing.Image mousedragImg;
  247. private bool mousedragging = false;
  248. private void MapImage_Wheel(object sender, System.Windows.Forms.MouseEventArgs e)
  249. {
  250. if (_Map != null)
  251. {
  252. double scale = ((double)e.Delta / 120.0);
  253. double scaleBase = 1 + (_wheelZoomMagnitude / (10 * ((double)(_isCtrlPressed ? _fineZoomFactor : 1))));
  254. _Map.Zoom *= Math.Pow(scaleBase, scale); 
  255. if (MapZoomChanged != null)
  256. MapZoomChanged(_Map.Zoom);
  257. Refresh();
  258. }
  259. }
  260. private void MapImage_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
  261. {
  262. if (_Map != null)
  263. {
  264. if (e.Button == MouseButtons.Left) //dragging
  265. mousedrag = e.Location;
  266. if (MouseDown != null)
  267. MouseDown(this._Map.ImageToWorld(new System.Drawing.Point(e.X, e.Y)), e);
  268. }
  269. }
  270. private void MapImage_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
  271. {
  272. if (_Map != null)
  273. {
  274. SharpMap.Geometries.Point p = this._Map.ImageToWorld(new System.Drawing.Point(e.X, e.Y));
  275. if (MouseMove != null)
  276. MouseMove(p, e);
  277. if (Image != null && e.Location != mousedrag && !mousedragging && e.Button == MouseButtons.Left)
  278. {
  279. mousedragImg = this.Image.Clone() as Image;
  280. mousedragging = true;
  281. }
  282. if (mousedragging)
  283. {
  284. if (MouseDrag != null)
  285. MouseDrag(p, e);
  286. if (this.ActiveTool == Tools.Pan)
  287. {
  288. System.Drawing.Image img = new System.Drawing.Bitmap(this.Size.Width, this.Size.Height);
  289. System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(img);
  290. g.Clear(Color.Transparent);
  291. g.DrawImageUnscaled(mousedragImg, new System.Drawing.Point(e.Location.X - mousedrag.X, e.Location.Y - mousedrag.Y));
  292. g.Dispose();
  293. this.Image = img;
  294. }
  295. else if (this.ActiveTool == Tools.ZoomIn || this.ActiveTool == Tools.ZoomOut)
  296. {
  297. System.Drawing.Image img = new System.Drawing.Bitmap(this.Size.Width, this.Size.Height);
  298. System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(img);
  299. g.Clear(Color.Transparent);
  300. float scale = 0;
  301. if (e.Y - mousedrag.Y < 0) //Zoom out
  302. scale = (float)Math.Pow(1 / (float)(mousedrag.Y - e.Y), 0.5);
  303. else //Zoom in
  304. scale = 1 + (e.Y - mousedrag.Y) * 0.1f;
  305. RectangleF rect = new RectangleF(0, 0, this.Width, this.Height);
  306. if (_Map.Zoom / scale < _Map.MinimumZoom)
  307. scale = (float)Math.Round(_Map.Zoom / _Map.MinimumZoom, 4);
  308. rect.Width *= scale;
  309. rect.Height *= scale;
  310. rect.Offset(this.Width / 2 - rect.Width / 2, this.Height / 2 - rect.Height / 2);
  311. g.DrawImage(mousedragImg, rect);
  312. g.Dispose();
  313. this.Image = img;
  314. if (MapZooming != null)
  315. MapZooming(scale);
  316. }
  317. }
  318. }
  319. }
  320. private void MapImage_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
  321. {
  322. if (_Map != null)
  323. {
  324. if (MouseUp != null)
  325. MouseUp(this._Map.ImageToWorld(new System.Drawing.Point(e.X, e.Y)), e);
  326. if (e.Button == MouseButtons.Left)
  327. {
  328. if (this.ActiveTool == Tools.ZoomOut)
  329. {
  330. double scale = 0.5;
  331. if (!mousedragging)
  332. {
  333. _Map.Center = this._Map.ImageToWorld(new System.Drawing.Point(e.X, e.Y));
  334. if (MapCenterChanged != null)
  335. MapCenterChanged(_Map.Center);
  336. }
  337. else
  338. {
  339. if (e.Y - mousedrag.Y < 0) //Zoom out
  340. scale = (float)Math.Pow(1 / (float)(mousedrag.Y - e.Y), 0.5);
  341. else //Zoom in
  342. scale = 1 + (e.Y - mousedrag.Y) * 0.1;
  343. }
  344. _Map.Zoom *= 1 / scale;
  345. if (MapZoomChanged != null)
  346. MapZoomChanged(_Map.Zoom);
  347. Refresh();
  348. }
  349. else if (this.ActiveTool == Tools.ZoomIn)
  350. {
  351. double scale = 2;
  352. if (!mousedragging)
  353. {
  354. _Map.Center = this._Map.ImageToWorld(new System.Drawing.Point(e.X, e.Y));
  355. if (MapCenterChanged != null)
  356. MapCenterChanged(_Map.Center);
  357. }
  358. else
  359. {
  360. if (e.Y - mousedrag.Y < 0) //Zoom out
  361. scale = (float)Math.Pow(1 / (float)(mousedrag.Y - e.Y), 0.5);
  362. else //Zoom in
  363. scale = 1 + (e.Y - mousedrag.Y) * 0.1;
  364. }
  365. _Map.Zoom *= 1 / scale;
  366. if (MapZoomChanged != null)
  367. MapZoomChanged(_Map.Zoom);
  368. Refresh();
  369. }
  370. else if (this.ActiveTool == Tools.Pan)
  371. {
  372. if (mousedragging)
  373. {
  374. System.Drawing.Point pnt = new System.Drawing.Point(this.Width / 2 + (mousedrag.X - e.Location.X), this.Height / 2 + (mousedrag.Y - e.Location.Y));
  375. _Map.Center = this._Map.ImageToWorld(pnt);
  376. if (MapCenterChanged != null)
  377. MapCenterChanged(_Map.Center);
  378. }
  379. else
  380. {
  381. _Map.Center = this._Map.ImageToWorld(new System.Drawing.Point(e.X, e.Y));
  382. if (MapCenterChanged != null)
  383. MapCenterChanged(_Map.Center);
  384. }
  385. Refresh();
  386. }
  387. else if (this.ActiveTool == Tools.Query)
  388. {
  389. if (_Map.Layers.Count > _queryLayerIndex && _queryLayerIndex > -1)
  390. {
  391. if (_Map.Layers[_queryLayerIndex].GetType() == typeof(SharpMap.Layers.VectorLayer))
  392. {
  393. SharpMap.Layers.VectorLayer layer = _Map.Layers[_queryLayerIndex] as SharpMap.Layers.VectorLayer;
  394. SharpMap.Geometries.BoundingBox bbox = this._Map.ImageToWorld(new System.Drawing.Point(e.X, e.Y)).GetBoundingBox().Grow(_Map.PixelSize * 5);
  395. SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet();
  396. layer.DataSource.Open();
  397. layer.DataSource.ExecuteIntersectionQuery(bbox, ds);
  398. layer.DataSource.Close();
  399. if (ds.Tables.Count > 0)
  400. if (MapQueried != null) MapQueried(ds.Tables[0]);
  401. else
  402. if (MapQueried != null) MapQueried(new SharpMap.Data.FeatureDataTable());
  403. }
  404. }
  405. else
  406. MessageBox.Show("No active layer to query");
  407. }
  408. }
  409. if (mousedragImg != null)
  410. {
  411. mousedragImg.Dispose();
  412. mousedragImg = null;
  413. }
  414. mousedragging = false;
  415. }
  416. }
  417. }
  418. }