public VectorCache() { soe_name = "ArcStache"; logger = new ServerLogger(); RestResource rootResource = CreateRestSchema(); SoeRestImpl restImpl = new SoeRestImpl("arcstache", rootResource); reqHandler = (IRESTRequestHandler)restImpl; }
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; }
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; }
public virtual void Shutdown() { LogInfo(m_soeName + " shutting down"); m_soeName = null; m_serverObjectHelper = null; m_logger = null; m_reqHandler = null; }
public FieldScopeSOE() { m_soeName = this.GetType().Name; m_reqHandler = new SoeRestImpl(m_soeName, CreateRestSchema()) as IRESTRequestHandler; }
public wri_soe() { _soeName = GetType().Name; _logger = new ServerLogger(); _reqHandler = new SoeRestImpl(_soeName, CreateRestSchema()); }