/// <summary>
        /// Method collects information from solve request data for planned date and
        /// builds request object.
        /// </summary>
        /// <param name="data">Required data to get information from.</param>
        /// <exception cref="T:System.ArgumentNullException">
        /// <paramref name="data"/> is null reference.</exception>
        /// <returns>Request object with filled information for request.</returns>
        public SubmitDiscoveryRequest BuildRequest(DiscoveryRequestData data)
        {
            // Validate inputs.
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            // Build request object.
            SubmitDiscoveryRequest req = new SubmitDiscoveryRequest();

            if (data.RegionPoint != null)
            {
                int wkid = data.MapExtent.SpatialReference.WKID;

                // Get depot point converted with correct spatial reference.
                Point   depotPoint = (Point)data.RegionPoint;
                Point   wmPoint    = WebMercatorUtil.ProjectPointToWebMercator(depotPoint, wkid);
                GPPoint gpPoint    = GPObjectHelper.PointToGPPoint(wmPoint);
                gpPoint.SpatialReference = new GPSpatialReference(wkid);

                // Fill required options.
                req.Geometry         = gpPoint;
                req.GeometryType     = NAGeometryType.esriGeometryPoint;
                req.SpatialReference = wkid;
                req.ResponseFormat   = NAOutputFormat.JSON;
                req.Layers           = NAIdentifyOperationLayers.AllLayers;
                req.Tolerance        = DEFAULT_TOLERANCE;

                req.ImageDisplay = _GetImageDisplayParameter(data.MapExtent);

                req.MapExtent = string.Format(MAP_EXTENT_PARAMETER_FORMAT, data.MapExtent.XMin,
                                              data.MapExtent.YMin, data.MapExtent.XMax, data.MapExtent.YMax);

                // Do not return geometry to optimize request.
                req.ReturnGeometry = false;
                req.ReturnZ        = false;
                req.ReturnM        = false;

                // Fill non-required options.
                req.LayerDefinitions   = string.Empty;
                req.Time               = string.Empty;
                req.LayerTimeOptions   = string.Empty;
                req.MaxAllowableOffset = string.Empty;
                req.DynamicLayers      = string.Empty;
            }

            return(req);
        }
        /// <summary>
        /// Fixes VRP tool names with correct regional info.
        /// </summary>
        /// <param name="schedule">Current schedule, which is used for routing operation.</param>
        private void _FixRegionalRoutingToolsInfo(Schedule schedule)
        {
            Debug.Assert(schedule != null);

            // Get point at which routes region will be detected.
            var currentRegionPoint = DiscoveryRequestBuilder.GetPointForRegionRequest(schedule.Routes);

            // If region point hasn't been changed - do nothing.
            if (_lastRegionPoint == currentRegionPoint)
            {
                return;
            }

            // Remember current point as last checked point.
            _lastRegionPoint = currentRegionPoint;

            // Detect current region name to create VRP service.
            var builder = new DiscoveryRequestBuilder();

            // Build discovery request.
            var reqData = new DiscoveryRequestData();

            reqData.RegionPoint = currentRegionPoint;
            reqData.MapExtent   = _discoveryService.GetFullMapExtent(
                DiscoveryRequestBuilder.JsonTypes);
            var discoveryRequest = builder.BuildRequest(reqData);

            // Make discovery request to get current Region name.
            string regionName = _discoveryService.GetRegionName(discoveryRequest,
                                                                DiscoveryRequestBuilder.JsonTypes);

            // Do nothing in case region name is empty.
            if (string.IsNullOrEmpty(regionName))
            {
                return;
            }

            // If operation call for new region, we need to reinitialize context.
            if (regionName != _currentRegionName)
            {
                _isContextInited = false;
            }

            _currentRegionName = regionName;

            // Fix route service config with new region name.
            _routeServiceConfig.LayerName =
                _GetRegionalLayerName(_routeServiceConfig.LayerName, regionName);
        }
        /// <summary>
        /// Method collects information from solve request data for planned date and
        /// builds request object.
        /// </summary>
        /// <param name="data">Required data to get information from.</param>
        /// <exception cref="T:System.ArgumentNullException">
        /// <paramref name="data"/> is null reference.</exception>
        /// <returns>Request object with filled information for request.</returns>
        public SubmitDiscoveryRequest BuildRequest(DiscoveryRequestData data)
        {
            // Validate inputs.
            if (data == null)
                throw new ArgumentNullException("data");

            // Build request object.
            SubmitDiscoveryRequest req = new SubmitDiscoveryRequest();

            if (data.RegionPoint != null)
            {
                int wkid = data.MapExtent.SpatialReference.WKID;

                // Get depot point converted with correct spatial reference.
                Point depotPoint = (Point)data.RegionPoint;
                Point wmPoint = WebMercatorUtil.ProjectPointToWebMercator(depotPoint, wkid);
                GPPoint gpPoint = GPObjectHelper.PointToGPPoint(wmPoint);
                gpPoint.SpatialReference = new GPSpatialReference(wkid);

                // Fill required options.
                req.Geometry = gpPoint;
                req.GeometryType = NAGeometryType.esriGeometryPoint;
                req.SpatialReference = wkid;
                req.ResponseFormat = NAOutputFormat.JSON;
                req.Layers = NAIdentifyOperationLayers.AllLayers;
                req.Tolerance = DEFAULT_TOLERANCE;

                req.ImageDisplay = _GetImageDisplayParameter(data.MapExtent);

                req.MapExtent = string.Format(MAP_EXTENT_PARAMETER_FORMAT, data.MapExtent.XMin,
                    data.MapExtent.YMin, data.MapExtent.XMax, data.MapExtent.YMax);

                // Do not return geometry to optimize request.
                req.ReturnGeometry = false;
                req.ReturnZ = false;
                req.ReturnM = false;

                // Fill non-required options.
                req.LayerDefinitions = string.Empty;
                req.Time = string.Empty;
                req.LayerTimeOptions = string.Empty;
                req.MaxAllowableOffset = string.Empty;
                req.DynamicLayers = string.Empty;
            }

            return req;
        }