Esempio n. 1
0
 public VectorCache()
 {
     soe_name = "ArcStache";
     logger = new ServerLogger();
     RestResource rootResource = CreateRestSchema();
     SoeRestImpl restImpl = new SoeRestImpl("arcstache", rootResource);
     reqHandler = (IRESTRequestHandler)restImpl;
 }
Esempio n. 2
0
        public VectorCache()
        {
            soe_name = "ArcStache";
            logger   = new ServerLogger();
            RestResource rootResource = CreateRestSchema();
            SoeRestImpl  restImpl     = new SoeRestImpl("arcstache", rootResource);

            reqHandler = (IRESTRequestHandler)restImpl;
        }
 public SampleSOE()
 {
     soe_name = this.GetType().Name;
     logger = new ServerLogger();
     reqHandler = new SoeRestImpl(soe_name, CreateRestSchema()) as IRESTRequestHandler;
 }
 public LayerMetadata()
 {
     _soe_name = this.GetType().Name;
     _logger = new ServerLogger();
     _reqHandler = new SoeRestImpl(_soe_name, CreateRestSchema()) as IRESTRequestHandler;
 }
 public Image_Services_SOE()
 {
     _soename = this.GetType().Name;
     _logger = new ServerLogger();
     reqHandler = new SoeRestImpl(_soename, CreateRestSchema()) as IRESTRequestHandler;
 }
 public NetSimpleRESTSOEWithCapabilities()
 {
     soeName = this.GetType().Name;
     reqHandler = new SoeRestImpl(soeName, CreateRestSchema(), CheckCapabilities) as IRESTRequestHandler;
 }
Esempio n. 7
0
        public void Construct(IPropertySet props)
        {
            try
            {
                logger.LogMessage(ServerLogger.msgType.infoDetailed, "Construct", 8000, "Watershed SOE constructor running");
                object tProperty = null;
                m_CanDoWatershed = true;
                // IPropertySet doesn't have anything like a trygetvalue method
                // so if we don't know if a property will be present we have to just try getting
                // it and if there is an exception assumes it wasn't there
                try {
                    tProperty = props.GetProperty("FlowAccLayer");
                    if (tProperty as string == "None")
                    {
                        logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: Flow accumulation layer set to 'None'. No watershed functionality.");
                        m_CanDoWatershed = false;
                        //throw new ArgumentNullException();
                    }
                    else
                    {
                        m_FlowAccLayerName = tProperty as string;
                        logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: found definition for Flow Accumulation layer: " + m_FlowAccLayerName);
                    }
                }
                catch{
                    logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: Flow accumulation layer not set. No watershed functionality.");
                    m_CanDoWatershed = false;
                    //throw new ArgumentNullException();
                }
                try {
                    tProperty = props.GetProperty("FlowDirLayer");
                    if (tProperty as string == "None")
                    {
                        logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: Flow direction layer set to 'None'. No watershed functionality.");
                        m_CanDoWatershed = false;
                    }
                    else
                    {
                        m_FlowDirLayerName = tProperty as string;
                        logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: found definition for Flow direction layer: " + m_FlowDirLayerName);
                    }
                }
                catch {
                    logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: Flow direction layer not set. No watershed functionality.");
                    m_CanDoWatershed = false;
                }
                try
                {
                    tProperty = props.GetProperty("ExtentFeatureLayer") as string;
                    if (tProperty as string =="None"){
                        logger.LogMessage(ServerLogger.msgType.debug, "Construct", 8000,
                            "WSH: No extent features configured. Extent may still be passed as input");
                    }
                    else
                    {
                        m_ExtentFeatureLayerName = tProperty as string;
                        logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: found definition for Extent Feature layer: " + m_ExtentFeatureLayerName);
                    }
                }
                catch {
                    logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: no definition for extent feature layers found. Extent may still be passed as input");
                }

                try
                {
                    tProperty = props.GetProperty("ReadConfigFromMap");
                    if (tProperty == null || tProperty as string != "False")
                    {
                        m_BuildLayerParamsFromMap = true;
                        logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: layer parameters will be built from map document layers");
                    }

                    else
                    {
                        m_BuildLayerParamsFromMap = false;
                        logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: layer parameters would be read from properties file but this is NOT IMPLEMENTED YET ");
                        // TODO: add code to read in LayerConfiguration parameter and parse it
                    }
                }
                catch
                {
                    m_BuildLayerParamsFromMap = true;
                    logger.LogMessage(ServerLogger.msgType.debug, "Construct", 8000,
                        "WSH: no property found for ReadConfigFromMap; "+
                        "layer parameters will be built from map document layers");
                }
            }
            catch (Exception e)
            {
                logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, "WSH: Properties constructor threw an exception");
                logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, e.Message);
                logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, e.ToString());
                logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, e.TargetSite.Name);
                logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000, e.StackTrace);
            }

            try
            {
                // get the datasets associated with the configured inputs to watershed delineation.
                // Also note the other layers: we will make all others available for extraction
                // but need to note the data type and how the layer name should translate into a REST operation
                // parameter. This information will be stored in an ExtractionLayerConfig opbject for each layer
                // We only need to do this at startup not each time
                IMapServer3 mapServer = (IMapServer3)serverObjectHelper.ServerObject;
                string mapName = mapServer.DefaultMapName;
                IMapLayerInfo layerInfo;
                IMapLayerInfos layerInfos = mapServer.GetServerInfo(mapName).MapLayerInfos;
                ILayerDescriptions layerDescriptions = mapServer.GetServerInfo(mapName).DefaultMapDescription.LayerDescriptions;
                IMapServerDataAccess dataAccess = (IMapServerDataAccess)mapServer;

                int c = layerInfos.Count;
                int acc_layerIndex=0;
                int dir_layerIndex=0;
                int ext_layerIndex=0;
                //Dictionary<int,string> other_layerIndices = new Dictionary<int,string>();
                List<string> tAllParams = new List<string>();
                for (int i=0;i<c;i++)
                {
                    layerInfo = layerInfos.get_Element(i);
                    if(m_CanDoWatershed && layerInfo.Name == m_FlowAccLayerName)
                    {
                        acc_layerIndex = i;
                    }
                    else if (m_CanDoWatershed && layerInfo.Name == m_FlowDirLayerName)
                    {
                        dir_layerIndex = i;
                    }
                    else if (m_CanDoWatershed && m_ExtentFeatureLayerName != null && layerInfo.Name == m_ExtentFeatureLayerName)
                    {
                        ext_layerIndex = i;
                    }
                    else if (m_BuildLayerParamsFromMap)
                    // note the else if is deliberately arranged so that layers used for watershed extraction
                    // won't be exposed as extractable
                    {
                        // Types appear to be "Raster Layer", "Feature Layer", and "Group Layer"
                        logger.LogMessage(ServerLogger.msgType.debug,
                            "Construct", 8000,
                            "WSH: processing extractable map layer " + layerInfo.Name + " at ID " +
                            layerInfo.ID + " of type " + layerInfo.Type);

                        if (layerInfo.Type == "Raster Layer" || layerInfo.Type == "Feature Layer")
                        {
                            string tName = layerInfo.Name;
                            string tDesc = layerInfo.Description;
                            if (tName.IndexOf(':') == -1 && tDesc.IndexOf(':') == -1)
                            {
                                // fail if any of the map layers except the ones used for the catchment definition
                                // don't have a name or description starting with 6 or less characters followed by :
                                logger.LogMessage(ServerLogger.msgType.error, "Construct", 8000,
                                     " Watershed SOE warning: could determine output parameter string for layer " + tName +
                                     " and it will not be available for extraction. " +
                                     " Ensure that either the layer name or description starts with an ID for the " +
                                     " service parameter name to be exposed, max 6 characters and separated by ':'" +
                                     " e.g. 'LCM2K:Land Cover Map 2000'");
                                continue;
                            }
                            else if (tName.IndexOf(':') > 5 && tDesc.IndexOf(':') > 5)
                            {
                                logger.LogMessage(ServerLogger.msgType.error, "Construct", 8000,
                                     " Watershed SOE warning: read output parameter string for layer " + tName +
                                     " but it was too long." +
                                     " Ensure that either the layer name or description starts with an ID for the " +
                                     " service parameter name to be exposed, max 6 characters and separated by ':'" +
                                     " e.g. 'LCM2K:Land Cover Map 2000'. Layer will not be available for extraction.");
                                continue;
                            }
                            string tParamName;
                            string tProcessedName;
                            if (tName.IndexOf(':') != -1)
                            {
                                tParamName = tName.Substring(0, tName.IndexOf(':'));
                                tProcessedName = tName.Substring(tName.IndexOf(':')+1).Trim();
                            }
                            else
                            {
                                tParamName = tDesc.Substring(0, tDesc.IndexOf(':'));
                                tProcessedName = tName.Trim();
                            }
                            if (tAllParams.Contains(tParamName))
                            {
                                logger.LogMessage(ServerLogger.msgType.error,"Construct",800,
                                    "Watershed SOE warning: duplicate parameter name found for layer "+tName +
                                    "(parameter "+tParamName+" is set on another map layer). Layer will not be available"+
                                    " for extraction.");
                                continue;
                            }
                            else{
                                tAllParams.Add(tParamName);
                            }
                            string tDescription = "";
                            if (layerInfo.Description.Length > 0)
                            {
                                if (layerInfo.Description.IndexOf(':') == -1)
                                {
                                    tDescription = layerInfo.Description.Trim();
                                }
                                else if (layerInfo.Description.IndexOf(':') < 6)
                                {
                                    tDescription = layerInfo.Description.Substring(layerInfo.Description.IndexOf(':') + 1).Trim();
                                }
                                else
                                {
                                    tDescription = layerInfo.Description.Trim();
                                }
                            }

                            ExtractionTypes tExtractionType = ExtractionTypes.Ignore;
                            if (layerInfo.Type == "Raster Layer")
                            {
                                // determine whether we will summarise the raster layer "categorically"
                                // i.e. a count of each value, or "continuously" i.e. min/max/avg statistics
                                // based on how the raster is symbolised in the map and whether or not
                                // it is of integer type

                                // TODO : Also store the labels for classes in categorical rasters
                                // so that these can be returned by the SOE to the client
                                // Cast the renderer to ILegendInfo, get ILegendGroup from it and each
                                // ILegendClass from that to get the string Label

                                // Get renderer
                                // THIS ONLY WORKS WITH MXD SERVICES: WE CANNOT DO THIS ON AN MSD BASED SERVICE
                                IMapServerObjects3 tMapServerObjects = mapServer as IMapServerObjects3;
                                ILayer tLayer = tMapServerObjects.get_Layer(mapName, i);
                                IRasterLayer tRasterLayer = (IRasterLayer)tLayer;
                                IRasterRenderer tRasterRenderer = tRasterLayer.Renderer;
                                // Get raster data
                                IRaster tRaster = dataAccess.GetDataSource(mapName, i) as IRaster;
                                IRasterProps tRasterProps = tRaster as IRasterProps;
                                IGeoDataset tRasterGDS = tRaster as IGeoDataset;

                                bool tTreatAsCategorical = false;
                                if (tRasterRenderer is RasterUniqueValueRenderer)
                                {
                                    logger.LogMessage(ServerLogger.msgType.debug, "Construct", 800,
                                   "Raster layer " + tName +
                                   "is symbolised by unique values - treating layer as categorical");
                                    tTreatAsCategorical = tRasterProps.IsInteger;
                                }
                                else if (tRasterRenderer is RasterDiscreteColorRenderer)
                                {
                                    logger.LogMessage(ServerLogger.msgType.debug, "Construct", 800,
                                   "Raster layer " + tName +
                                   "is symbolised by discrete colours - treating layer as categorical");
                                    tTreatAsCategorical = tRasterProps.IsInteger;
                                }
                                else if (tRasterRenderer is RasterClassifyColorRampRenderer)
                                {
                                    // TODO - treat a classified colour ramp as categorical but categories
                                    // determined by classes rather than unique values... needs the summary
                                    // method to have access to the class breaks
                                    logger.LogMessage(ServerLogger.msgType.debug, "Construct", 800,
                                   "Raster layer " + tName +
                                   "is symbolised by classified groups - treating layer as continuous");
                                }
                                else if (tRasterRenderer is RasterStretchColorRampRenderer)
                                {
                                    logger.LogMessage(ServerLogger.msgType.debug, "Construct", 800,
                                   "Raster layer " + tName +
                                   "is symbolised by colour stretch - treating layer as continuous");
                                }
                                else
                                {
                                    logger.LogMessage(ServerLogger.msgType.debug, "Construct", 800,
                                   "Raster layer " + tName +
                                   "is symbolised with unsupported renderer - treating as continuous");
                                }
                                tExtractionType = tTreatAsCategorical?
                                    ExtractionTypes.CategoricalRaster:
                                    ExtractionTypes.ContinuousRaster;
                                ExtractionLayerConfig tLayerInfo = new ExtractionLayerConfig
                                    (i, tProcessedName,tDescription,tExtractionType, tParamName, -1, -1, -1,tRasterGDS);
                                m_ExtractableParams.Add(tLayerInfo);
                            }
                            else
                            {
                                // Feature class layer
                                // TODO - Get the category / values from the symbology (renderer) as for rasters

                                IFeatureClass tFC = dataAccess.GetDataSource(mapName, i) as IFeatureClass;
                                IGeoDataset tFeatureGDS = tFC as IGeoDataset;
                                esriGeometryType tFCType = tFC.ShapeType;
                                if (tFCType == esriGeometryType.esriGeometryPoint || tFCType == esriGeometryType.esriGeometryMultipoint)
                                {
                                    tExtractionType = ExtractionTypes.PointFeatures;
                                }
                                else if (tFCType == esriGeometryType.esriGeometryPolyline || tFCType == esriGeometryType.esriGeometryLine)
                                {
                                    tExtractionType = ExtractionTypes.LineFeatures;
                                }
                                else if (tFCType == esriGeometryType.esriGeometryPolygon)
                                {
                                    tExtractionType = ExtractionTypes.PolygonFeatures;
                                }
                                int tCategoryField = layerInfo.Fields.FindFieldByAliasName("CATEGORY");
                                int tValueField = layerInfo.Fields.FindFieldByAliasName("VALUE");
                                int tMeasureField = layerInfo.Fields.FindFieldByAliasName("MEASURE");
                                ExtractionLayerConfig tLayerInfo = new ExtractionLayerConfig
                                    (i,tProcessedName,tDescription, tExtractionType, tParamName, tCategoryField, tValueField, tMeasureField,tFeatureGDS);
                                m_ExtractableParams.Add(tLayerInfo);
                                // layers with any other geometry type will be ignored
                            }
                        }
                    }
                    else
                    {
                        logger.LogMessage(ServerLogger.msgType.infoStandard, "Construct", 8000,
                            "WSH: Code to build layer params from properties is not implemented. No extractable"+
                            "params will be available.");
                    }
                }
                IRaster tFDR = dataAccess.GetDataSource(mapName,dir_layerIndex) as IRaster;
                m_FlowDirDataset =  tFDR as IGeoDataset;
                IRaster tFAR = dataAccess.GetDataSource(mapName,acc_layerIndex) as IRaster;
                m_FlowAccDataset = tFAR as IGeoDataset;
                if(m_FlowDirDataset == null || m_FlowAccDataset == null)
                {
                    logger.LogMessage(ServerLogger.msgType.error,"Construct", 8000,"Watershed SOE Error: layer not found");
                    m_CanDoWatershed = false;
                   // return;
                }
                else
                {
                    m_CanDoWatershed = true;
                }
                if (ext_layerIndex != 0)
                {
                    m_ExtentFeatureDataset = dataAccess.GetDataSource(mapName, ext_layerIndex) as IGeoDataset;
                }
            }
            catch (Exception e)
            {
                logger.LogMessage(ServerLogger.msgType.error,"Construct",8000,"Watershed SOE error: could not get the datasets associated with configured map layers."+
                    "Exception: "+e.Message+e.Source+e.StackTrace+e.TargetSite);
            }
            try
            {
                reqHandler = new SoeRestImpl(soe_name, CreateRestSchema()) as IRESTRequestHandler;
            }
            catch (Exception e)
            {
                logger.LogMessage(ServerLogger.msgType.error, "Construct", 8000, "WSH: could not create REST schema. Exception: "+e.Message+ " "+e.Source+" "+e.StackTrace+" "+e.TargetSite);

            }
        }
 public NetFindNearFeaturesRESTSOE()
 {
     soeName = this.GetType().Name;
     reqHandler = new SoeRestImpl(soeName, CreateRestSchema()) as IRESTRequestHandler;
 }
 public NetSimpleRESTSOEWithProperties()
 {
     soeName = this.GetType().Name;
     reqHandler = new SoeRestImpl(soeName, CreateRestSchema()) as IRESTRequestHandler;
 }
 public InternationalWaterbirdCensusExtensions()
 {
     soe_name = this.GetType().Name;
     logger = new ServerLogger();
     reqHandler = new SoeRestImpl(soe_name, CreateRestSchema()) as IRESTRequestHandler;
 }
 public ISSOERasterAccess()
 {
     _soename = this.GetType().Name;
     _logger = new ServerLogger();
     _reqHandler = new SoeRestImpl(_soename, CreateRestSchema()) as IRESTRequestHandler;            
 }
Esempio n. 12
0
 public virtual void Shutdown()
 {
     LogInfo(m_soeName + " shutting down");
     m_soeName = null;
     m_serverObjectHelper = null;
     m_logger = null;
     m_reqHandler = null;
 }
Esempio n. 13
0
 public FieldScopeSOE()
 {
     m_soeName = this.GetType().Name;
     m_reqHandler = new SoeRestImpl(m_soeName, CreateRestSchema()) as IRESTRequestHandler;
 }
Esempio n. 14
0
 public wri_soe()
 {
     _soeName = GetType().Name;
     _logger = new ServerLogger();
     _reqHandler = new SoeRestImpl(_soeName, CreateRestSchema());
 }