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.