MikeEber

How to define an Output Feature when the data is double

Discussion created by MikeEber on Dec 6, 2013
I had logic in place that returned a collection of PolyLines as the output feature. However the call we make is returning multiple polylines for a single set of points. I'm changing it now so that it sums the results and returns only a length of type double for each set of points. (which actually makes returning place holders for failed calls easier)

When I go to establish my output cursor I get a null object exception. So the way I defined it is wrong. Here is how I'm defining it:

        IArray parameters = new ArrayClass();

        IGPParameterEdit3 inputPoint =
          GPUtilities.CreatePointRecordsetParameterEdit("StationPoint", "Station Point", "Standard_Point",
          esriGPParameterDirection.esriGPParameterDirectionInput,
          esriGPParameterType.esriGPParameterTypeRequired, new GPFeatureRecordSetLayerTypeClass(), true);
        parameters.Add(inputPoint);
        IGPParameterEdit3 targetPoints =
        GPUtilities.CreatePointRecordsetParameterEdit("TargetList", "Target List", "Standard_Point",
          esriGPParameterDirection.esriGPParameterDirectionInput,
          esriGPParameterType.esriGPParameterTypeRequired, new GPFeatureRecordSetLayerTypeClass(), true);
        parameters.Add(targetPoints);
        //    The original output parameter setting code
        //IGPParameterEdit3 outputPoints =
        //    GPUtilities.CreatePolylineRecordsetParameterEdit("OutputList", "Output List", "Standard_Polyline",
        //        esriGPParameterDirection.esriGPParameterDirectionOutput,
        //        esriGPParameterType.esriGPParameterTypeDerived, new GPFeatureRecordSetLayerTypeClass(), true);
        IGPParameterEdit3 outputValues = new GPParameterClass();
        outputValues.DataType = new GPFeatureRecordSetLayerTypeClass();
        outputValues.Value = new DEFeatureClassClass();
        outputValues.Direction = esriGPParameterDirection.esriGPParameterDirectionOutput;
        outputValues.DisplayName = "Output Lengths";
        outputValues.Name = "OutputLengths";
        outputValues.ParameterType = esriGPParameterType.esriGPParameterTypeDerived;
        IGPFeatureSchema outputSchema = new GPFeatureSchemaClass();
        IGPSchema schema = (IGPSchema)outputSchema;
        schema.CloneDependency = true;
        outputValues.Schema = outputSchema as IGPSchema;
        outputValues.AddDependency("StationPoint");
        outputValues.AddDependency("TargetList");
        parameters.Add(outputValues);
        return parameters;


I'm also not sure if I'm setting the buffer correctly either. Here is how I'm handling the accumulation and setting of the return values:


            double distanceCompute = 0;
            for (int subindex = 0; subindex < result.GeometryCount; subindex++)
            {
                 Polyline data = (Polyline) result.Geometry[subindex];
                 IPolyline idata = (IPolyline) data;
                 distanceCompute += idata.Length;
            }
            messages.AddMessage(String.Format("Saving distance of {0} as new feature for target {1}.", distanceCompute, index));
            IFeatureBuffer featureBuffer = outputClass.CreateFeatureBuffer();
            IFeatureCursor cursor = outputClass.Insert(true);
            featureBuffer.set_Value(0, distanceCompute);
            cursor.InsertFeature(featureBuffer);
            cursor.Flush();
            Marshal.FinalReleaseComObject(cursor);


The sooner I can get this fixed the better. :)

Thanks a ton everyone.

Outcomes