private IEnumerable <IFeature> EnumerateOsmDataAsGeoJson(BoundingBox bbox, IOsmDataSettings filter) { string directoryName = Path.Combine(filter.FlatGeobufTilesDirectory, filter.FilterIdentifier); var tiles = TileUtils.GetTilesInBoundingBox(bbox, TILE_ZOOM_LEVEL, TILE_SIZE) .Select(tile => new OpenStreetMapDotNet.MapTileInfo(tile.X, tile.Y, tile.Zoom, tile.TileSize)) .Where(tile => FlatGeoBufFileSystem.FileExists(tile, directoryName)) .ToList(); if (tiles.Count == 0) { throw new Exception($"All required tiles are missing"); } int i = 0; foreach (var tile in tiles) { _logger.LogInformation($"Reading tiles from {directoryName}... {(i / (float)tiles.Count):P1}"); var osmTileInfo = new OpenStreetMapDotNet.MapTileInfo(tile.X, tile.Y, tile.Zoom, tile.TileSize); FlatGeobufTileReader reader = new FlatGeobufTileReader(osmTileInfo, directoryName); foreach (IFeature way in reader.GetEnumerator()) { yield return(way); } i++; } }
public IEnumerable <IFeature> GetOsmDataAsGeoJson(BoundingBox bbox, IOsmDataSettings filter) { FeatureCollection fc = new FeatureCollection(); Envelope envelope = new Envelope(bbox.xMin, bbox.xMax, bbox.yMin, bbox.yMax); Stopwatch sw = Stopwatch.StartNew(); int numFeatures = 0; int numInside = 0; HashSet <long> idsYielded = new HashSet <long>(); foreach (IFeature feature in EnumerateOsmDataAsGeoJson(bbox, filter)) { numFeatures++; if (feature.Geometry.EnvelopeInternal.Intersects(envelope)) { long featureId = (long)feature.Attributes["osmid"]; numInside++; if (!idsYielded.Contains(featureId)) { idsYielded.Add(featureId); yield return(feature); } } } _logger.LogInformation($"Read {numFeatures:N0}, {numInside:N0} inside, {idsYielded.Count} unique, in {sw.ElapsedMilliseconds:N} ms"); }
public int GetOsmDataCount(BoundingBox bbox, IOsmDataSettings filter) { try { using (TimeSpanBlock timeSpanBlock = new TimeSpanBlock("GetOsmDataAsGeoJson", _logger, LogLevel.Debug)) { OverpassQuery query = new OverpassQuery(bbox, _logger); if (filter != null) { if (filter.WaysFilter != null) { foreach (var tagFilter in filter.WaysFilter) { query.WithWays(tagFilter); } } if (filter.RelationsFilter != null) { foreach (var tagFilter in filter.RelationsFilter) { query.WithRelations(tagFilter); } } if (filter.NodesFilter != null) { foreach (var tagFilter in filter.NodesFilter) { query.WithNodes(tagFilter); } } } var task = query.AsCount() .RunQueryAsync() .ToCountAsync(); OverpassCountResult count = task.GetAwaiter().GetResult(); return(count.Tags.Nodes * 2); } } catch (Exception ex) { _logger.LogError($"{nameof(GetOsmDataAsGeoJson)} error: {ex.Message}"); throw; } }
public IEnumerable <IFeature> GetOsmDataAsGeoJson(BoundingBox bbox, IOsmDataSettings filter) { try { using (TimeSpanBlock timeSpanBlock = new TimeSpanBlock(nameof(GetOsmDataAsGeoJson), _logger, LogLevel.Debug)) { OverpassQuery query = new OverpassQuery(bbox, _logger); if (filter != null) { if (filter.WaysFilter != null) { foreach (var tagFilter in filter.WaysFilter) { query.WithWays(tagFilter); } } if (filter.RelationsFilter != null) { foreach (var tagFilter in filter.RelationsFilter) { query.WithRelations(tagFilter); } } if (filter.NodesFilter != null) { foreach (var tagFilter in filter.NodesFilter) { query.WithNodes(tagFilter); } } } var task = query.ToGeoJSONAsync(); FeatureCollection ways = task.GetAwaiter().GetResult(); _logger.LogInformation($"{ways?.Count} features downloaded"); return(ways); } } catch (Exception ex) { _logger.LogError($"{nameof(GetOsmDataAsGeoJson)} error: {ex.Message}"); throw; } }
public int GetOsmDataCount(BoundingBox bbox, IOsmDataSettings filter) { return(EnumerateOsmDataAsGeoJson(bbox, filter).Count()); }