示例#1
0
        public void ValidateFailInvalidPaletteNumberTest()
        {
            //wrong number of palettes for display mode
            TileRequest request = new TileRequest(projectId, null, callId, DisplayMode.CCVPercent, palettes, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0, FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);

            Assert.ThrowsException <ServiceException>(() => request.Validate());
        }
示例#2
0
        public void ValidateFailMissingBoundingBoxTest()
        {
            //missing bounding box
            TileRequest request = new TileRequest(projectId, null, callId, DisplayMode.Height, null, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0, FilterLayerMethod.None, null, null, 256, 256);

            Assert.ThrowsException <ServiceException>(() => request.Validate());
        }
示例#3
0
        public void CanCreateTileRequestTest()
        {
            var         validator = new DataAnnotationsValidator();
            TileRequest request   = new TileRequest(
                projectId, null, callId, DisplayMode.Height, null, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0,
                FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);
            ICollection <ValidationResult> results;

            Assert.IsTrue(validator.TryValidate(request, out results));

            //missing project id
            request = new TileRequest(-1, null, callId, DisplayMode.Height, null, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0,
                                      FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);
            Assert.IsFalse(validator.TryValidate(request, out results));

            //vol no change tolerance out of range
            request = new TileRequest(projectId, null, callId, DisplayMode.Height, null, liftSettings, VolumesType.None, 10.1, null, null, 0, null, 0,
                                      FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);
            Assert.IsFalse(validator.TryValidate(request, out results));

            //width out of range
            request = new TileRequest(projectId, null, callId, DisplayMode.Height, null, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0,
                                      FilterLayerMethod.None, boundingBox2DLatLon, null, 16, 256);
            Assert.IsFalse(validator.TryValidate(request, out results));

            //height out of range
            request = new TileRequest(projectId, null, callId, DisplayMode.Height, null, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0,
                                      FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 16000);
            Assert.IsFalse(validator.TryValidate(request, out results));
        }
示例#4
0
        public void ValidateFailInvalidPaletteOrderTest()
        {
            //palettes out of order
            TileRequest request = new TileRequest(projectId, null, callId, DisplayMode.Height, invalidPalettes, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0, FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);

            Assert.ThrowsException <ServiceException>(() => request.Validate());
        }
示例#5
0
        public void ValidateFailInvalidVolumeTypeTest()
        {
            //Unsupported volume type (for volumes display mode)
            TileRequest request = new TileRequest(projectId, null, callId, DisplayMode.VolumeCoverage, null, liftSettings, VolumesType.AboveLevel, 0.0, null, null, 0, null, 0, FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);

            Assert.ThrowsException <ServiceException>(() => request.Validate());
        }
示例#6
0
        public void ValidateFailMissingFilterTest()
        {
            //missing filter (for volumes display mode)
            TileRequest request = new TileRequest(projectId, null, callId, DisplayMode.VolumeCoverage, null, liftSettings, VolumesType.Between2Filters, 0.0, null, null, 0, null, 0, FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);

            Assert.ThrowsException <TwoFiltersRequiredException>(() => request.Validate());
        }
示例#7
0
        public void ValidateFailTwoBoundingBoxesTest()
        {
            var boundingBox2dGrid = new BoundingBox2DGrid(380646.982394, 812634.205106, 380712.19834, 812788.92875);

            //Two bounding boxes
            TileRequest request = new TileRequest(projectId, null, callId, DisplayMode.Height, null, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0, FilterLayerMethod.None, boundingBox2DLatLon, boundingBox2dGrid, 256, 256);

            Assert.ThrowsException <ServiceException>(() => request.Validate());
        }
示例#8
0
        public void ValidateFailMissingDesignTest()
        {
            //missing design (for cutfill display mode)
            TileRequest request = new TileRequest(projectId, null, callId, DisplayMode.CutFill, null, liftSettings,
                                                  VolumesType.BetweenDesignAndFilter, 0.0, null, null, 0, null, 0,
                                                  FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);

            Assert.ThrowsException <MissingDesignDescriptorException>(() => request.Validate());
        }
示例#9
0
        public async Task <TileResult> PostTilesTbc([FromBody] TileRequest request)
        {
            request.Validate();

            return(await RequestExecutorContainerFactory.Build <TilesExecutor>(logger,
#if RAPTOR
                                                                               raptorClient,
#endif
                                                                               configStore : ConfigStore, trexCompactionDataProxy : TRexCompactionDataProxy, fileImportProxy : FileImportProxy, customHeaders : CustomHeaders, userId : GetUserId()).ProcessAsync(request) as TileResult);
        }
示例#10
0
        public async Task GetImageAsync()
        {
            var search = new TileRequest(apiKey, signingKey, new Size(640, 640))
            {
                Zoom    = 20,
                Address = "4909 Rutland Pl, Alexandria, VA, 22304"
            };
            var decoder = new PngFactory().Pipe(new PngCodec());
            var results = await cache
                          .LoadAsync(decoder, search)
                          .ConfigureAwait(false);

            Assert.IsNotNull(results);
            Assert.AreEqual(640, results.Info.Dimensions.Width);
            Assert.AreEqual(640, results.Info.Dimensions.Height);
        }
示例#11
0
        public async Task <FileResult> PostRaw([FromBody] TileRequest request)
        {
            request.Validate();
            if (await RequestExecutorContainerFactory.Build <TilesExecutor>(logger,
#if RAPTOR
                                                                            raptorClient,
#endif
                                                                            configStore: ConfigStore, trexCompactionDataProxy: TRexCompactionDataProxy, customHeaders: CustomHeaders,
                                                                            userId: GetUserId(), fileImportProxy: FileImportProxy).ProcessAsync(request) is TileResult tileResult)
            {
                Response.Headers.Add("X-Warning", tileResult.TileOutsideProjectExtents.ToString());

                return(new FileStreamResult(new MemoryStream(tileResult.TileData), ContentTypeConstants.ImagePng));
            }

            return(null);
        }
        public override void DownloadTile(
            TileId tileId,
            TileEdgeFlags tileEdgeFlags,
            object token,
            RasterTileAvailableDelegate tileAvailableDelegate,
            int priority)
        {
            var uri = tileUriDelegate(tileId);

            if (uri is object)
            {
                if (tileRequests.TryGetValue(tileId, out var tileRequest1))
                {
                    throw new InvalidOperationException("Multiple concurrent downloads of the same tile is not supported.");
                }
                TileRequest tileRequest2;
                tileRequests[tileId] = tileRequest2 = new TileRequest()
                {
                    TileId                = tileId,
                    Token                 = token,
                    TileEdgeFlags         = tileEdgeFlags,
                    TileAvailableDelegate = tileAvailableDelegate
                };
                tileRequest2.WebRequest = BitmapImageRequestQueue.Instance.CreateRequest(uri, (NetworkPriority)priority, tileRequest2, new BitmapImageRequestCompletedHandler(TileDownloadCompleted));
            }
            else if (tileSource.SuppliesImagesDirectly)
            {
                if (tileRequests.TryGetValue(tileId, out var tileRequest1))
                {
                    throw new InvalidOperationException("Multiple concurrent downloads of the same tile is not supported.");
                }
                TileRequest tileRequest2;
                tileRequests[tileId] = tileRequest2 = new TileRequest()
                {
                    TileId                = tileId,
                    Token                 = token,
                    TileEdgeFlags         = tileEdgeFlags,
                    TileAvailableDelegate = tileAvailableDelegate
                };
                tileRequest2.WebRequest = BitmapImageRequestQueue.Instance.CreateRequest(tileImageDelegate, (NetworkPriority)priority, tileRequest2, new BitmapImageRequestCompletedHandler(TileDownloadCompleted));
            }
            else
            {
                tileAvailableDelegate(null, new Rect(), null, token);
            }
        }
示例#13
0
    private void RequestFinished(ResourceRequest r)
    {
        TileRequest request = r as TileRequest;
        var         tileId  = request.id;

        if (request.State != RequestState.Canceled)
        {
            requestedTiles.Remove(tileId);

            if (request.State == RequestState.Succeeded)
#if SAFETY_CHECK
            {
                if (tilesMap.ContainsKey(tileId))
                {
                    Debug.LogError("Tile '" + tileId + "' already exists!");
                }
                else
#endif
            {
                MapTile tile = AddTile(tileId);

                float tileScale = Mathf.Pow(2, map.zoom - tile.ZoomLevel);
                tile.SetTexture(request.texture);
                tile.UpdateTile(map.Anchor, map.TilesToUnits, map.AnchorOffsetInUnits, tileScale);
                tile.Show();
            }
#if SAFETY_CHECK
        }
        else
        {
            // Getting a lot of errors here
            Debug.LogError("Requesting tile '" + tileId + "' finished with state: " + request.State);
            if (!string.IsNullOrEmpty(request.Error))
            {
                Debug.LogError("Requesting error: " + request.Error);
            }
        }
#endif
        }

        if (requestedTiles.Count == 0)
        {
            CleanUpTiles();
        }
    }
示例#14
0
        public async Task GetImageAsync()
        {
            var search = new TileRequest(apiKey, signingKey, new Size(640, 640))
            {
                Zoom    = 20,
                Address = "4909 Rutland Pl, Alexandria, VA, 22304"
            };
            var decoder = new TranscoderCodec <Hjg.Pngcs.ImageLines, ImageData>(
                new HjgPngcsCodec(),
                new HjgPngcsImageDataTranscoder());
            var results = await cache
                          .LoadAsync(decoder, search)
                          .ConfigureAwait(false);

            Assert.IsNotNull(results);
            Assert.AreEqual(640, results.Info.Dimensions.Width);
            Assert.AreEqual(640, results.Info.Dimensions.Height);
        }
示例#15
0
        /// <summary>
        /// Gets the requested CA data tile from Raptor.
        /// </summary>
        /// <param name="request">HTTP request.</param>
        /// <returns>An HTTP response containing an error code is there is a failure, or a PNG image if the request suceeds.
        /// If the size of a pixel in the rendered tile coveres more than 10.88 meters in width or height, then the pixel will be rendered
        /// in a 'representational style' where black (currently, but there is a work item to allow this to be configurable) is used
        /// to indicate the presense of data. Representational style rendering performs no filtering what so ever on the data.10.88 meters is 32
        /// (number of cells across a subgrid) * 0.34 (default width in meters of a single cell)</returns>
        private async Task <FileResult> GetCCADataTile(TileRequest request)
        {
            var tileResult = await RequestExecutorContainerFactory.Build <TilesExecutor>(logger,
#if RAPTOR
                                                                                         raptorClient,
#endif
                                                                                         configStore : ConfigStore, trexCompactionDataProxy : TRexCompactionDataProxy, customHeaders : CustomHeaders,
                                                                                         userId : UserId, fileImportProxy : FileImportProxy)
                             .ProcessAsync(request) as TileResult;

            if (tileResult?.TileData == null)
            {
                tileResult = TileResult.EmptyTile(WebMercatorProjection.TILE_SIZE, WebMercatorProjection.TILE_SIZE);
            }

            Response.Headers.Add("X-Warning", tileResult.TileOutsideProjectExtents.ToString());

            return(new FileStreamResult(new MemoryStream(tileResult.TileData), ContentTypeConstants.ImagePng));
        }
示例#16
0
        /// <summary>
        /// Creates an instance of the TileRequest class and populate it with data needed for a tile.
        /// </summary>
        /// <returns>An instance of the TileRequest class.</returns>
        public TileRequest CreateTileRequest(DisplayMode mode, ushort width, ushort height,
                                             BoundingBox2DLatLon bbox, ElevationStatisticsResult elevExtents, bool explicitFilters = false)
        {
            var liftSettings = SettingsManager.CompactionLiftBuildSettings(ProjectSettings);

            Filter?.Validate();//Why is this here? Should be done where filter set up???
            var palette        = SettingsManager.CompactionPalette(mode, elevExtents, ProjectSettings, ProjectSettingsColors);
            var computeVolType = (int)(volCalcType ?? VolumeCalcType.None);

            DesignDescriptor design  = DesignDescriptor;
            FilterResult     filter1 = Filter;
            FilterResult     filter2 = null;

            if (mode == DisplayMode.CutFill)
            {
                switch (volCalcType)
                {
                case VolumeCalcType.DesignToGround:
                case VolumeCalcType.GroundToDesign:
                    design  = volumeDesign;
                    filter1 = baseFilter ?? topFilter;
                    break;

                case VolumeCalcType.GroundToGround:
                    filter1 = baseFilter;
                    filter2 = topFilter;
                    break;
                }
            }

            TileRequest tileRequest = new TileRequest(
                ProjectId, ProjectUid, null, mode, palette, liftSettings, (VolumesType)computeVolType,
                0, design, filter1, 0, filter2, 0,
                Filter == null || !Filter.LayerType.HasValue ? FilterLayerMethod.None : Filter.LayerType.Value,
                bbox, null, width, height, 0, CMV_DETAILS_NUMBER_OF_COLORS, CMV_PERCENT_CHANGE_NUMBER_OF_COLORS, false, explicitFilters);

            return(tileRequest);
        }
示例#17
0
        public void ValidateSuccessTest()
        {
            TileRequest request = new TileRequest(projectId, null, callId, DisplayMode.Height, null, liftSettings, VolumesType.None, 0.0, null, null, 0, null, 0, FilterLayerMethod.None, boundingBox2DLatLon, null, 256, 256);

            request.Validate();
        }
示例#18
0
        private async Task <TileRequest> CreateAndValidateRequest(
            long projectId,
            Guid?projectUid,
            long assetId,
            string machineName,
            bool isJohnDoe,
            DateTime startUtc,
            DateTime endUtc,
            string bbox,
            ushort width,
            ushort height,
            int?liftId,
            Guid?assetUid)
        {
            if (liftId == 0)
            {
                liftId = null;
            }

            var points = bbox.Split(',');

            if (points.Length != 4)
            {
                throw new ServiceException(HttpStatusCode.BadRequest,
                                           new ContractExecutionResult(ContractExecutionStatesEnum.ValidationError,
                                                                       "BBOX parameter must contain 4 coordinates!"));
            }

            /*** no longer supported in WorksOS as no geofenceService
             * List<WGSPoint> geometry = null;
             * if (geofenceUid.HasValue)
             * {
             * var geometryWKT = await geofenceProxy.GetGeofenceBoundary(((RaptorPrincipal) User).CustomerUid, geofenceUid.ToString(), Request.Headers.GetCustomHeaders());
             *
             * if (string.IsNullOrEmpty(geometryWKT))
             *  throw new ServiceException(HttpStatusCode.BadRequest, new ContractExecutionResult(ContractExecutionStatesEnum.InternalProcessingError,
             *      "No Geofence geometry found."));
             *
             * geometry = CommonConverters.GeometryToPoints(geometryWKT).ToList();
             * }
             ***/

            var filter = FilterResult.CreateFilterForCCATileRequest
                         (
                startUtc,
                endUtc,
                new List <long> {
                assetId
            },
                null,
                liftId.HasValue ? FilterLayerMethod.TagfileLayerNumber : FilterLayerMethod.None,
                liftId,
                new List <MachineDetails> {
                new MachineDetails(assetId, machineName, isJohnDoe, assetUid)
            }
                         );

            var request = new TileRequest
                          (
                projectId,
                projectUid,
                null,
                DisplayMode.CCA,
                null,
                null,
                VolumesType.None,
                0,
                null,
                filter,
                0,
                null,
                0,
                FilterLayerMethod.TagfileLayerNumber,
                new BoundingBox2DLatLon
                (
                    double.Parse(points[1]) * Coordinates.DEGREES_TO_RADIANS, // The Bottom Left corner, longitude...
                    double.Parse(points[0]) * Coordinates.DEGREES_TO_RADIANS, // The Bottom Left corner, latitude...
                    double.Parse(points[3]) * Coordinates.DEGREES_TO_RADIANS, // The Top Right corner, longitude..
                    double.Parse(points[2]) * Coordinates.DEGREES_TO_RADIANS  // The Top Right corner, latitude...
                ),
                null,
                width,
                height
                          );

            request.Validate();

            return(request);
        }
示例#19
0
        /// <summary>
        /// Gets the requested tile from Raptor
        /// </summary>
        /// <param name="projectSettings">Project settings to use for Raptor</param>
        /// <param name="projectSettingsColors"></param>
        /// <param name="filter">Filter to use for Raptor</param>
        /// <param name="projectId">Legacy project ID</param>
        /// <param name="projectUid">Unique project identifier</param>
        /// <param name="mode">Display mode; type of data requested</param>
        /// <param name="width">Width of the tile</param>
        /// <param name="height">Height of the tile in pixels</param>
        /// <param name="bbox">Bounding box in radians</param>
        /// <param name="cutFillDesign">Design descriptor for cut-fill</param>
        /// <param name="baseFilter">Base filter for  summary volumes</param>
        /// <param name="topFilter">Top filter for  summary volumes</param>
        /// <param name="volumeDesign">Design descriptor for summary volumes design</param>
        /// <param name="volumeCalcType">Type of summary volumes calculation</param>
        /// <param name="customHeaders">Custom request headers</param>
        /// <returns>Tile result</returns>
        public async Task <TileResult> GetProductionDataTile(CompactionProjectSettings projectSettings, CompactionProjectSettingsColors projectSettingsColors, FilterResult filter, long projectId, Guid projectUid, DisplayMode mode, ushort width, ushort height, BoundingBox2DLatLon bbox, DesignDescriptor cutFillDesign, FilterResult baseFilter, FilterResult topFilter, DesignDescriptor volumeDesign, VolumeCalcType?volumeCalcType, IHeaderDictionary customHeaders, string userId, bool explicitFilters = false)
        {
            var getTile = true;
            ElevationStatisticsResult elevationExtents = null;
            TileRequest tileRequest = null;

            try
            {
                elevationExtents = await GetElevationExtents(projectSettings, filter, projectId, projectUid, mode, customHeaders, userId);
            }
            catch (ServiceException se)
            {
                getTile = mode != DisplayMode.Height;
                if (log.IsTraceEnabled())
                {
                    log.LogTrace(
                        $"Failed to get elevation extents for height request with error: {se.GetResult.Code}:{se.GetResult.Message} a transparent tile will be generated");
                }
            }

            if (getTile)
            {
                tileRequest = requestFactory.Create <TileRequestHelper>(r => r
                                                                        .ProjectUid(projectUid)
                                                                        .ProjectId(projectId)
                                                                        .Headers(customHeaders)
                                                                        .ProjectSettings(projectSettings)
                                                                        .ProjectSettingsColors(projectSettingsColors)
                                                                        .Filter(filter)
                                                                        .DesignDescriptor(cutFillDesign))
                              .SetVolumeCalcType(volumeCalcType)
                              .SetVolumeDesign(volumeDesign)
                              .SetBaseFilter(baseFilter)
                              .SetTopFilter(topFilter)
                              .CreateTileRequest(mode, width, height, bbox, elevationExtents, explicitFilters);

                //TileRequest is both v1 and v2 model so cannot change its validation directly.
                //However for v2 we want to return a transparent empty tile for cut-fill if no design specified.
                //So catch the validation exception for this case.
                try
                {
                    tileRequest.Validate();
                }
                catch (ServiceException se)
                {
                    if (tileRequest.Mode == DisplayMode.CutFill &&
                        se.Code == HttpStatusCode.BadRequest &&
                        se.GetResult.Code == ContractExecutionStatesEnum.ValidationError)
                    {
                        if (
                            se is MissingDesignDescriptorException ||
                            se is TwoFiltersRequiredException ||
                            se is SingleFilterRequiredException)
                        {
                            getTile = false;
                        }
                    }
                    //Rethrow any other exception
                    if (getTile)
                    {
                        throw;
                    }
                }
            }

            TileResult tileResult = null;

            if (getTile)
            {
                try
                {
                    tileResult = await RequestExecutorContainerFactory
                                 .Build <CompactionTileExecutor>(logger,
#if RAPTOR
                                                                 raptorClient,
#endif
                                                                 configStore : ConfigStore, trexCompactionDataProxy : TRexCompactionDataProxy, customHeaders : customHeaders,
                                                                 userId : userId, fileImportProxy : FileImportProxy)
                                 .ProcessAsync(tileRequest) as TileResult;
                }
                catch (Exception ex)
                {
                    log.LogWarning($"Exception: {ex.Message} {ex.StackTrace}");
                }
            }

            return(tileResult?.TileData != null
        ? tileResult
        : TileResult.EmptyTile(WebMercatorProjection.TILE_SIZE, WebMercatorProjection.TILE_SIZE));
        }