Esempio n. 1
0
        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();
                }


            }
        }
Esempio n. 2
0
        /// <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();
                }
            }
        }
Esempio n. 3
0
        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();
                }
            }
        }
Esempio n. 4
0
        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();
                }
            }
        }
Esempio n. 5
0
        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();
            }
        }
Esempio n. 6
0
        /// <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();
            }
        }