Long delay when updating rows of a feature layer or modifying elements of a graphic layer using arcObjects in java

2257
7
11-10-2014 05:52 PM
Highlighted
New Contributor

Dear ESRI developers,

We are developing a simple AddIn for arcMap for the first time using arcObjects in java. The application consists basically on the following steps:

  1. Obtain a Network layer which was loaded in arcMap
  2. Construct a graph using the network layer to run graph algorithms on it
  3. Construct and add a different layer which shows one line for each edge of the graph
  4. When a new calculation is required by the user run the graph algorithm.
  5. Refresh graphically the lines of the new layer according to the graph algorithm results

We are asking for your help because we have computation time problems with the step 5. There are more than 27000 lines or edges. To update the color of the lines representing edges we have tried the following strategies:

  1. Create a Feature layer with polylines, adding a new numerical field with values between 0-10. Assign a ClassBreaksRenderer to this layer. When the user requires a new calculation the numerical field must be updated (27000 updates) so the renderer will use a different color for the lines of the feature layer.
  2. Create a graphic layer with Line elements. Create a collection of Symbols (20 different colors from a ramp). When the user requires a new calculation a new symbol is assigned to the line Elements (27000 assignments) so they will be painted with new colors according to the calculation.

The process A takes almost 3 minutes and the process B takes almost 2 minutes. This is without using any type of parallelization.

Measuring the computation time for the method A the slow action is to update the rows of the FeatureClass (6 milliseconds per feature). I tried the update cursor and the search cursor with similar results.

Measuring the computation time for the method B the slow action is to assign the symbol to the Line element (5 milliseconds per element).

We think the problem is that there are many communications with the arcMap framework. So if you have any idea how this process can be speeded up it would be very helpful. We’d like this refreshing process can be performed as fast as possible… Maybe 10 seconds? Do you think it is possible?

Thank you very much for your help.

Reply
0 Kudos
7 Replies
Highlighted
Regular Contributor

For option A make sure to use a feature buffer when creating a feature class. Look for any ArcObjects Java documentation on IFeatureBuffer (com.esri.arcgis.geodatabase.IFeatureBuffer).

I have not done this in Java but in .Net it is orders of magnitude faster. The 3 minute process will probably take several seconds using a feature buffer.

Reply
0 Kudos
Highlighted
New Contributor

Thank you for your help. Currently I'm deleting all the features and inserting them again using a feature buffer, like this:

                            lines.deleteSearchedRows(null);

                            IFeatureClass featureClass = lines.getFeatureClass();

                            IFeatureCursor cursor = featureClass.IFeatureClass_insert(true);

                            int costIndex = featureClass.findField("Distance");

                            IFeatureBuffer featureBuffer = featureClass.createFeatureBuffer();

                            for(LineInfo lineInfo:coords) {

                                Coord cF = lineInfo.cF;

                                Coord cT = lineInfo.cT;

                                double fCost = cF.equals(c)?0:algo.getCost(cF);

                                double tCost = cT.equals(c)?0:algo.getCost(cT);

                                double cost = (fCost+tCost)/2;

                                featureBuffer.setShapeByRef(lineInfo.p);

                                featureBuffer.setValue(costIndex, cost);

                                cursor.insertFeature(featureBuffer);

                            }

                            cursor.flush();

                            Cleaner.release(cursor);

Where "lines" is the Feature Layer. Do you see a problem with this code? should it be faster? Thank you again

Reply
0 Kudos
Highlighted
Regular Contributor

One thing that I can see is that you should flush the feature buffer at regular intervals. You code is adding all of the features to the feature buffer and then writing them only once at the end of the function.

Try flushing the buffer at regular intervals for example (pseudo code only as I am not too familiar with Java):

int i = 0;

...

for(LineInfo lineInfo:coords) {

    ...

    cursor.insertFeature(featureBuffer);

    c += 1;

    if (c == 100){

          // flush cursor and reset counter

          cursor.flush();

          c = 0;

    }

}

// final flush for remaining features

cursor.flush();

...

Hope this helps.

Reply
0 Kudos
Highlighted
New Contributor

Thank you!

I tested flushing the cursor at different intervals without changes in the total time:

                            int num = 0;

                            JOptionPane.showMessageDialog(jPanel, coords.size()+" links to update");

                            for(LineInfo lineInfo:coords) {

                                Coord cF = lineInfo.cF;

                                Coord cT = lineInfo.cT;

                                double fCost = cF.equals(c)?0:algo.getCost(cF);

                                double tCost = cT.equals(c)?0:algo.getCost(cT);

                                double cost = (fCost+tCost)/2;

                                featureBuffer.setShapeByRef(lineInfo.p);

                                featureBuffer.setValue(costIndex, cost);

                                cursor.insertFeature(featureBuffer);

                                if(++num%100==0)

                                    cursor.flush();

                            }

                            cursor.flush();

                            Cleaner.release(cursor);

Reply
0 Kudos
Highlighted
Regular Contributor

Did you end up getting a reduction in your total processing time?

Reply
0 Kudos
Highlighted
New Contributor

No... I've not gotten any reduction in the processing time... it seems the implementation of the FeatureBuffer in java is not optimized, or it has not been implemented yet?

Reply
0 Kudos
Highlighted
Regular Contributor

I haven't used ArcObjects via Java but I would be very surprised if the FeatureBuffer had not been implemented.

Reply
0 Kudos