Esempio n. 1
0
        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++;
            }
        }
Esempio n. 2
0
        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");
        }
Esempio n. 3
0
        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;
            }
        }
Esempio n. 4
0
        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;
            }
        }
Esempio n. 5
0
 public int GetOsmDataCount(BoundingBox bbox, IOsmDataSettings filter)
 {
     return(EnumerateOsmDataAsGeoJson(bbox, filter).Count());
 }