/// <summary> /// Executes the actual algorithm. /// </summary> protected override void DoRun() { var tiles = new Dictionary <TileIndex, RoutingTile>(); _edgeVisitor.Visit += (id, startVertex, startWeight, endVertex, endWeight, shape) => { var endCoordinate = shape[shape.Count - 1]; var index = TileIndex.WorldToTileIndex(endCoordinate.Latitude, endCoordinate.Longitude, _level); RoutingTile tile; if (!tiles.TryGetValue(index, out tile)) { tile = new RoutingTile { Weight = endWeight, Count = 1, Index = index }; } else { tile.Weight = (tile.Weight * tile.Count + endWeight) / tile.Count + 1; tile.Count++; } tiles[index] = tile; }; _edgeVisitor.Run(); _result = new HeatmapResult(); _result.Data = new HeatmapSample[tiles.Count]; var max = 0f; var i = 0; foreach (var pair in tiles) { var location = TileIndex.TileIndexToWorld(pair.Key.X, pair.Key.Y, _level); _result.Data[i] = new HeatmapSample() { Latitude = location.Latitude, Longitude = location.Longitude, Value = pair.Value.Weight }; if (max < pair.Value.Weight) { max = pair.Value.Weight; } i++; } _result.Max = max; this.HasSucceeded = true; }
/// <summary> /// Executes the actual algorithm. /// </summary> protected override void DoRun(CancellationToken cancellationToken) { var tiles = new Dictionary <TileIndex, RoutingTile>(); _edgeVisitor.Visit += (path) => { var e = path.Edge; var endWeight = path.Weight; if (e == Constants.NO_EDGE) { return(false); } // Calculate weight at start vertex. uint edgeId; if (e > 0) { edgeId = (uint)e - 1; } else { edgeId = (uint)((-e) - 1); } var edge = _graph.GetEdge(edgeId); var shape = _graph.GetShape(edge); var endCoordinate = shape[shape.Count - 1]; var index = TileIndex.WorldToTileIndex(endCoordinate.Latitude, endCoordinate.Longitude, _level); RoutingTile tile; if (!tiles.TryGetValue(index, out tile)) { tile = new RoutingTile { Weight = endWeight, Count = 1, Index = index }; } else { tile.Weight = (tile.Weight * tile.Count + endWeight) / tile.Count + 1; tile.Count++; } tiles[index] = tile; return(false); }; _edgeVisitor.Run(cancellationToken); _result = new HeatmapResult(); _result.Data = new HeatmapSample[tiles.Count]; var max = 0f; var i = 0; foreach (var pair in tiles) { var location = TileIndex.TileIndexToWorld(pair.Key.X, pair.Key.Y, _level); _result.Data[i] = new HeatmapSample() { Latitude = location.Latitude, Longitude = location.Longitude, Value = pair.Value.Weight }; if (max < pair.Value.Weight) { max = pair.Value.Weight; } i++; } _result.Max = max; this.HasSucceeded = true; }