/// <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)); }
/// <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)); }