コード例 #1
0
        /*
         * /// <summary>
         * /// Get a description of the design for logging
         * /// </summary>
         * /// <param name="designDescriptor">The design</param>
         * /// <returns>A descriptive string of the design properties</returns>
         * public static string DesignDescriptionForLogging(DesignDescriptor designDescriptor)
         * {
         * if (designDescriptor == null)
         *  return string.Empty;
         *
         * if (designDescriptor.file != null)
         *  return $"{designDescriptor.file.filespaceId}:{designDescriptor.file.path}/{designDescriptor.file.fileName}";
         *
         * return designDescriptor.id.ToString();
         * }
         */

        /// <summary>
        /// Determines if a polygon lies outside a bounding box.
        /// </summary>
        /// <param name="bbox">The bounding box</param>
        /// <param name="points">The polygon</param>
        /// <returns>True if the polygon is completely outside the bounding box otherwise false</returns>
        public static bool Outside(MapBoundingBox bbox, List <WGSPoint> points)
        {
            return(points.Min(p => p.Lat) > bbox.maxLat ||
                   points.Max(p => p.Lat) < bbox.minLat ||
                   points.Min(p => p.Lon) > bbox.maxLng ||
                   points.Max(p => p.Lon) < bbox.minLng);
        }
コード例 #2
0
        [InlineData(4096, 4096, false, 4096, 4096, 1.5269, 1.1341, -1.4009, 1.1341)]//tile larger than bbox
        public void TestZeroAreaBoundingBoxes(int tileWidth, int tileHeight, bool addMargin, int expectedWidth, int expectedHeight,
                                              double expectedMinLat, double expectedMinLng, double expectedMaxLat, double expectedMaxLng)
        {
            var            minLat = 0.63137;  //36.175°
            var            minLng = -2.00748; //-115.020°
            var            maxLat = 0.63137;  //36.178°
            var            maxLng = -2.00748; //-115.018°
            MapBoundingBox bbox   = new MapBoundingBox
            {
                minLat = minLat,
                minLng = minLng,
                maxLat = maxLat,
                maxLng = maxLng
            };

            var service = new BoundingBoxService(loggerFactory);
            //numTiles = 1048576 for Z10
            MapParameters parameters = new MapParameters
            {
                bbox      = bbox,
                numTiles  = 1048576,
                zoomLevel = 10,
                mapWidth  = tileWidth,
                mapHeight = tileHeight,
                addMargin = addMargin
            };

            service.AdjustBoundingBoxToFit(parameters);
            parameters.mapWidth.Should().Be(expectedWidth);
            parameters.mapHeight.Should().Be(expectedHeight);
            parameters.bbox.minLat.Should().BeApproximately(expectedMinLat, 0.0001);
            parameters.bbox.minLng.Should().BeApproximately(expectedMinLng, 0.0001);
            parameters.bbox.maxLat.Should().BeApproximately(expectedMaxLat, 0.0001);
            parameters.bbox.maxLng.Should().BeApproximately(expectedMaxLng, 0.0001);
        }
コード例 #3
0
        public AwsBoundingBox BuildBoundingBox(MapBoundingBox mapBox)
        {
            var awsMapBoundingBox = new AwsBoundingBox
            {
                UpperLeftCoordinates   = new GeoCoordinates(mapBox.UpperLeftLat, mapBox.UpperLeftLng),
                BottomRightCoordinates = new GeoCoordinates(mapBox.BottomRightLat, mapBox.BottomRightLng)
            };

            return(awsMapBoundingBox);
        }
コード例 #4
0
        public void PolygonOutsideBoundingBox()
        {
            var bbox = new MapBoundingBox
            {
                minLat = 36.0, minLng = -115.9, maxLat = 36.5, maxLng = -115.0
            };
            var points = new List <WGSPoint>
            {
                new WGSPoint(35.0, -116.0),
                new WGSPoint(35.5, -116.0),
                new WGSPoint(35.5, -116.5),
                new WGSPoint(35.0, -116.5),
                new WGSPoint(35.0, -116.0),
            };

            Assert.True(TileServiceUtils.Outside(bbox, points));
        }
コード例 #5
0
        public void PolygonIntersectsBoundingBox()
        {
            var bbox = new MapBoundingBox
            {
                minLat = 36.0,
                minLng = -115.9,
                maxLat = 36.5,
                maxLng = -115.0
            };
            var points = new List <WGSPoint>
            {
                new WGSPoint(35.9, -115.5),
                new WGSPoint(36.3, -115.5),
                new WGSPoint(36.3, -115.7),
                new WGSPoint(35.9, -115.7),
                new WGSPoint(35.9, -115.5),
            };

            Assert.False(TileServiceUtils.Outside(bbox, points));
        }
コード例 #6
0
        public void PolygonInsideBoundingBox()
        {
            var bbox = new MapBoundingBox
            {
                minLat = 36.0,
                minLng = -115.9,
                maxLat = 36.5,
                maxLng = -115.0
            };
            var points = new List <WGSPoint>
            {
                new WGSPoint(36.1, -115.5),
                new WGSPoint(36.3, -115.5),
                new WGSPoint(36.3, -115.7),
                new WGSPoint(36.1, -115.7),
                new WGSPoint(36.1, -115.5)
            };

            Assert.IsFalse(Outside(bbox, points));
        }
コード例 #7
0
        public void PolygonEnvelopsBoundingBox()
        {
            var bbox = new MapBoundingBox
            {
                minLat = 36.0,
                minLng = -115.9,
                maxLat = 36.5,
                maxLng = -115.0
            };
            var points = new List <WGSPoint>
            {
                new WGSPoint(35.9, -116.0),
                new WGSPoint(36.6, -116.0),
                new WGSPoint(36.6, -114.9),
                new WGSPoint(35.9, -114.9),
                new WGSPoint(35.9, -116.0)
            };

            Assert.IsFalse(Outside(bbox, points));
        }
コード例 #8
0
        /// <summary>
        /// Get the map parameters for the report tile
        /// </summary>
        public MapParameters GetMapParameters(string bbox, int width, int height, bool addMargin, bool adjustBoundingBox)
        {
            log.LogDebug($"GetMapParameters: bbox={bbox}, width={width}, height={height}, addMargin={addMargin}, adjustBoundingBox={adjustBoundingBox}");

            var            bboxRadians = boundingBoxHelper.GetBoundingBox(bbox);
            MapBoundingBox mapBox      = new MapBoundingBox
            {
                minLat = bboxRadians.BottomLeftLat,
                minLng = bboxRadians.BottomLeftLon,
                maxLat = bboxRadians.TopRightLat,
                maxLng = bboxRadians.TopRightLon
            };

            int  zoomLevel = TileServiceUtils.CalculateZoomLevel(mapBox.maxLat - mapBox.minLat, mapBox.maxLng - mapBox.minLng);
            long numTiles  = TileServiceUtils.NumberOfTiles(zoomLevel);

            MapParameters parameters = new MapParameters
            {
                bbox      = mapBox,
                zoomLevel = zoomLevel,
                numTiles  = numTiles,
                mapWidth  = width,
                mapHeight = height,
                addMargin = addMargin
            };

            if (adjustBoundingBox)
            {
                boundingBoxService.AdjustBoundingBoxToFit(parameters);
            }

            parameters.pixelTopLeft = TileServiceUtils.LatLngToPixel(mapBox.maxLat, mapBox.minLng, parameters.numTiles);
            log.LogDebug("MapParameters: " + JsonConvert.SerializeObject(parameters));

            return(parameters);
        }
コード例 #9
0
        public void ImportNodes(OsmStreamSource source, bool forceIfTableEmpty = false, MapBoundingBox mapBoundingBox = null)
        {
            if (source is null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (_liteDB is null)
            {
                throw new ArgumentNullException(nameof(_liteDB));
            }

            if (_liteDB.GetAllNodes().Count() != 0 || !forceIfTableEmpty)
            {
                return;
            }

            Func <double, double, bool> isInBoundingBox;

            if (mapBoundingBox == null)
            {
                isInBoundingBox = (_a, _b) => true;
            }
            else
            {
                isInBoundingBox = (lon, lat) =>
                {
                    return
                        (mapBoundingBox.MinLon <= lon &&
                         lon <= mapBoundingBox.MaxLon &&
                         mapBoundingBox.MinLat <= lat &&
                         lat <= mapBoundingBox.MaxLat);
                }
            };

            var allNodes = from osmGeo in source
                           where
                           osmGeo.Type == OsmGeoType.Node
                           let nd = ((Node)osmGeo)
                                    where nd.Id != null && nd.Latitude != null && nd.Longitude != null && isInBoundingBox(nd.Longitude.Value, nd.Latitude.Value)
                                    select new GeoNode {
                OSMId = osmGeo.Id.Value, Latitude = nd.Latitude.Value, Longitude = nd.Longitude.Value
            };

            _liteDB.InsertNodes(allNodes);
        }
コード例 #10
0
        public void ImportOSM(string pathToOSM, DBLayer dal, bool forceIfTableEmpty = false, MapBoundingBox mapBoundingBox = null)
        {
            using (var fileStream = File.OpenRead(pathToOSM))
            {
                // create source stream.
                OsmStreamSource source;
                if (Path.GetExtension(pathToOSM).ToLower().Contains("pbf"))
                {
                    source = ImportOSMPBF(fileStream);
                }
                else
                {
                    source = ImportOSMXML(fileStream);
                }

                dal.ImportNodes(source, true, mapBoundingBox);
                dal.ImportWays(source);
                dal.ClearUnboundNodes();
            }
        }