private async Task WriteStreamedNodesAsync(Dictionary <string, HashSet <string> > wayMap) { using (var disposableDict = new DisposableDictionary <string, StreamWriter>()) { await StreamNodesAsync(wayMap, disposableDict); } }
private async Task StreamNodesAsync(Dictionary <string, HashSet <string> > wayMap, DisposableDictionary <string, StreamWriter> streamWriters) { var lineCntr = 0; var relationRegion = GeometryFactory.GetRegionGeometry(RouteCleanerSettings.GetInstance().TemporaryBoundariesLocation, false, false); var relationTracker = new TrackRelationNodes(relationRegion.Relations); using var fs = File.Open(RouteCleanerSettings.GetInstance().TemporaryNodeOutLocation, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read); using (var sr = new StreamReader(fs)) { while (sr.Peek() >= 0) { var content = sr.ReadLine(); try { var node = JsonConvert.DeserializeObject <Node>(content); if (wayMap.TryGetValue(node.Id, out var ways)) { node.ContainingWays = ways.ToList(); } var code = new OpenLocationCode(node.Latitude, node.Longitude, codeLength: 2); if (!streamWriters.ContainsKey(code.Code)) { streamWriters.Add(code.Code, GetStreamWriter(code.Code)); } // update tracker with ways and relations from this node. relationTracker.AddNode(node); var line = JsonConvert.SerializeObject(node); line = Regex.Replace(line, @"\t|\n|\r", ""); streamWriters[code.Code].WriteLine(line); } catch (JsonReaderException e) { Console.WriteLine($"Could not deserialize line {lineCntr} {content}: {e.Message}"); } catch (JsonSerializationException e) { Console.WriteLine($"Could not deserialize line {lineCntr} {content}: {e.Message}"); } lineCntr++; } } var relationLines = relationTracker.GetRelationCounts().Select(x => JsonConvert.SerializeObject(x)); await File.WriteAllLinesAsync(RouteCleanerSettings.GetInstance().TemporaryRelationSummaryLocation, relationLines); }