Thank you Jackie! This is very helpful. Now I’m getting and Exception when executing the ISelect. I think it is because lyr.GetFeatureGeometryName() returns an empty string. [cid:image002.png@01D99F56.364B5210]
From: mapguide-users <mapguide-users-boun...@lists.osgeo.org> On Behalf Of Jackie Ng Sent: Wednesday, June 14, 2023 6:45 AM To: mapguide-users@lists.osgeo.org Subject: Re: [mapguide-users] Resample or Clip expression for WMS connection CAUTION: This email originated from outside the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe. Actually you're not too far off. You use the expression capabilities as a programmatic way to answer the question of "What functions I can use for expressions against this particular FDO provider?" by checking if your function of interest (CLIP) is in the collection of supported functions. If you know in your code that the feature source in question is always pointing to a WMS connection, then you know (from the provider documentation) that CLIP() is supported and you can bypass this capability check. Otherwise, you would use the various capabilities from the root IConnection to ask questions of what this connection can or cannot do. As for what to do with the command. your CreateCommand call is close, but you are actually supposed to cast that ICommand down to a derived command interface. The ICommand interface itself is pretty barebones and not something you'll ever use directly. The CommandType enum you're passing in is the hint as to what command interface you're actually supposed to cast to. CommandType.CommandType_Select -> cast the result to ISelect CommandType.CommandType_DescribeSchema -> cast the result to IDescribeSchema CommandType.CommandType_SelectAggregates -> cast the result to ISelectAggregates etc, etc. Here's a snippet adapted from the "FDO Cookbook - Select Data" example from that devguide link that gives a rough idea of what you're supposed to do once you've created a select command: // The MgLayerBase has the name of the feature class Identifier className = new Identifier(lyr.GetFeatureClassName()); // Make the select command ISelect select = conn.CreateCommand(CommandType.CommandType_Select) as ISelect; // Set the name of the feature class this select command is querying from select.FeatureClassName = className; // The MgLayerBase also knows the name of the designated geometry/raster property for the layer, which you need to know for the first argument of CLIP() // note the name "clipped_raster", which is our alias for this computed property ComputedIdentifier computedId = Expression.Parse($"CLIP({lyr.GetFeatureGeometryName()}, {minX}, {minY}, {maxX}, {maxY}) AS clipped_raster") as ComputedIdentifier; // Add this computed property to the select command select.PropertyNames.Add(computedId); // Execute the command IFeatureReader reader = select.Execute(); // You need to advance the reader in order to get data out of it try { while (reader.ReadNext()) { // Access the raster by the computed alias name var raster = reader.GetRaster("clipped_raster"); // TODO: Do something with the raster data } } finally { // Always close the feature readers afterwards when done. Putting this in the finally section of // a try/finally block ensures this always happens (regardless of exceptions thrown in the try block) reader.Close(); } You'll need to provide your own minX, minY, maxX, maxY values for the CLIP() function call. Hope that helps. - Jackie You wrote: I am using Autodesk Civil 3D/Map 3D (contains a MapGuide component) and I need to create a custom command to clip or resample raster image via WMS connection. I am a C# developer. I see the appropriate expression capabilities listed here, but I cannot find any examples how to apply these expressions to the WMS connection. FDO Developer's Guide: FDO Provider for WMS Capabilities (autodesk.com)<http://docs.autodesk.com/MAP/2014/ENU/Developer_Guides/index.html> Can anyone provide an example on how to use expressions? This is what I have so far, but don’t feel like I’m close. using Autodesk.Gis.Map.Platform; using OSGeo.FDO.Commands; using OSGeo.FDO.Connections; using OSGeo.FDO.Connections.Capabilities; using OSGeo.FDO.Expression; using OSGeo.MapGuide; namespace MapServices { public class WmsLayer { public static void ClipMapLayer(string layerName) { AcMapFeatureService fs = AcMapServiceFactory.GetService(MgServiceType.FeatureService) as AcMapFeatureService; //Get the current Map. AcMapMap currentMap = AcMapMap.GetCurrentMap(); //Get the collecton of Map 3D layers MgLayerCollection layers = currentMap.GetLayers(); if (layers.Contains(layerName)) //Make sure the specified Map 3D layer exists { //Get the specified Map 3D layer with the Raster image. MgLayerBase lyr = layers.GetItem(layerName); //Get the resource identifier MgResourceIdentifier identifier = new MgResourceIdentifier(lyr.FeatureSourceId); //Get the FDO connection from the resource IConnection con = fs.GetFdoConnection(identifier); //I can get the Expression capabilities from the connection, but what do I do with that?? IExpressionCapabilities expCaps = con.ExpressionCapabilities; ExpressionType[] types = expCaps.ExpressionTypes; FunctionDefinitionCollection funcs = expCaps.Functions; //Is this how to create the expression? //How do I pass the inputs into the expression? //How is a BLOB created from the raster? Expression wmsCmd = Expression.Parse("CLIP(raster, minX, minY, maxX, maxY)"); //Do I somehow pass the expression into an ICommand??? No idea what command type is correct. ICommand cmd = con.CreateCommand(CommandType.CommandType_Select); } } } } Thank you for your assistance! Keith Sowinski, P.E. Civil 3D Implementation Engineer Methods Development Unit WisDOT Bureau of Project Development Office: (920) 492-4132 wisconsindot.gov<http://wisconsindot.gov/> -- Please Note: I no longer create new posts or post replies to any OSGeo mailing list through nabble. As a result, you most likely won't see this message appear on nabble's view of any OSGeo mailing list and may only see this message through mailing list archives or depending on your mailing list subscription settings, through daily message digests or automated notifications from the mailing lists.
_______________________________________________ mapguide-users mailing list mapguide-users@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/mapguide-users