public ZoneInfoSnapshot( ZonePoint point, IAreaZoneConsumption areaZoneConsumption, Func <IEnumerable <QueryResult <IZoneInfo, RelativeZoneInfoQuery> > > getNorthEastSouthWestFunc, TrafficDensity trafficDensity) { Point = point; AreaZoneConsumption = areaZoneConsumption; _getNorthEastSouthWestFunc = getNorthEastSouthWestFunc; TrafficDensity = trafficDensity; }
public RoadIntersections( TrafficDensity trafficDensity, DirectionalCellBitmap powerNsRoadEw, DirectionalCellBitmap railNsRoadEw, DirectionalCellBitmap waterNsRoadEw) { TrafficDensity = trafficDensity; _powerNsRoadEw = powerNsRoadEw; _railNsRoadEw = railNsRoadEw; _waterNsRoadEw = waterNsRoadEw; }
public static RoadIntersections CreateFor(string suffix, TrafficDensity trafficDensity) { return(new EmbeddedBitmapExtractor() .GetBitmapsFromNamespace("Mirage.Urbanization.Tilesets.IntersectingZones.Road" + suffix) .ToArray() .Pipe(bitmaps => { return new RoadIntersections( trafficDensity: trafficDensity, powerNsRoadEw: new DirectionalCellBitmap( cellBitmapSet: new AnimatedCellBitmapSetLayers( new AnimatedCellBitmapSet( FramerateDelay.TrafficFramerate, bitmaps .Where(x => string.Equals(x.FileName, "powernsroadew", StringComparison.CurrentCultureIgnoreCase)) .Select(x => new CellBitmap(x.Bitmap)) .ToArray() ), null ) ), railNsRoadEw: new DirectionalCellBitmap( cellBitmapSet: new AnimatedCellBitmapSetLayers( new AnimatedCellBitmapSet( FramerateDelay.TrafficFramerate, bitmaps .Where(x => string.Equals(x.FileName, "railnsroadew", StringComparison.CurrentCultureIgnoreCase)) .Select(x => new CellBitmap(x.Bitmap)) .ToArray() ), null ) ), waterNsRoadEw: new DirectionalCellBitmap( cellBitmapSet: new AnimatedCellBitmapSetLayers( new AnimatedCellBitmapSet( FramerateDelay.TrafficFramerate, new EmbeddedBitmapExtractor() .GetBitmapsFromNamespace("Mirage.Urbanization.Tilesets.NetworkZones.Water.waternwes.png") .Select(x => new CellBitmap(x.Bitmap)) .Single() ), new AnimatedCellBitmapSet( FramerateDelay.TrafficFramerate, bitmaps .Where(x => string.Equals(x.FileName, "waternsroadew", StringComparison.CurrentCultureIgnoreCase)) .Select(x => new CellBitmap(x.Bitmap)) .ToArray() ) ) )); })); }
/// <summary> /// 填充密度集合缓存 /// </summary> /// <param name="memoryCache">缓存</param> /// <param name="density">密度数据</param> /// <returns>密度数据</returns> public static TrafficDensity FillDensity(this IMemoryCache memoryCache, TrafficDensity density) { if (density != null) { TrafficRegion region = memoryCache.GetRegion(density.DataId); if (region != null) { density.RegionName = region.RegionName; } } return(density); }
public static Dictionary <TrafficRegion, int> CreateData(IServiceProvider serviceProvider, List <DensityDevice> devices, List <DataCreateMode> modes, List <DateTime> startTimes, List <DateTime> endTimes, bool initDatabase = false) { if (initDatabase) { ResetDatabase(serviceProvider); } Dictionary <TrafficRegion, int> regions = new Dictionary <TrafficRegion, int>(); for (int i = 0; i < startTimes.Count; ++i) { DateTime minTime = TimePointConvert.CurrentTimePoint(BranchDbConvert.DateLevel, startTimes[i]); DateTime maxTime = TimePointConvert.NextTimePoint(BranchDbConvert.DateLevel, minTime); DensityBranchBlock branch = new DensityBranchBlock(serviceProvider); branch.Open(devices, minTime, maxTime); Random random = new Random(); foreach (DensityDevice device in devices) { foreach (var relation in device.DensityDevice_DensityChannels) { foreach (TrafficRegion region in relation.Channel.Regions) { int randomValue = random.Next(1, 1000); if (modes[i] == DataCreateMode.Random) { regions[region] = randomValue; } int value = 1; for (int m = 0; m < 1440; ++m) { DateTime dataTime = startTimes[i].AddMinutes(m); if (dataTime > DateTime.Now) { break; } if (dataTime >= startTimes[i] && dataTime < endTimes[i]) { TrafficDensity density; if (modes[i] == DataCreateMode.Fixed) { density = new TrafficDensity { MatchId = $"{device.Ip}_{relation.Channel.ChannelIndex}_{region.RegionIndex}", DateTime = new DateTime(dataTime.Year, dataTime.Month, dataTime.Day, dataTime.Hour, dataTime.Minute, 0), Value = 1 }; } else if (modes[i] == DataCreateMode.Sequence) { density = new TrafficDensity { MatchId = $"{device.Ip}_{relation.Channel.ChannelIndex}_{region.RegionIndex}", DateTime = new DateTime(dataTime.Year, dataTime.Month, dataTime.Day, dataTime.Hour, dataTime.Minute, 0), Value = value }; } else { density = new TrafficDensity { MatchId = $"{device.Ip}_{relation.Channel.ChannelIndex}_{region.RegionIndex}", DateTime = new DateTime(dataTime.Year, dataTime.Month, dataTime.Day, dataTime.Hour, dataTime.Minute, 0), Value = randomValue }; } branch.Post(density); } ++value; } } } } branch.Close(); if (i == startTimes.Count - 1) { DateTime currentTime = TimePointConvert.CurrentTimePoint(BranchDbConvert.DateLevel); if (minTime != currentTime) { using (DensityContext context = serviceProvider.GetRequiredService <DensityContext>()) { context.ChangeDatabase(BranchDbConvert.GetTableName(minTime)); } branch.SwitchBranch(maxTime, TimePointConvert.NextTimePoint(BranchDbConvert.DateLevel, maxTime)); } } else { DateTime nextItem = TimePointConvert.CurrentTimePoint(BranchDbConvert.DateLevel, startTimes[i + 1]); if (minTime != nextItem) { using (DensityContext context = serviceProvider.GetRequiredService <DensityContext>()) { context.ChangeDatabase(BranchDbConvert.GetTableName(minTime)); } branch.SwitchBranch(maxTime, TimePointConvert.NextTimePoint(BranchDbConvert.DateLevel, maxTime)); } } } return(regions); }
public void TestDensityTimeSpanBlock(int startYear, int startMonth, int startDay, int endYear, int endMonth, int endDay) { DateTime startDate = new DateTime(startYear, startMonth, startDay); DateTime endDate = new DateTime(endYear, endMonth, endDay); int days = Convert.ToInt32((endDate - startDate).TotalDays + 1); DensityTimeSpanBlock oneMinuteBlock = new DensityTimeSpanBlock(DateTimeLevel.Minute, TestInit.ServiceProvider); BufferBlock <TrafficDensity> oneMinuteResult = new BufferBlock <TrafficDensity>(); oneMinuteBlock.LinkTo(oneMinuteResult); DensityTimeSpanBlock fiveMinuteBlock = new DensityTimeSpanBlock(DateTimeLevel.FiveMinutes, TestInit.ServiceProvider); BufferBlock <TrafficDensity> fiveMinuteResult = new BufferBlock <TrafficDensity>(); fiveMinuteBlock.LinkTo(fiveMinuteResult); DensityTimeSpanBlock fifteenMinuteBlock = new DensityTimeSpanBlock(DateTimeLevel.FifteenMinutes, TestInit.ServiceProvider); BufferBlock <TrafficDensity> fifteenMinuteResult = new BufferBlock <TrafficDensity>(); fifteenMinuteBlock.LinkTo(fifteenMinuteResult); DensityTimeSpanBlock sixtyMinuteBlock = new DensityTimeSpanBlock(DateTimeLevel.Hour, TestInit.ServiceProvider); BufferBlock <TrafficDensity> sixtyMinuteResult = new BufferBlock <TrafficDensity>(); sixtyMinuteBlock.LinkTo(sixtyMinuteResult); for (DateTime date = startDate; date <= endDate; date = date.AddDays(1)) { for (int i = 0; i < 24 * 60 * 60; ++i) { TrafficDensity flow = new TrafficDensity { DateTime = date.AddSeconds(i), Value = 3 }; oneMinuteBlock.InputBlock.Post(flow); fiveMinuteBlock.InputBlock.Post(flow); fifteenMinuteBlock.InputBlock.Post(flow); sixtyMinuteBlock.InputBlock.Post(flow); } } oneMinuteBlock.InputBlock.Complete(); oneMinuteBlock.WaitCompletion(); fiveMinuteBlock.InputBlock.Complete(); fiveMinuteBlock.WaitCompletion(); fifteenMinuteBlock.InputBlock.Complete(); fifteenMinuteBlock.WaitCompletion(); sixtyMinuteBlock.InputBlock.Complete(); sixtyMinuteBlock.WaitCompletion(); oneMinuteResult.TryReceiveAll(out IList <TrafficDensity> oneMinuteDensities); Assert.AreEqual(days * 24 * 60, oneMinuteDensities.Count); for (int i = 0; i < oneMinuteDensities.Count; ++i) { Assert.AreEqual(startDate.AddMinutes(i), oneMinuteDensities[i].DateTime); Assert.AreEqual(3, oneMinuteDensities[i].Value); } fiveMinuteResult.TryReceiveAll(out IList <TrafficDensity> fiveDensities); Assert.AreEqual(days * 24 * 60 / 5, fiveDensities.Count); for (int i = 0; i < fiveDensities.Count; ++i) { Assert.AreEqual(startDate.AddMinutes(i * 5), fiveDensities[i].DateTime); Assert.AreEqual(3, fiveDensities[i].Value); } fifteenMinuteResult.TryReceiveAll(out IList <TrafficDensity> fifteenDensities); Assert.AreEqual(days * 24 * 60 / 15, fifteenDensities.Count); for (int i = 0; i < fifteenDensities.Count; ++i) { Assert.AreEqual(startDate.AddMinutes(i * 15), fifteenDensities[i].DateTime); Assert.AreEqual(3, fifteenDensities[i].Value); } sixtyMinuteResult.TryReceiveAll(out IList <TrafficDensity> sixtyDensities); Assert.AreEqual(days * 24, sixtyDensities.Count); for (int i = 0; i < sixtyDensities.Count; ++i) { Assert.AreEqual(startDate.AddHours(i), sixtyDensities[i].DateTime); Assert.AreEqual(3, sixtyDensities[i].Value); } }