/// <summary> /// 按单元格数量分割区域 /// </summary> /// <param name="RowNum"></param> /// <param name="ColNum"></param> private void PartitionArea(int RowNum, int ColNum) { Geometry.Grid grid; double w = disasterArea.Width / ColNum; double h = disasterArea.Height / RowNum; if (_InitGrids == null) { _InitGrids = new List <Geometry.Grid>(); } else { _InitGrids.Clear(); } for (int i = 0; i < ColNum; i++) { for (int j = 0; j < RowNum; j++) { grid = new Geometry.Grid(); grid.Row = j; grid.Col = i; grid.XMin = disasterArea.XMin + w * (double)i; grid.YMin = disasterArea.YMin + h * (double)j; grid.XMax = grid.XMin + w; grid.YMax = grid.YMin + h; _InitGrids.Add(grid); } } }
private static void SetGridMerged(Geometry.Grid grid) { foreach (Geometry.Grid g in DataGrid) { if (g.Equal(grid)) { g.isMerged = true; } } }
/// <summary> /// 在数据单元格中是否存在 /// </summary> /// <param name="grid"></param> /// <returns></returns> private static bool ExistsGridInDataGrid(ref Geometry.Grid grid) { foreach (Geometry.Grid g in DataGrid) { if (g.Equal(grid)) { grid = g; return(true); } } return(false); }
/// <summary> /// 合并单元格近邻 /// </summary> /// <param name="grid"></param> public static void MergeNN(Geometry.Grid grid, ref IPolygon area) { System.Diagnostics.Debug.Print("Merge: row=" + grid.Row.ToString() + ",col=" + grid.Col.ToString()); if (!grid.isMerged) { IPolygon polygon = grid.BuildPolygon(); area = MergePolygon(area, polygon); grid.isMerged = true; //SetGridMerged(grid); } //计算近邻 Geometry.Grid GridUp, GridLeft, GridRight, GridDown; GridUp = grid.GetNeighbor(Geometry.GridNeighborTypes.UP); GridLeft = grid.GetNeighbor(Geometry.GridNeighborTypes.LEFT); GridRight = grid.GetNeighbor(Geometry.GridNeighborTypes.RIGHT); GridDown = grid.GetNeighbor(Geometry.GridNeighborTypes.DOWN); if (ExistsGridInDataGrid(ref GridUp)) { if (!GridUp.isMerged) { MergeNN(GridUp, ref area); } } if (GridLeft != null) { if (ExistsGridInDataGrid(ref GridLeft)) { if (!GridLeft.isMerged) { MergeNN(GridLeft, ref area); } } } if (ExistsGridInDataGrid(ref GridRight)) { if (!GridRight.isMerged) { MergeNN(GridRight, ref area); } } if (GridDown != null) { if (ExistsGridInDataGrid(ref GridDown)) { if (!GridDown.isMerged) { MergeNN(GridDown, ref area); } } } return; }
/// <summary> /// 是否已存在于数据单元格集中 /// </summary> /// <param name="grid"></param> /// <returns></returns> private bool isContainedInDataGrids(Geometry.Grid grid) { if (_DataGrids == null) { return(false); } else { foreach (Geometry.Grid g in _DataGrids) { if (grid.Equal(g)) { return(true); } } return(false); } }
/// <summary> /// 按单元大小分割区域 /// </summary> private void PartitionArea(double width, double height) { Geometry.Grid grid; int cn = (int)Math.Ceiling(disasterArea.Width / width); int rn = (int)Math.Ceiling(disasterArea.Height / height); if (_InitGrids == null) { _InitGrids = new List <Geometry.Grid>(); } else { _InitGrids.Clear(); } for (int i = 0; i < cn; i++) { for (int j = 0; j < rn; j++) { grid = new Geometry.Grid(); grid.Row = j; grid.Col = i; grid.XMin = disasterArea.XMin + width * (double)i; grid.YMin = disasterArea.YMin + height * (double)j; //当单元为最右、最上面的时候,则为边界值 if (i == cn - 1) { grid.XMax = disasterArea.XMax; } else { grid.XMax = grid.XMin + width; } if (j == rn) { grid.YMax = disasterArea.YMax; } else { grid.YMax = grid.YMin + height; } _InitGrids.Add(grid); } } }