public static async Task <Osm> Fetch(string scopeName, Func <Feature, bool> filter = null) { TagTree.Reload(); Log = Log ?? Static.LogFactory.CreateLogger(typeof(References)); Log.LogInformation("Fetching Reference material from Maine E911 API"); // Fetch GIS var stateGis = await FileSerializer.ReadJsonCacheOrSource( scopeName + "/ReferenceRaw.GeoJson", () => GeoJsonAPISource.FetchMunicipality(scopeName)); var gisFeatures = stateGis.Features.Where(f => filter == null || filter(f)).ToArray(); if (IsFeatureSchemaOld(gisFeatures[0])) { gisFeatures = gisFeatures.Select(UpdateFeatureSchema).ToArray(); } Log.LogInformation("Validating Reference material"); Validate(gisFeatures); // Fetch the list of objectIDs with known errors to omit. var blacklist = Static.Municipalities[scopeName].BlackList.ToHashSet(); Log.LogInformation("Translating Reference material"); // Convert var nodes = gisFeatures .Where(f => !blacklist.Contains((long)f.Properties[KEYS.OBJECTID])) .Select(Convert) .Where(n => n.Tags.ContainsKey("addr:housenumber")) .ToArray(); if (!nodes.Any()) { return(null); } nodes = HandleStacks(nodes); HandleBlackTags(nodes, Static.Municipalities[scopeName].BlackTags); foreach (var node in nodes.Where(n => n.Tags.ContainsKey("addr:unit"))) { var newUnit = RemoveTokens(ReplaceTokens(node.Tags["addr:unit"], UNITs), Tags.UnitOmmisionable); if (newUnit == "") { node.Tags.RemoveKey("addr:unit"); } else { node.Tags["addr:unit"] = newUnit; } } var filtered = new Osm() { Nodes = nodes, Version = .6, Bounds = nodes.AsBounds() }; return(filtered); }