public static S2CellUnion FindCellIds(S2LatLngRect latLngRect) { var queue = new ConcurrentQueue <S2CellId>(); var cellIds = new List <S2CellId>(); for (var c = S2CellId.Begin(0); !c.Equals(S2CellId.End(0)); c = c.Next) { if (ContainsGeodataToFind(c, latLngRect)) { queue.Enqueue(c); } } ProcessQueue(queue, cellIds, latLngRect); Debug.Assert(queue.Count == 0); queue = null; if (cellIds.Count > 0) { var cellUnion = new S2CellUnion(); cellUnion.InitFromCellIds(cellIds); // This normalize the cells. // cellUnion.initRawCellIds(cellIds); // This does not normalize the cells. cellIds = null; return(cellUnion); } return(null); }
public void checkCovering( S2RegionCoverer coverer, IS2Region region, List <S2CellId> covering, bool interior) { // Keep track of how many cells have the same coverer.min_level() ancestor. IDictionary <S2CellId, int> minLevelCells = new Dictionary <S2CellId, int>(); for (var i = 0; i < covering.Count; ++i) { var level = covering[i].Level; assertTrue(level >= coverer.MinLevel); assertTrue(level <= coverer.MaxLevel); assertEquals((level - coverer.MinLevel) % coverer.LevelMod, 0); var key = covering[i].ParentForLevel(coverer.MinLevel); if (!minLevelCells.ContainsKey(key)) { minLevelCells.Add(key, 1); } else { minLevelCells[key] = minLevelCells[key] + 1; } } if (covering.Count > coverer.MaxCells) { // If the covering has more than the requested number of cells, then check // that the cell count cannot be reduced by using the parent of some cell. foreach (var i in minLevelCells.Values) { assertEquals(i, 1); } } if (interior) { for (var i = 0; i < covering.Count; ++i) { assertTrue(region.Contains(new S2Cell(covering[i]))); } } else { var cellUnion = new S2CellUnion(); cellUnion.InitFromCellIds(covering); checkCovering(region, cellUnion, true, new S2CellId()); } }
public void checkCovering( S2RegionCoverer coverer, IS2Region region, List<S2CellId> covering, bool interior) { // Keep track of how many cells have the same coverer.min_level() ancestor. IDictionary<S2CellId, int> minLevelCells = new Dictionary<S2CellId, int>(); for (var i = 0; i < covering.Count; ++i) { var level = covering[i].Level; assertTrue(level >= coverer.MinLevel); assertTrue(level <= coverer.MaxLevel); assertEquals((level - coverer.MinLevel)%coverer.LevelMod, 0); var key = covering[i].ParentForLevel(coverer.MinLevel); if (!minLevelCells.ContainsKey(key)) { minLevelCells.Add(key, 1); } else { minLevelCells[key] = minLevelCells[key] + 1; } } if (covering.Count > coverer.MaxCells) { // If the covering has more than the requested number of cells, then check // that the cell count cannot be reduced by using the parent of some cell. foreach (var i in minLevelCells.Values) { assertEquals(i, 1); } } if (interior) { for (var i = 0; i < covering.Count; ++i) { assertTrue(region.Contains(new S2Cell(covering[i]))); } } else { var cellUnion = new S2CellUnion(); cellUnion.InitFromCellIds(covering); checkCovering(region, cellUnion, true, new S2CellId()); } }
public void testRandomCaps() { Console.WriteLine("TestRandomCaps"); var kMaxLevel = S2CellId.MaxLevel; var coverer = new S2RegionCoverer(); for (var i = 0; i < 1000; ++i) { do { coverer.MinLevel = random(kMaxLevel + 1); coverer.MaxLevel = random(kMaxLevel + 1); } while (coverer.MinLevel > coverer.MaxLevel); coverer.MaxCells = skewed(10); coverer.LevelMod = 1 + random(3); var maxArea = Math.Min( 4 * S2.Pi, (3 * coverer.MaxCells + 1) * S2Cell.AverageArea(coverer.MinLevel)); var cap = getRandomCap(0.1 * S2Cell.AverageArea(kMaxLevel), maxArea); var covering = new List <S2CellId>(); var interior = new List <S2CellId>(); coverer.GetCovering(cap, covering); checkCovering(coverer, cap, covering, false); coverer.GetInteriorCovering(cap, interior); checkCovering(coverer, cap, interior, true); // Check that GetCovering is deterministic. var covering2 = new List <S2CellId>(); coverer.GetCovering(cap, covering2); assertTrue(covering.SequenceEqual(covering2)); // Also check S2CellUnion.denormalize(). The denormalized covering // may still be different and smaller than "covering" because // S2RegionCoverer does not guarantee that it will not output all four // children of the same parent. var cells = new S2CellUnion(); cells.InitFromCellIds(covering); var denormalized = new List <S2CellId>(); cells.Denormalize(coverer.MinLevel, coverer.LevelMod, denormalized); checkCovering(coverer, cap, denormalized, false); } }
public void testRandomCaps() { Console.WriteLine("TestRandomCaps"); var kMaxLevel = S2CellId.MaxLevel; var coverer = new S2RegionCoverer(); for (var i = 0; i < 1000; ++i) { do { coverer.MinLevel = random(kMaxLevel + 1); coverer.MaxLevel = random(kMaxLevel + 1); } while (coverer.MinLevel > coverer.MaxLevel); coverer.MaxCells = skewed(10); coverer.LevelMod = 1 + random(3); var maxArea = Math.Min( 4*S2.Pi, (3*coverer.MaxCells + 1)*S2Cell.AverageArea(coverer.MinLevel)); var cap = getRandomCap(0.1*S2Cell.AverageArea(kMaxLevel), maxArea); var covering = new List<S2CellId>(); var interior = new List<S2CellId>(); coverer.GetCovering(cap, covering); checkCovering(coverer, cap, covering, false); coverer.GetInteriorCovering(cap, interior); checkCovering(coverer, cap, interior, true); // Check that GetCovering is deterministic. var covering2 = new List<S2CellId>(); coverer.GetCovering(cap, covering2); assertTrue(covering.SequenceEqual(covering2)); // Also check S2CellUnion.denormalize(). The denormalized covering // may still be different and smaller than "covering" because // S2RegionCoverer does not guarantee that it will not output all four // children of the same parent. var cells = new S2CellUnion(); cells.InitFromCellIds(covering); var denormalized = new List<S2CellId>(); cells.Denormalize(coverer.MinLevel, coverer.LevelMod, denormalized); checkCovering(coverer, cap, denormalized, false); } }