Manipulate non-feature class with Geospatial Platform API in Map 3D

By Daniel Du

Firstly what is feature class and non-feature class? Generally speaking, a Feature Class is a class with associated geometry, so that it is possible to create a layer in Map 3D or AIMS. A non-feature class just contains non-spatial data that can be used as a standalone or contained class has not geometry field. Geospatial Plat for API, which uses FDO, can manipulate both feature class and non feature class.

let’s say we have a feature schema as below, which is a SDF data source, there are two classes in the schema, one is feature class with Geometry field, another is non-feature class, just attribute fields.

image

 

If you connect to this data source in Map 3D, you will notice that the non-feature class is gray out as it cannot be added to map as layer.

image

 

Now let’s add some data into this non-feature class with Geospatial platform API. The important thing is to get the resource identifier of the data source, since it is connected to Map 3D and add a layer, I use following code to demo how to get the resource ID:

[CommandMethod("InsertNonFeatureClass")]public void InsertNonFeatureClass(){    const string LAYERNAME = "River";    MgFeatureService featuerSvc = AcMapServiceFactory        .GetService(MgServiceType.FeatureService)         as MgFeatureService;     //This is just for demonstration of the format of FeatureSourceId    AcMapMap currentMap = AcMapMap.GetCurrentMap();    MgLayerBase layer = null;    MgLayerCollection allLayers = currentMap.GetLayers();    foreach (MgLayerBase lyr in allLayers)    {        if (lyr.Name == LAYERNAME)        {            layer = lyr;            break;        }    }    //Just to demonstrate the format of FeatureSource    string resId = layer.FeatureSourceId;    System.Windows.Forms.MessageBox.Show(resId);     //---------------------------    //Library://River.FeatureSource    //---------------------------    //OK       //---------------------------        // Insert into non-feature class    MgResourceIdentifier featureSourceId = new MgResourceIdentifier(resId);                string className = "DefaultSchema:RiverAttributes"; //feature class name    MgPropertyCollection properities = new MgPropertyCollection();                //ID is auto generated    properities.Add(            new MgStringProperty("Name",                                 "Yangzi River"));    properities.Add(            new MgStringProperty("Desciption",                             "The longest river in China"));    MgInsertFeatures insFeature =                 new MgInsertFeatures(className, properities);     MgFeatureCommandCollection commands = new MgFeatureCommandCollection();    commands.Add(insFeature);     featuerSvc.UpdateFeatures(featureSourceId, commands, false); }

 

here is the result in Data table:

image

 

From the code snippet, it is exactly the same as operating a feature class, with feature service. Actually for a feature class has been added to map as layer, there is a simple way, that is :

“Layer.UpdateFeatures() ”

This method actually call underlay feature service to update features. But if you want to update a non-feature class, that does not have a corresponding layer, you have to use the lower lever API – featureService.UpdateFeatures() as demoed in ditto code snippet. Please note that this concept also applies to AIMS as well, The code can be migrated to AIMS with only minor changes.

Hope this helps.


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading