protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (_map != null) { if (MouseUp != null) MouseUp(_map.ImageToWorld(new Point(e.X, e.Y)), e); if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Middle) { if (_activeTool == Tools.ZoomOut) { double scale = 0.5; if (_dragging) { if (e.Y - _dragStartPoint.Y < 0) //Zoom out scale = (float)Math.Pow(1 / (float)(_dragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - _dragStartPoint.Y) * 0.1; } else { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } _map.Zoom /= scale; if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } else if (_activeTool == Tools.ZoomIn) { double scale = 2; if (_dragging) { if (e.Y - _dragStartPoint.Y < 0) //Zoom out scale = (float)Math.Pow(1 / (float)(_dragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - _dragStartPoint.Y) * 0.1; } else { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } _map.Zoom *= 1 / scale; if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } else if (_activeTool == Tools.Pan && !(_shiftButtonDragRectangleZoom && (Control.ModifierKeys & Keys.Shift) != Keys.None)) { if (_dragging) { Point point = new Point(ClientSize.Width / 2 + (_dragStartPoint.X - e.Location.X), ClientSize.Height / 2 + (_dragStartPoint.Y - e.Location.Y)); _map.Center = _map.ImageToWorld(point); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } else { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } } else if (_activeTool == Tools.Query) { if (_map.Layers.Count > _queryLayerIndex && _queryLayerIndex > -1) { /* if (m_Map.Layers[m_QueryLayerIndex].GetType() == typeof(Layers.VectorLayer)) { Layers.VectorLayer layer = m_Map.Layers[m_QueryLayerIndex] as Layers.VectorLayer; Geometries.BoundingBox bounding; if (m_Dragging) { GeoPoint lowerLeft; GeoPoint upperRight; GetBounds(m_Map.ImageToWorld(m_DragStartPoint), m_Map.ImageToWorld(m_DragEndPoint), out lowerLeft, out upperRight); bounding = new Geometries.BoundingBox(lowerLeft, upperRight); } else bounding = m_Map.ImageToWorld(new Point(e.X, e.Y)).GetBoundingBox().Grow(m_Map.PixelSize * 5); Data.FeatureDataSet ds = new Data.FeatureDataSet(); layer.DataSource.Open(); layer.DataSource.ExecuteIntersectionQuery(bounding, ds); layer.DataSource.Close(); if (MapQueried != null) MapQueried((ds.Tables.Count > 0 ? ds.Tables[0] : new Data.FeatureDataTable())); } */ var layer = _map.Layers[_queryLayerIndex] as ICanQueryLayer; if (layer != null) { BoundingBox bounding; if (_dragging) { GeoPoint lowerLeft; GeoPoint upperRight; GetBounds(_map.ImageToWorld(_dragStartPoint), _map.ImageToWorld(_dragEndPoint), out lowerLeft, out upperRight); bounding = new BoundingBox(lowerLeft, upperRight); } else bounding = _map.ImageToWorld(new Point(e.X, e.Y)).GetBoundingBox().Grow(_map.PixelSize * 5); Data.FeatureDataSet ds = new Data.FeatureDataSet(); layer.ExecuteIntersectionQuery(bounding, ds); if (ds.Tables.Count > 0) if (MapQueried != null) MapQueried(ds.Tables[0]); else if (MapQueried != null) MapQueried(new Data.FeatureDataTable()); } } else MessageBox.Show("No active layer to query"); } else if (_activeTool == Tools.ZoomWindow || (_shiftButtonDragRectangleZoom && (Control.ModifierKeys & Keys.Shift) != Keys.None)) { if (_rectangle.Width > 0 && _rectangle.Height > 0) { GeoPoint lowerLeft; GeoPoint upperRight; GetBounds(_map.ImageToWorld(_dragStartPoint), _map.ImageToWorld(_dragEndPoint), out lowerLeft, out upperRight); _dragEndPoint.X = 0; _dragEndPoint.Y = 0; _map.ZoomToBox(new BoundingBox(lowerLeft, upperRight)); if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } } else if (_activeTool == Tools.DrawPoint) { if (GeometryDefined != null) { GeometryDefined(Map.ImageToWorld(new PointF(e.X, e.Y))); } } else if (_activeTool == Tools.DrawPolygon || _activeTool == Tools.DrawLine) { //pointArray = null; if (_pointArray == null) { _pointArray = new Point[2]; _pointArray[0] = e.Location; _pointArray[1] = e.Location; } else { Point[] temp = new Point[_pointArray.GetUpperBound(0) + 2]; for (int i = 0; i <= _pointArray.GetUpperBound(0); i++) temp[i] = _pointArray[i]; temp[temp.GetUpperBound(0)] = e.Location; _pointArray = temp; } } } if (_dragging) { _dragging = false; if (_activeTool == Tools.Query) Invalidate(_rectangle); if (_activeTool == Tools.ZoomWindow || _activeTool == Tools.Query) _rectangle = Rectangle.Empty; Refresh(); if (_activeTool != Tools.ZoomOut) { if (_image != null) { _image.Dispose(); _image = null; } _image = _dragImage; Invalidate(); } } else if (_activeTool == Tools.ZoomIn || _activeTool == Tools.ZoomOut || _activeTool == Tools.Pan) { Refresh(); } } }
/// <summary> /// Invokes the <see cref="E:System.Windows.Forms.Control.MouseUp"/>-event. /// </summary> /// <param name="e">A <see cref="T:System.Windows.Forms.MouseEventArgs"/> that contains the event arguments.</param> protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (_map != null) { if (MouseUp != null) MouseUp(_map.ImageToWorld(new Point(e.X, e.Y)), e); if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Middle) { if (_activeTool == Tools.ZoomOut) { double scale = 0.5; if (_dragging) { if (e.Y - _dragStartPoint.Y < 0) //Zoom out scale = (float) Math.Pow(1/(float) (_dragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - _dragStartPoint.Y)*0.1; } else { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } _map.Zoom /= scale; if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } else if (_activeTool == Tools.ZoomIn) { double scale = 2; if (_dragging) { if (e.Y - _dragStartPoint.Y < 0) //Zoom out scale = (float) Math.Pow(1/(float) (_dragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - _dragStartPoint.Y)*0.1; } else { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } _map.Zoom *= 1/scale; if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } else if ((_activeTool == Tools.Pan && !(_shiftButtonDragRectangleZoom && (Control.ModifierKeys & Keys.Shift) != Keys.None)) || (e.Button == System.Windows.Forms.MouseButtons.Left && _dragging && (_activeTool == Tools.DrawLine || _activeTool == Tools.DrawPolygon))) { if (_dragging) { if (MapCenterChanged != null) MapCenterChanged(_map.Center); } else { if (_panOnClick) { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } } } else if (_activeTool == Tools.QueryBox || _activeTool == Tools.QueryPoint /*|| _activeTool == Tools.QueryPolygon*/) { //OnMouseUpQuery(e); var mqs = MapQueryStarted; if (mqs != null) mqs(this, new EventArgs()); var layersToQuery = GetLayersToQuery(); if (layersToQuery.Count > 0) { var foundData = false; foreach (var layer in layersToQuery) { Envelope bounding; var isPoint = false; if (_dragging) { Coordinate lowerLeft, upperRight; GetBounds(_map.ImageToWorld(_dragStartPoint), _map.ImageToWorld(_dragEndPoint), out lowerLeft, out upperRight); bounding = new Envelope(lowerLeft, upperRight); } else { bounding = new Envelope(_map.ImageToWorld(new Point(e.X, e.Y))); bounding = bounding.Grow(_map.PixelSize*_queryGrowFactor); isPoint = true; } var ds = new Data.FeatureDataSet(); if (_activeTool == Tools.QueryBox) { layer.ExecuteIntersectionQuery(bounding, ds); } else { IGeometry geom; if (isPoint && QueryGrowFactor == 0) geom = _map.Factory.CreatePoint(_map.ImageToWorld(new Point(e.X, e.Y))); else geom = _map.Factory.ToGeometry(bounding); layer.ExecuteIntersectionQuery(geom, ds); } if (MapQueried != null) { if (ds.Tables.Count > 0) { //Fire the event for all the resulting tables foreach (var dt in ds.Tables) { if (dt.Rows.Count > 0) { MapQueried(dt); foundData = true; if (_mapQueryMode == MapQueryType.TopMostLayer) break; } } } else { if (_mapQueryMode == MapQueryType.LayerByIndex) MapQueried( new Data.FeatureDataTable(new System.Data.DataTable(layer.LayerName))); } } //If we found data and querymode is TopMostLayer we should abort now.. if (foundData && _mapQueryMode == MapQueryType.TopMostLayer) { break; } } } var mqd = MapQueryDone; if (mqd != null) mqd(this, new EventArgs()); } else if (_activeTool == Tools.ZoomWindow || (_shiftButtonDragRectangleZoom && (Control.ModifierKeys & Keys.Shift) != Keys.None)) { if (_rectangle.Width > 0 && _rectangle.Height > 0) { Coordinate lowerLeft; Coordinate upperRight; GetBounds(_map.ImageToWorld(_dragStartPoint), _map.ImageToWorld(_dragEndPoint), out lowerLeft, out upperRight); _dragEndPoint.X = 0; _dragEndPoint.Y = 0; _map.ZoomToBox(new Envelope(lowerLeft, upperRight)); if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } } else if (_activeTool == Tools.DrawPoint) { if (GeometryDefined != null) { GeometryDefined(_map.Factory.CreatePoint(Map.ImageToWorld(new PointF(e.X, e.Y)))); } } else if (_activeTool == Tools.DrawPolygon || _activeTool == Tools.DrawLine) { //pointArray = null; if (_pointArray == null) { _pointArray = new List<Coordinate>(2); _pointArray.Add(Map.ImageToWorld(e.Location)); _pointArray.Add(Map.ImageToWorld(e.Location)); } else { //var temp = new Coordinate[_pointArray.Count + 2]; _pointArray.Add(Map.ImageToWorld(e.Location)); } } } if (_dragging) { _dragging = false; if (_activeTool == Tools.QueryBox) Invalidate(_rectangle); if (_activeTool == Tools.ZoomWindow || _activeTool == Tools.QueryBox /*|| _activeTool == Tools.QueryPolygon*/) _rectangle = Rectangle.Empty; Refresh(); } else if (_activeTool == Tools.ZoomIn || _activeTool == Tools.ZoomOut || _activeTool == Tools.Pan) { Refresh(); } } }
protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (_map != null) { if (MouseUp != null) MouseUp(_map.ImageToWorld(new Point(e.X, e.Y)), e); if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Middle) { if (_activeTool == Tools.ZoomOut) { double scale = 0.5; if (_dragging) { if (e.Y - _dragStartPoint.Y < 0) //Zoom out scale = (float)Math.Pow(1 / (float)(_dragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - _dragStartPoint.Y) * 0.1; } else { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } _map.Zoom /= scale; if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } else if (_activeTool == Tools.ZoomIn) { double scale = 2; if (_dragging) { if (e.Y - _dragStartPoint.Y < 0) //Zoom out scale = (float)Math.Pow(1 / (float)(_dragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - _dragStartPoint.Y) * 0.1; } else { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } _map.Zoom *= 1 / scale; if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } else if ((_activeTool == Tools.Pan && !(_shiftButtonDragRectangleZoom && (Control.ModifierKeys & Keys.Shift) != Keys.None)) || (e.Button == System.Windows.Forms.MouseButtons.Left && _dragging && (_activeTool == Tools.DrawLine || _activeTool == Tools.DrawPolygon))) { if (_dragging) { if (MapCenterChanged != null) MapCenterChanged(_map.Center); } else { if (_panOnClick) { _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(_map.Center); } } } else if (_activeTool == Tools.Query || _activeTool == Tools.QueryGeometry) { if (_map.Layers.Count > _queryLayerIndex && _queryLayerIndex > -1) { var layer = _map.Layers[_queryLayerIndex] as ICanQueryLayer; if (layer != null) { BoundingBox bounding; bool isPoint = false; if (_dragging) { GeoPoint lowerLeft; GeoPoint upperRight; GetBounds(_map.ImageToWorld(_dragStartPoint), _map.ImageToWorld(_dragEndPoint), out lowerLeft, out upperRight); bounding = new BoundingBox(lowerLeft, upperRight); } else { bounding = _map.ImageToWorld(new Point(e.X, e.Y)).GetBoundingBox().Grow(_map.PixelSize* _queryGrowFactor); isPoint = true; } Data.FeatureDataSet ds = new Data.FeatureDataSet(); if (_activeTool == Tools.Query) layer.ExecuteIntersectionQuery(bounding, ds); else { Geometry geom; if (isPoint && QueryGrowFactor == 0) geom = _map.ImageToWorld(new Point(e.X, e.Y)); else geom = bounding.ToGeometry(); layer.ExecuteIntersectionQuery(geom, ds); } if (ds.Tables.Count > 0) if (MapQueried != null) MapQueried(ds.Tables[0]); else if (MapQueried != null) MapQueried(new Data.FeatureDataTable()); } } else MessageBox.Show("No active layer to query"); } else if (_activeTool == Tools.ZoomWindow || (_shiftButtonDragRectangleZoom && (Control.ModifierKeys & Keys.Shift) != Keys.None)) { if (_rectangle.Width > 0 && _rectangle.Height > 0) { GeoPoint lowerLeft; GeoPoint upperRight; GetBounds(_map.ImageToWorld(_dragStartPoint), _map.ImageToWorld(_dragEndPoint), out lowerLeft, out upperRight); _dragEndPoint.X = 0; _dragEndPoint.Y = 0; _map.ZoomToBox(new BoundingBox(lowerLeft, upperRight)); if (MapZoomChanged != null) MapZoomChanged(_map.Zoom); } } else if (_activeTool == Tools.DrawPoint) { if (GeometryDefined != null) { GeometryDefined(Map.ImageToWorld(new PointF(e.X, e.Y))); } } else if (_activeTool == Tools.DrawPolygon || _activeTool == Tools.DrawLine) { //pointArray = null; if (_pointArray == null) { _pointArray = new SharpMap.Geometries.Point[2]; _pointArray[0] = Map.ImageToWorld(e.Location); _pointArray[1] = Map.ImageToWorld(e.Location); } else { SharpMap.Geometries.Point[] temp = new SharpMap.Geometries.Point[_pointArray.GetUpperBound(0) + 2]; for (int i = 0; i <= _pointArray.GetUpperBound(0); i++) temp[i] = _pointArray[i]; temp[temp.GetUpperBound(0)] = Map.ImageToWorld(e.Location); _pointArray = temp; } } } if (_dragging) { _dragging = false; if (_activeTool == Tools.Query) Invalidate(_rectangle); if (_activeTool == Tools.ZoomWindow || _activeTool == Tools.Query) _rectangle = Rectangle.Empty; Refresh(); } else if (_activeTool == Tools.ZoomIn || _activeTool == Tools.ZoomOut || _activeTool == Tools.Pan) { Refresh(); } } }
protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (m_Map != null) { if (MouseUp != null) { MouseUp(m_Map.ImageToWorld(new Point(e.X, e.Y)), e); } if (e.Button == MouseButtons.Left) { if (m_ActiveTool == Tools.ZoomOut) { double scale = 0.5; if (m_Dragging) { if (e.Y - m_DragStartPoint.Y < 0) //Zoom out { scale = (float)Math.Pow(1 / (float)(m_DragStartPoint.Y - e.Y), 0.5); } else //Zoom in { scale = 1 + (e.Y - m_DragStartPoint.Y) * 0.1; } } else { m_Map.Center = m_Map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) { MapCenterChanged(m_Map.Center); } } m_Map.Zoom /= scale; if (MapZoomChanged != null) { MapZoomChanged(m_Map.Zoom); } } else if (m_ActiveTool == Tools.ZoomIn) { double scale = 2; if (m_Dragging) { if (e.Y - m_DragStartPoint.Y < 0) //Zoom out { scale = (float)Math.Pow(1 / (float)(m_DragStartPoint.Y - e.Y), 0.5); } else //Zoom in { scale = 1 + (e.Y - m_DragStartPoint.Y) * 0.1; } } else { m_Map.Center = m_Map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) { MapCenterChanged(m_Map.Center); } } m_Map.Zoom *= 1 / scale; if (MapZoomChanged != null) { MapZoomChanged(m_Map.Zoom); } } else if (m_ActiveTool == Tools.Pan) { if (m_Dragging) { Point point = new Point(ClientSize.Width / 2 + (m_DragStartPoint.X - e.Location.X), ClientSize.Height / 2 + (m_DragStartPoint.Y - e.Location.Y)); m_Map.Center = m_Map.ImageToWorld(point); if (MapCenterChanged != null) { MapCenterChanged(m_Map.Center); } } else { m_Map.Center = m_Map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) { MapCenterChanged(m_Map.Center); } } } else if (m_ActiveTool == Tools.Query) { if (m_Map.Layers.Count > m_QueryLayerIndex && m_QueryLayerIndex > -1) { /* * if (m_Map.Layers[m_QueryLayerIndex].GetType() == typeof(Layers.VectorLayer)) * { * * Layers.VectorLayer layer = m_Map.Layers[m_QueryLayerIndex] as Layers.VectorLayer; * Geometries.BoundingBox bounding; * * if (m_Dragging) * { * Geometries.Point lowerLeft; * Geometries.Point upperRight; * GetBounds(m_Map.ImageToWorld(m_DragStartPoint), m_Map.ImageToWorld(m_DragEndPoint), out lowerLeft, out upperRight); * * bounding = new Geometries.BoundingBox(lowerLeft, upperRight); * } * else * bounding = m_Map.ImageToWorld(new Point(e.X, e.Y)).GetBoundingBox().Grow(m_Map.PixelSize * 5); * * Data.FeatureDataSet ds = new Data.FeatureDataSet(); * layer.DataSource.Open(); * layer.DataSource.ExecuteIntersectionQuery(bounding, ds); * layer.DataSource.Close(); * * if (MapQueried != null) * MapQueried((ds.Tables.Count > 0 ? ds.Tables[0] : new Data.FeatureDataTable())); * } */ if (m_Map.Layers[m_QueryLayerIndex] is Layers.ICanQueryLayer) { Layers.ICanQueryLayer layer = m_Map.Layers[m_QueryLayerIndex] as Layers.ICanQueryLayer; Geometries.BoundingBox bounding; if (m_Dragging) { Geometries.Point lowerLeft; Geometries.Point upperRight; GetBounds(m_Map.ImageToWorld(m_DragStartPoint), m_Map.ImageToWorld(m_DragEndPoint), out lowerLeft, out upperRight); bounding = new Geometries.BoundingBox(lowerLeft, upperRight); } else { bounding = m_Map.ImageToWorld(new Point(e.X, e.Y)).GetBoundingBox().Grow(m_Map.PixelSize * 5); } Data.FeatureDataSet ds = new Data.FeatureDataSet(); layer.ExecuteIntersectionQuery(bounding, ds); if (ds.Tables.Count > 0) { if (MapQueried != null) { MapQueried(ds.Tables[0]); } else if (MapQueried != null) { MapQueried(new Data.FeatureDataTable()); } } } } else { MessageBox.Show("No active layer to query"); } } else if (m_ActiveTool == Tools.ZoomWindow) { if (m_Rectangle.Width > 0 && m_Rectangle.Height > 0) { Geometries.Point lowerLeft; Geometries.Point upperRight; GetBounds(m_Map.ImageToWorld(m_DragStartPoint), m_Map.ImageToWorld(m_DragEndPoint), out lowerLeft, out upperRight); m_DragEndPoint.X = 0; m_DragEndPoint.Y = 0; m_Map.ZoomToBox(new Geometries.BoundingBox(lowerLeft, upperRight)); } } else if (m_ActiveTool == Tools.DrawPoint) { if (GeometryDefined != null) { GeometryDefined(Map.ImageToWorld(new PointF(e.X, e.Y))); } } else if (m_ActiveTool == Tools.DrawPolygon || m_ActiveTool == Tools.DrawLine) { //pointArray = null; if (pointArray == null) { pointArray = new Point[2]; pointArray[0] = e.Location; pointArray[1] = e.Location; } else { Point[] temp = new Point[pointArray.GetUpperBound(0) + 2]; for (int i = 0; i <= pointArray.GetUpperBound(0); i++) { temp[i] = pointArray[i]; } temp[temp.GetUpperBound(0)] = e.Location; pointArray = temp; } } } if (m_Dragging) { m_Dragging = false; if (m_ActiveTool == Tools.Query) { Invalidate(m_Rectangle); } if (m_ActiveTool == Tools.ZoomWindow || m_ActiveTool == Tools.Query) { m_Rectangle = Rectangle.Empty; } Refresh(); if (m_ActiveTool != Tools.ZoomOut) { m_Image.Dispose(); m_Image = null; m_Image = m_DragImage; this.Invalidate(); } } else if (m_ActiveTool == Tools.ZoomIn || m_ActiveTool == Tools.ZoomOut || m_ActiveTool == Tools.Pan) { Refresh(); } } }
protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (m_Map != null) { if (MouseUp != null) MouseUp(m_Map.ImageToWorld(new Point(e.X, e.Y)), e); if (e.Button == MouseButtons.Left) { if (m_ActiveTool == Tools.ZoomOut) { double scale = 0.5; if (m_Dragging) { if (e.Y - m_DragStartPoint.Y < 0) //Zoom out scale = (float)Math.Pow(1 / (float)(m_DragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - m_DragStartPoint.Y) * 0.1; } else { m_Map.Center = m_Map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(m_Map.Center); } m_Map.Zoom /= scale; if (MapZoomChanged != null) MapZoomChanged(m_Map.Zoom); } else if (m_ActiveTool == Tools.ZoomIn) { double scale = 2; if (m_Dragging) { if (e.Y - m_DragStartPoint.Y < 0) //Zoom out scale = (float)Math.Pow(1 / (float)(m_DragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - m_DragStartPoint.Y) * 0.1; } else { m_Map.Center = m_Map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(m_Map.Center); } m_Map.Zoom *= 1 / scale; if (MapZoomChanged != null) MapZoomChanged(m_Map.Zoom); } else if (m_ActiveTool == Tools.Pan) { if (m_Dragging) { Point point = new Point(ClientSize.Width / 2 + (m_DragStartPoint.X - e.Location.X), ClientSize.Height / 2 + (m_DragStartPoint.Y - e.Location.Y)); m_Map.Center = m_Map.ImageToWorld(point); if (MapCenterChanged != null) MapCenterChanged(m_Map.Center); } else { m_Map.Center = m_Map.ImageToWorld(new Point(e.X, e.Y)); if (MapCenterChanged != null) MapCenterChanged(m_Map.Center); } } else if (m_ActiveTool == Tools.Query) { if (m_Map.Layers.Count > m_QueryLayerIndex && m_QueryLayerIndex > -1) { /* if (m_Map.Layers[m_QueryLayerIndex].GetType() == typeof(Layers.VectorLayer)) { Layers.VectorLayer layer = m_Map.Layers[m_QueryLayerIndex] as Layers.VectorLayer; Geometries.BoundingBox bounding; if (m_Dragging) { Geometries.Point lowerLeft; Geometries.Point upperRight; GetBounds(m_Map.ImageToWorld(m_DragStartPoint), m_Map.ImageToWorld(m_DragEndPoint), out lowerLeft, out upperRight); bounding = new Geometries.BoundingBox(lowerLeft, upperRight); } else bounding = m_Map.ImageToWorld(new Point(e.X, e.Y)).GetBoundingBox().Grow(m_Map.PixelSize * 5); Data.FeatureDataSet ds = new Data.FeatureDataSet(); layer.DataSource.Open(); layer.DataSource.ExecuteIntersectionQuery(bounding, ds); layer.DataSource.Close(); if (MapQueried != null) MapQueried((ds.Tables.Count > 0 ? ds.Tables[0] : new Data.FeatureDataTable())); } */ if (m_Map.Layers[m_QueryLayerIndex] is Layers.ICanQueryLayer) { Layers.ICanQueryLayer layer = m_Map.Layers[m_QueryLayerIndex] as Layers.ICanQueryLayer; Geometries.BoundingBox bounding; if (m_Dragging) { Geometries.Point lowerLeft; Geometries.Point upperRight; GetBounds(m_Map.ImageToWorld(m_DragStartPoint), m_Map.ImageToWorld(m_DragEndPoint), out lowerLeft, out upperRight); bounding = new Geometries.BoundingBox(lowerLeft, upperRight); } else bounding = m_Map.ImageToWorld(new Point(e.X, e.Y)).GetBoundingBox().Grow(m_Map.PixelSize * 5); Data.FeatureDataSet ds = new Data.FeatureDataSet(); layer.ExecuteIntersectionQuery(bounding, ds); if (ds.Tables.Count > 0) if (MapQueried != null) MapQueried(ds.Tables[0]); else if (MapQueried != null) MapQueried(new Data.FeatureDataTable()); } } else MessageBox.Show("No active layer to query"); } else if (m_ActiveTool == Tools.ZoomWindow) { if (m_Rectangle.Width > 0 && m_Rectangle.Height > 0) { Geometries.Point lowerLeft; Geometries.Point upperRight; GetBounds(m_Map.ImageToWorld(m_DragStartPoint), m_Map.ImageToWorld(m_DragEndPoint), out lowerLeft, out upperRight); m_Map.ZoomToBox(new Geometries.BoundingBox(lowerLeft, upperRight)); } } } if (m_DragImage != null) { m_DragImage.Dispose(); m_DragImage = null; } if (m_Dragging) { m_Dragging = false; if (m_ActiveTool == Tools.Query) Invalidate(m_Rectangle); if (m_ActiveTool == Tools.ZoomWindow || m_ActiveTool == Tools.Query) m_Rectangle = Rectangle.Empty; Refresh(); } else if (m_ActiveTool == Tools.ZoomIn || m_ActiveTool == Tools.ZoomOut || m_ActiveTool== Tools.Pan) Refresh(); } }
/// <summary> /// Invokes the <see cref="E:System.Windows.Forms.Control.MouseUp"/>-event. /// </summary> /// <param name="e">A <see cref="T:System.Windows.Forms.MouseEventArgs"/> that contains the event arguments.</param> protected override void OnMouseUp(MouseEventArgs e) { // call base function base.OnMouseUp(e); // Do we have a map? If not bail out if (_map == null) return; // Position in world coordinates var p = _map.ImageToWorld(new Point(e.X, e.Y)); // Raise event if (MouseUp != null) MouseUp(p, e); // Do we have a custom tool if (UseCurrentTool) { if (_currentTool.DoMouseUp(p, e)) return; } // If no tool is selected, bail out if (_activeTool == Tools.None) return; bool needToRefresh = false; if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Middle) { if (_activeTool == Tools.ZoomOut) { double scale = 0.5; if (_dragging) { if (e.Y - _dragStartPoint.Y < 0) //Zoom out scale = (float) Math.Pow(1/(float) (_dragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - _dragStartPoint.Y)*0.1; } else { var oldCenter = _map.Center; _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (!_map.Center.Equals2D(oldCenter, PrecisionTolerance)) { needToRefresh = true; OnMapCenterChanged(_map.Center); } } var oldZoom = _map.Zoom; _map.Zoom /= scale; if (Math.Abs(oldZoom - _map.Zoom) > PrecisionTolerance) { needToRefresh = true; OnMapZoomChanged(_map.Zoom); } } else if (_activeTool == Tools.ZoomIn) { double scale = 2; if (_dragging) { if (e.Y - _dragStartPoint.Y < 0) //Zoom out scale = (float) Math.Pow(1/(float) (_dragStartPoint.Y - e.Y), 0.5); else //Zoom in scale = 1 + (e.Y - _dragStartPoint.Y)*0.1; } else { var oldCenter = _map.Center; _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (!_map.Center.Equals2D(oldCenter, PrecisionTolerance)) { needToRefresh = true; OnMapCenterChanged(_map.Center); } } var oldZoom = _map.Zoom; _map.Zoom =oldZoom * 1/scale; if (Math.Abs(_map.Zoom - oldZoom) > PrecisionTolerance) { needToRefresh = true; OnMapZoomChanged(_map.Zoom); } } else if ((_activeTool == Tools.Pan && !(_shiftButtonDragRectangleZoom && (ModifierKeys & Keys.Shift) != Keys.None)) || (e.Button == MouseButtons.Left && _dragging && (_activeTool == Tools.DrawLine || _activeTool == Tools.DrawPolygon))) { if (_dragging) { if (_dragStartCoord == null || !_dragStartCoord.Equals2D(_map.Center, PrecisionTolerance)) { needToRefresh = true; OnMapCenterChanged(_map.Center); } } else { if (_panOnClick) { var oldValue = _map.Center; _map.Center = _map.ImageToWorld(new Point(e.X, e.Y)); if (!_map.Center.Equals2D(oldValue, PrecisionTolerance)) { needToRefresh = true; OnMapCenterChanged(_map.Center); } } } } else if (_activeTool == Tools.QueryBox || _activeTool == Tools.QueryPoint /*|| _activeTool == Tools.QueryPolygon*/) { //OnMouseUpQuery(e); var mqs = MapQueryStarted; if (mqs != null) mqs(this, new EventArgs()); var layersToQuery = GetLayersToQuery(); if (layersToQuery.Count > 0) { var foundData = false; foreach (var layer in layersToQuery) { Envelope bounding; var isPoint = false; if (_dragging) { Coordinate lowerLeft, upperRight; GetBounds(_map.ImageToWorld(_dragStartPoint), _map.ImageToWorld(_dragEndPoint), out lowerLeft, out upperRight); bounding = new Envelope(lowerLeft, upperRight); } else { bounding = new Envelope(_map.ImageToWorld(new Point(e.X, e.Y))); bounding = bounding.Grow(_map.PixelSize*_queryGrowFactor); isPoint = true; } var ds = new Data.FeatureDataSet(); if (_activeTool == Tools.QueryBox) { layer.ExecuteIntersectionQuery(bounding, ds); } else { IGeometry geom; if (isPoint && QueryGrowFactor == 0) geom = _map.Factory.CreatePoint(_map.ImageToWorld(new Point(e.X, e.Y))); else geom = _map.Factory.ToGeometry(bounding); layer.ExecuteIntersectionQuery(geom, ds); } if (MapQueried != null) { if (ds.Tables.Count > 0) { //Fire the event for all the resulting tables foreach (var dt in ds.Tables) { if (dt.Rows.Count > 0) { MapQueried(dt); foundData = true; if (_mapQueryMode == MapQueryType.TopMostLayer) break; } } } else { if (_mapQueryMode == MapQueryType.LayerByIndex) MapQueried( new Data.FeatureDataTable(new System.Data.DataTable(layer.LayerName))); } } //If we found data and querymode is TopMostLayer we should abort now.. if (foundData && _mapQueryMode == MapQueryType.TopMostLayer) { break; } } } var mqd = MapQueryDone; if (mqd != null) mqd(this, new EventArgs()); } else if (_activeTool == Tools.ZoomWindow || (_shiftButtonDragRectangleZoom && (ModifierKeys & Keys.Shift) != Keys.None)) { if (_rectangle.Width > 0 && _rectangle.Height > 0) { Coordinate lowerLeft; Coordinate upperRight; GetBounds(_map.ImageToWorld(_dragStartPoint), _map.ImageToWorld(_dragEndPoint), out lowerLeft, out upperRight); _dragEndPoint.X = 0; _dragEndPoint.Y = 0; var oldCenter = _map.Center; var oldZoom = _map.Zoom; _map.ZoomToBox(new Envelope(lowerLeft, upperRight)); if (!_map.Center.Equals2D(oldCenter, PrecisionTolerance) || Math.Abs(oldZoom - _map.Zoom) > PrecisionTolerance) { needToRefresh = true; OnMapZoomChanged(_map.Zoom); } else { // we must to cancel the selected area anyway Invalidate(); } } } else if (_activeTool == Tools.DrawPoint) { if (GeometryDefined != null) { GeometryDefined(_map.Factory.CreatePoint(Map.ImageToWorld(new PointF(e.X, e.Y)))); } } else if (_activeTool == Tools.DrawPolygon || _activeTool == Tools.DrawLine) { //pointArray = null; if (_pointArray == null) { _pointArray = new List<Coordinate>(2); _pointArray.Add(Map.ImageToWorld(e.Location)); _pointArray.Add(Map.ImageToWorld(e.Location)); } else { //var temp = new Coordinate[_pointArray.Count + 2]; _pointArray.Add(Map.ImageToWorld(e.Location)); } } } if (_dragging) { _dragging = false; if (_activeTool == Tools.QueryBox) Invalidate(_rectangle); if (_activeTool == Tools.ZoomWindow || _activeTool == Tools.QueryBox /*|| _activeTool == Tools.QueryPolygon*/) _rectangle = Rectangle.Empty; if (_dragStartCoord == null || !_dragStartCoord.Equals2D(_map.Center, PrecisionTolerance)) Refresh(); } else if (needToRefresh && (_activeTool == Tools.ZoomIn || _activeTool == Tools.ZoomOut || _activeTool == Tools.Pan)) { Refresh(); } }