Beispiel #1
0
        /// <summary>
        /// 根据在屏幕中划定的范围搜索shapes
        /// </summary>
        /// <param name="screenLeft">相对屏幕的左坐标点</param>
        /// <param name="screenRight">相对屏幕的右坐标点</param>
        /// <param name="screenTop">相对屏幕的顶部坐标点</param>
        /// <param name="screenBottom">相对屏幕的底部坐标点</param>
        /// <param name="ctrlDown"></param>
        /// <returns></returns>
        internal MapWinGIS.Interfaces.SelectInfo SelectShapesByRectangle(int screenLeft, int screenRight, int screenTop, int screenBottom, bool ctrlDown = false)
        {
            if (Program.frmMain.Legend.SelectedLayer == -1)
            {
                return(null);
            }

            Interfaces.eLayerType type = Program.frmMain.Layers[Program.frmMain.Layers.CurrentLayer].LayerType;
            if (type == Interfaces.eLayerType.Grid || type == Interfaces.eLayerType.Image || type == Interfaces.eLayerType.Invalid)
            {
                return(null);
            }

            MapWinGIS.Shapefile sf = (MapWinGIS.Shapefile)(Program.frmMain.MapMain.get_GetObject(Program.frmMain.Layers.CurrentLayer));

            double geoL = 0, geoR = 0, geoT = 0, geoB = 0;

            Program.frmMain.MapMain.PixelToProj(screenLeft, screenTop, ref geoL, ref geoT);
            Program.frmMain.MapMain.PixelToProj(screenRight, screenBottom, ref geoR, ref geoB);

            MapWinGIS.Extents bounds = new MapWinGIS.Extents();
            bounds.SetBounds(geoL, geoB, 0, geoR, geoT, 0);

            if (ctrlDown)
            {
                m_SelectionOperation = Interfaces.SelectionOperation.SelectAdd;
            }
            else
            {
                m_SelectionOperation = Interfaces.SelectionOperation.SelectNew;
            }

            return(PerformSelection(sf, bounds, 0.0D));
        }
Beispiel #2
0
        /// <summary>
        /// 根据给定的点搜索shape
        /// </summary>
        /// <param name="screenX">屏幕x坐标</param>
        /// <param name="screenY">屏幕y坐标</param>
        /// <param name="ctrlDown">Ctrl按钮是否按下</param>
        /// <returns></returns>
        internal MapWinGIS.Interfaces.SelectInfo SelectShapesByPoint(int screenX, int screenY, bool ctrlDown = false)
        {
            if (Program.frmMain.Legend.SelectedLayer == -1)
            {
                return(null);
            }

            double x = 0, y = 0;

            PixelToProj(screenX, screenY, ref x, ref y);

            MapWinGIS.Extents bounds   = new MapWinGIS.Extents();
            bounds.SetBounds(x, y, 0, x, y, 0);

            Interfaces.eLayerType type = Program.frmMain.m_Layers[Program.frmMain.Layers.CurrentLayer].LayerType;
            if (type == Interfaces.eLayerType.Grid || type == Interfaces.eLayerType.Image || type == Interfaces.eLayerType.Invalid)
            {
                return(null);
            }

            object obj = Program.frmMain.MapMain.get_GetObject(Program.frmMain.Layers.CurrentLayer);

            MapWinGIS.Shapefile sf     = (MapWinGIS.Shapefile)obj;

            //计算容差
            double tolerance = m_SelectionTolerance;

            if (tolerance == 0) //容差
            {
                if (((sf.ShapefileType == ShpfileType.SHP_POLYGON) || (sf.ShapefileType == ShpfileType.SHP_POLYGONM)) || (sf.ShapefileType == ShpfileType.SHP_POLYGONZ))
                {
                    tolerance = 0.0D;
                }
                else if (((sf.ShapefileType == ShpfileType.SHP_POINT) || (sf.ShapefileType == ShpfileType.SHP_POINTM)) || (sf.ShapefileType == ShpfileType.SHP_POINTZ))
                {
                    double x1 = 0, y1 = 0;
                    int    size = (int)(sf.DefaultDrawingOptions.PointSize / 2);

                    PixelToProj(screenX + size, screenY + size, ref x1, ref y1);
                    tolerance = System.Math.Sqrt(Math.Pow((x - x1), 2) + Math.Pow((y - y1), 2));
                }
                else
                {
                    double x1 = 0, y1 = 0;
                    PixelToProj(screenX + 5, screenY + 5, ref x1, ref y1);

                    tolerance = System.Convert.ToDouble(Math.Sqrt(Math.Pow((x - x1), 2) + Math.Pow((y - y1), 2)));
                }
            }

            if (ctrlDown) //选择模式
            {
                m_SelectionOperation = Interfaces.SelectionOperation.SelectAdd;
            }
            else
            {
                m_SelectionOperation = Interfaces.SelectionOperation.SelectNew;
            }

            //处理选择的shape
            return(PerformSelection(sf, bounds, tolerance));
        }